如何在 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 中搜索特定记录?的主要内容,如果未能解决你的问题,请参考以下文章