使用文本框(vb.net)搜索datagridview中的列

时间:2013-09-13 09:33:59

标签: vb.net search datagridview find bind

如何使用文本框搜索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

要求:在我的表单中,我会有textboxbutton。文本框将提供搜索字符串。我需要一种方法来在找到字符串时突出显示该行。

我不想打开另一个连接只是为了搜索数据集上的字符串。是否可以直接在datagridview中搜索字符串值?

2 个答案:

答案 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