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

Posted

技术标签:

【中文标题】如何在 DataTable 中搜索特定记录?【英文标题】:how to search DataTable for specific record? 【发布时间】:2013-06-26 08:17:34 【问题描述】:

嗨,

我有一个包含 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

但无法编译...

请问正确和最好的方法是什么?

谢谢

菲利普

【问题讨论】:

【参考方案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)

顺便说一句,您分配了两次电话号码。

【讨论】:

@Time:感谢您的帮助,但我如何让第一行编译 - 它说 'Where' 变量未标定并且 'row' 变量未声明。我在 VB.NET Winforms 中使用 .NET 3.5 @Time: 感谢您的帮助,但是(在添加了对 **System.Data.DataSetExtensions ** 的正确引用之后)我在行 If matches.Any() 上收到此错误 Public member 'Any' on type 'EnumerableRowCollection(Of VB$AnonymousType_0(Of DataRow,String))' not found. ... 如何我可以解决这个问题吗 你必须添加Using System.Linq,如果你已经升级到3.5你可能需要添加对System.Core.dll的引用。 我添加了参考,并在我的程序中输入了Using System.Linq。在我的程序结束时,我输入了End Using。但是我得到一个编译错误System.Linq 是一个命名空间,不能用作表达式。请问我该如何解决? 您不必在用于处理对象的方法中添加 using。抱歉,我在这里混合了 C# 和 VB.NET。在 VB 中,它是文件顶部的 Imports System.Linq。【参考方案2】:

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

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

【讨论】:

谢谢,它可以工作,但是使用dtBranches 的组合框在运行Select 命令后是空的。如何重置它以使组合框不受影响? 此代码不应以任何方式影响组合。在 dtBranches 上使用 Select 不会更改表的内容。您确定没有其他代码更改 dtBranches 表内容吗? 谢谢,我在填充代码末尾使用 Reset 来删除过滤器 - 现在我正在执行 dtBranches.Select("")

以上是关于如何在 DataTable 中搜索特定记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle SQL 中搜索特定的 XML 值?

如何在子目录中搜索特定文件?

如何在jtree中搜索特定节点并使该节点展开。?

如何在Lucene中搜索特定范围内的词

如何在表中的 JSON 数据中搜索特定数据

如何在 MySQL 数据库中搜索特定列名? [复制]