vb.net
  • winforms
  • datatable
  • datarow
  • 2013-06-28 46 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”的引用。 –

    相关问题