2

如何使用文本框搜索 datagridview 中的列?我正在使用 vb.net 2010。我有一个带有数据源的 Datagridview。下面是我用于填充我的 datagridview 的代码。网格视图将有 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 中搜索字符串值?

4

2 回答 2

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 显然在寻找的东西(不幸的是,我很不擅长解释不解释的人的期望清楚地在寻找什么并避免任何形式的交流)。

于 2013-09-13T10:08:09.553 回答
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
    
  • goto txtboxSerach和它的Validated事件

       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
    


    当我开始AtxtBoxSerach中输入字母时

     ID Name    Other
     ---------------
     0  Abcd    321
     1  Abdc    546
    
于 2014-08-26T07:28:35.380 回答