vb.net
  • winforms
  • datatable
  • datarow
  • 2013-06-28 95 views 2 likes 
    2

    嗨,如何搜索DataTable的具體記錄?

    我有一個Windows窗體有10個文本字段和1個組合框。

    當用戶在組合框中選擇一條記錄時,我想在我的表單數據變量變量(名爲dtBranches)中找到該記錄,然後填充數據行中的10個文本字段。

    我嘗試這樣做:

    Dim dr As System.Data.DataRow 
    If mSortCode > 0 Then 
        dr = dtBranches.Select("SortCode='" & mSortCode & "'") 
        Me.txtBranch.Text = dr("Branch").ToString() 
        Me.txtBankName.Text = dr("BankName").ToString() 
        Me.txtBranchTitle.Text = dr("BranchTitle").ToString() 
        Me.txtReference.Text = dr("Ref").ToString 
        Me.txtAddr1.Text = dr("Address1").ToString 
        Me.txtAddr2.Text = dr("Address2").ToString 
        Me.txtAddr3.Text = dr("Address3").ToString 
        Me.txtPostCode.Text = dr("PostCode").ToString 
        Me.txtTelNo.Text = dr("TelephoneNumber").ToString 
        Me.txtTown.Text = dr("Town").ToString 
        Me.txtTelNo.Text = dr("TelephoneNumber").ToString 
    end if 
    

    ,但不能讓它編譯...

    什麼是做到這一點,請正確的和最佳的方法是什麼?

    感謝

    菲利普

    回答

    6

    DataTable.Select返回數據行的陣列。你需要聲明一個數組要接收結果

    Dim dr() As System.Data.DataRow 
    

    當然,你需要檢查,如果你有行返回和數組中討論的第一行

    dr = dtBranches.Select("SortCode='" & mSortCode & "'") 
    If dr.Length > 0 Then 
        Me.txtBranch.Text = dr(0)("Branch").ToString() 
        Me.txtBankName.Text = dr(0)("BankName").ToString() 
        ...... and so on ... 
    
    +0

    感謝,它的工作原理,但運行'Select'命令後,使用'dtBranches'的組合框爲空。如何重置它,以便組合框不受影響? –

    +0

    此代碼不應以任何方式影響組合。在dtBranches上使用選擇不會更改表格的內容。你確定沒有改變dtBranches表格內容的其他代碼嗎? – Steve

    +0

    謝謝,我在我的填充代碼的末尾使用'Reset'來刪除過濾器 - 現在我在做** dtBranches.Select(「」)** –

    1

    我會用Linq-ToDataSet和強類型Field方法代替:

    Dim matches = From row In dtBranches 
           Let SortCode = row.Field(Of String)("SortCode") 
           Where SortCode = mSortCode 
    If matches.Any() Then 
        Dim row = matches.First() 
        Me.txtBranch.Text = row.Field(Of String)("Branch") 
        Me.txtBankName.Text = row.Field(Of String)("BankName") 
        Me.txtBranchTitle.Text = row.Field(Of String)("BranchTitle") 
        Me.txtReference.Text = row.Field(Of String)("Ref") 
        Me.txtAddr1.Text = row.Field(Of String)("Address1") 
        Me.txtAddr2.Text = row.Field(Of String)("Address2") 
        Me.txtAddr3.Text = row.Field(Of String)("Address3") 
        Me.txtPostCode.Text = row.Field(Of String)("PostCode") 
        Me.txtTelNo.Text = row.Field(Of String)("TelephoneNumber") 
        Me.txtTown.Text = row.Field(Of String)("Town") 
    Else 
        MesageBox.Show("SortCode not found.") 
    End If 
    

    如果你想不區分大小寫的情況下比較,更換Where上面:

    Where StringComparer.OrdinalIgnoreCase.Equals(SortCode, mSortCode) 
    

    順便說一下,您正在分配電話號碼兩次。

    +0

    @Time:感謝您的幫助,但是我怎麼得到第一行編譯 - 它說'Where'變量沒有被decalred,'row'變量沒有被聲明。我在VB.NET中使用.NET 3.5 Winforms –

    +0

    @Time:感謝您的幫助,但是(在向** System.Data.DataSetExtensions **添加正確的引用之後)我得到這個錯誤'Public member'Any'on type' EnumerableRowCollection(VB $ AnonymousType_0(Of DataRow,String))'not found.'就行'If matches.Any()'...我該如何解決該問題 –

    +1

    您必須添加'Using System.Linq',如果您已升級到3.5,則可能需要添加對「System.Core.dll」的引用。 –

    相關問題