【问题标题】:Filtering DataGridView过滤 DataGridView
【发布时间】:2018-04-08 03:47:05
【问题描述】:

我的 winform 中有一个 DataGridView 以及一个用于在 DataGridView 中搜索的 TextBox。 DataGridView 有一个 CheckBox 列。这就是我的代码的样子:

 Imports System.ComponentModel
 imports system.Data.sqlclient

 Public Class MyForm
    Dim con As New SqlConnection("Data source=" & My.Settings.sqlserver & ", " & My.Settings.sqlport & ";Network Library=DBMSSOCN;initial catalog=" & My.Settings.dbname & ";User id=" & My.Settings.Username & ";Password=" & My.Settings.Password & ";")

    Dim ds As New DataSet

    Private Sub filterdata(valuetosearch As String)
        Dim srq As String = "Select * from Contacts where CONCAT([Unique id],Prefix,[First name],[Last name],Gender,Title,Company,Phone,Mobile,Fax,[b.email],[p.email],Reference,Address,[Address 2],Country,City,Zip,Facebook,GooglePlus,Instagram,Twitter,Website,Salary,Currency,[Group],[Id/Status],Note,[Added by]) like '%" & valuetosearch & "%' "
         Dim adapter As New SqlDataAdapter(srq, con)
         adapter.Fill(ds, "Contacts_table")
         userdatagrid.DataSource = ds.Tables(0)
   End Sub
   Private Sub searcgcon_TextChanged(sender As Object, e As EventArgs) Handles searcgcon.TextChanged
       If searcgcon.Text = "" Then
           filterdata("")
           entrylabel.Text = "There are/is " & userdatagrid.Rows.Count & " contact entries"
      Else
         filterdata(searcgcon.Text)
         entrylabel.Text = "There are/is " & userdatagrid.Rows.Count & " contact entries that contain your query :" & searcgcon.Text
      End If
  End Sub

  Private sub refresh_click()handles refresh.click
      filterdata("")
  end sub
 End class

我已经更正了一个较早的问题(请参阅How to maintain datagridview checkstate when filtering VB.net)。

现在我遇到的问题是当我按下触发“filterdata”的按钮时,例如刷新按钮,甚至当我在 TextBox(用于过滤的那个)中单击/键入某些内容时,DataGridView 会不断添加相同数据的行。请告诉我哪里错了。

我在其他网站上发布了这个。一个人说我filterdata的代码应该在表单的Load事件中。如果我这样做,那么我将面临一些问题,例如:

  1. 我不会有一个名为 filterdata 的子

  2. 如果我没有那个 sub,我应该如何在 TextBox TextChanged 事件中使用它?

如果我还是错了,请纠正我。我只是个学生!

(附注:数据库包含一个 Image 列,我无法将其包含在 srq 字符串中,因为它在 adapter.fill 上给我一个错误,提示“操作数类型冲突:图像与 nvarchar 不兼容”)

【问题讨论】:

  • 您问题中的代码有点乱。您有一个 Sub filterdata 后跟一些不在任何方法中的代码行(这是不允许的),然后是一个无效的事件处理程序。请编辑代码,使其有效并且我们知道发生了什么。
  • 尝试在您的 filterdata 过程中放置​​一个断点。这很可能会告诉您“某些”关于它被调用的原因或从哪里调用它
  • 先生,filterdata 是从一个事件中调用的,即文本框的 textchanged 事件
  • 请重新阅读帖子.....我正确安排了代码
  • @Plutonix 虽然 OP 创建了一个新帐户来提出这个问题似乎很奇怪,但它似乎与之前的帐户不同(OP 说它已解决)。

标签: vb.net datagridview


【解决方案1】:

使用以下代码更新您的 filterdata 方法 -

Private Sub filterdata(valuetosearch As String)
    userdatagrid.DataSource = Nothing
    Dim ds As New DataSet
    Dim srq As String = "Select * from Contacts where CONCAT([Unique id],Prefix,[First name],[Last name],Gender,Title,Company,Phone,Mobile,Fax,[b.email],[p.email],Reference,Address,[Address 2],Country,City,Zip,Facebook,GooglePlus,Instagram,Twitter,Website,Salary,Currency,[Group],[Id/Status],Note,[Added by]) like '%" & valuetosearch & "%' "
    Dim adapter As New SqlDataAdapter(srq, con)
    adapter.Fill(ds, "Contacts_table")
    userdatagrid.DataSource = ds.Tables(0)
End Sub

您必须在每次文本更改时重置您的数据集和网格数据源。

【讨论】:

  • 我使用了这段代码。发生了一些奇怪的事情。在我的 textchange 事件中,我使用了帖子中提到的代码。在将您的代码与我的代码一起使用时(仅 textchange 事件的代码),如果我单击文本框,我的 dgvw 的第一行(这是从同一 sql 连接加载图像的图像行)变为空白,并且宽度增加...这是一个屏幕截图:点击前:link 点击后link
  • 可能是因为你的初始绑定源与上面的SQL查询不同。在上面的 SQL 查询中,我没有看到 Pic 的任何列。您也必须在此处使用类似的 SQL 查询。
  • 我无法使用连接字符串中的 Pic 列,因为它在 adapter.fill 上给我错误提示“操作数类型冲突:图像与 nvarchar 不兼容”
  • @ronnie - 您不必在连接字符串中使用 Pic 列。联系人表是否有图像列,它是“从联系人中选择 *”的一部分吗?我建议,请检查初始绑定。
  • 先生,只有一个数据绑定,它在 filterdata evemt 中。我尝试在 sqr 字符串中包含 pic 列,但发生了同样的异常错误!是的,联系人表有图像列,它的名称是 PIC
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多