如何使用文本框搜索datagridview中的列?我正在使用vb.net 2010.我有一个带有数据源的Datagridview。下面是我填充datagridview的代码。 gridview将有4列。
Private Sub LoadProducts()
Dim CS As String = ConfigurationManager.ConnectionStrings("HRMS.My.MySettings.ResortDBConnectionString").ConnectionString
Using con As SqlConnection = New SqlConnection(CS)
Dim da As SqlDataAdapter = New SqlDataAdapter("sp_NET_GetProducts_CompanyID", con)
da.SelectCommand.CommandType = CommandType.StoredProcedure
da.SelectCommand.Parameters.AddWithValue("@CompanyID", CInt(ConfigurationManager.AppSettings("CompanyID")))
Dim ds As DataSet = New DataSet
da.Fill(ds)
ds.Tables(0).TableName = "Products"
dgvProducts.DataSource = ds.Tables("Products")
dgvProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
dgvProducts.AllowUserToResizeColumns = True
dgvProducts.Refresh()
End Using
End Sub
要求:在我的表单中,我会有textbox
和button
。文本框将提供搜索字符串。我需要一种方法来在找到字符串时突出显示该行。
我不想打开另一个连接只是为了搜索数据集上的字符串。是否可以直接在datagridview中搜索字符串值?
答案 0 :(得分:2)
您可以在此处获得所需的示例代码:
Dim toSearch As String = "this"
Dim colNum As Integer = 0
Dim res = ds.Tables("Products").AsEnumerable.Where(Function(x) x.Item(colNum).ToString() = toSearch).ToArray
For Each item In res
Dim curRow As Integer = ds.Tables("Products").Rows.IndexOf(item)
dgvSuppliers.Rows(curRow).DefaultCellStyle.BackColor = Color.Yellow
Next
上面的代码在"this"
的第一列中查找字符串Table "Products"
,并将匹配行的BackColor
更改为黄色。
注意:这个答案打算以通常“搜索数据源中的术语”的方式回答OP的问题,即依赖于查询。此外,人们倾向于选择涉及较少行数的解决方案。这两个原因解释了为什么我依赖这种方法(这与OP的静音一起)。 OP决定回答他自己认为更好的问题。我个人更喜欢像他发布的那样的迭代解决方案(尽管我认为这种方法对于使用DataGridView
的人来说是显而易见的)。在任何情况下,在不知道确切条件(大小)的情况下,没有什么可以先验地说明哪个选项更有效。本文的重点是强调我不建议定期依赖基于LINQ的方法,只是写了OP显然正在寻找的东西(不幸的是,我很难解释一个不解释的人的期望)显然正在寻找和避免任何形式的沟通。)
答案 1 :(得分:1)
您可以根据自己的要求使用BindingSource。因此,您的代码如下所示
声明(公开)
Dim ds As New DataSet
Dim bndSourceGrid As New BindingSource()
使用 BindingSource填充 dgvProducts
Private Sub LoadProducts()
Dim CS As String = ConfigurationManager.ConnectionStrings("HRMS.My.MySettings.ResortDBConnectionString").ConnectionString
Using con As SqlConnection = New SqlConnection(CS)
Dim da As SqlDataAdapter = New SqlDataAdapter("sp_NET_GetProducts_CompanyID", con)
da.SelectCommand.CommandType = CommandType.StoredProcedure
da.SelectCommand.Parameters.AddWithValue("@CompanyID", CInt(ConfigurationManager.AppSettings("CompanyID")))
da.Fill(ds)
ds.Tables(0).TableName = "Products"
'/*--------------------------------------------
bndSourceGrid.DataSource = ds.Tables("Products")
dgvProducts.DataSource = bndSourceGrid
'/*--------------------------------------------
dgvProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
dgvProducts.AllowUserToResizeColumns = True
dgvProducts.Refresh()
End Using
End Sub
转到 txtboxSerach 及其 TextChanged 事件
Private Sub txtboxSeracht_TextChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles txtSearchCust.TextChanged
'/*here "Name" is the column that you want filter/search
bndSourceGrid.Filter = String.Format("{0} LIKE '{1}%'", "Name",
txtboxSerach.Text)
'/* sorting method ascending/descending
bndSourceGrid.Sort = "Name ASC"
End Sub
转到 txtboxSerach 并在其上验证事件
Private Sub txtboxSerach_Validated(ByVal sender As Object, ByVal e As
System.EventArgs) Handles txtboxSerach.Validated
If txtboxSerach.Text = String.Empty Then
bndSourceGrid.RemoveFilter()
Else
bndSourceGrid.Filter = String.Format("{0} = '{1}'", "Name",
txtboxSerach.Text)
bndSourceGrid.Sort = "Name ASC"
End If
End Sub
结果 我的 DataGridView 如下所示
ID Name Other
---------------
0 Abcd 321
1 Abdc 546
2 Bcdsf 1005
当我开始在 txtBoxSerach中输入字母A
ID Name Other
---------------
0 Abcd 321
1 Abdc 546