如何在DataTable中搜索特定的记录?

7

你好,

我有一个包含10个文本框和1个组合框的Windows表单。

当用户在组合框中选择一条记录时,我想在我的表单数据表变量(名为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

但是无法将其编译...

请问正确且最佳的方法是什么?

谢谢。

Philip

2个回答

11

DataTable.Select返回一个DataRow数组。您需要声明一个数组来接收结果。

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 ...

谢谢,它可以工作了,但在运行“Select”命令后,使用“dtBranches”的组合框为空。如何重置它,使组合框不受影响? - Our Man in Bananas
这段代码不应以任何方式影响组合框。在 dtBranches 上使用 Select 不会更改表格的内容。您确定没有其他更改 dtBranches 表格内容的代码吗? - Steve
谢谢,我之前在我的填充代码末尾使用了 Reset 来移除过滤器 - 现在我改为使用 **dtBranches.Select("")**。 - Our Man in Bananas

2
我会使用 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)

顺便提一下,你将电话号码分配了两次。

@时间:感谢您的帮助,但是我该如何让第一行编译通过——它显示“Where”变量未声明和“row”变量未声明。我正在使用VB.NET Winforms中的.NET 3.5。 - Our Man in Bananas
@时间:感谢您的帮助,但是(在添加正确的引用到 System.Data.DataSetExtensions 后),我在这一行代码上遇到了错误 Public member 'Any' on type 'EnumerableRowCollection(Of VB$AnonymousType_0(Of DataRow,String))' not found.,请问我该如何修复它? - Our Man in Bananas
1
如果您已升级到3.5版本,您需要添加对System.Core.dll的引用。同时,您还需要添加Using System.Linq - Tim Schmelter
我添加了引用,在我的程序中加入了Using System.Linq。在我的过程的结尾处,我加入了 End Using。但是我收到了编译错误的信息 System.Linq是命名空间,不能用作表达式。请问我该如何解决这个问题? - Our Man in Bananas
1
您不需要在用于处理对象的方法中添加using语句。抱歉,我这里混淆了C#和VB.NET。在VB中,它是在文件顶部使用Imports System.Linq。 - Tim Schmelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接