筛选和排序datagridview



我创建了一个项目列表,其中加载了所有项目,我需要根据文本框中输入的文本过滤数据。请指导我如何过滤和排序数据,我创建了以下代码

 Private Sub loadsearchitems(item As String)
    dgvsearchitem.ScrollBars = ScrollBars.Vertical
    On Error Resume Next
    con = New System.Data.OleDb.OleDbConnection(connectionString)
    con.Open()
    Dim ds As DataSet = New DataSet
    Dim adapter As New OleDb.OleDbDataAdapter
    sqlstr = "SELECT Imaster.icode, Imaster.iname & '  ' & MfgComTab.comname as[Iname], Imaster.unitcode, Imaster.tax,Unit.unitname FROM ((Imaster INNER JOIN MfgComTab ON Imaster.mccode = MfgComTab.mccode) INNER JOIN Unit ON Imaster.unitcode = Unit.unitcode) WHERE (Imaster.isdeleted = 'N') AND Imaster.comcode=@comcode AND Imaster.iname like '%' & @item & '%'   order by iname asc  "
    adapter.SelectCommand = New OleDb.OleDbCommand(sqlstr, con)
    adapter.SelectCommand.Parameters.AddWithValue("@comcode", compcode)
    adapter.SelectCommand.Parameters.AddWithValue("@iname", item)
    adapter.Fill(ds)
    If ds.Tables(0).Rows.Count > 0 Then
        dgvsearchitem.DataSource = ds.Tables(0)
        dgvsearchitem.Columns("unitname").Visible = False
        dgvsearchitem.Columns("unitcode").Visible = False
        dgvsearchitem.Columns("icode").Visible = False
        dgvsearchitem.Columns("tax").Visible = False
        dgvsearchitem.Columns("Iname").Width = 371
    Else
        ds.Dispose()
    End If
    con.Close()
End Sub

但是在上面的代码中,应用程序很慢,因为每次输入任何文本时都会执行查询。请告诉我查询只执行一次的任何解决方案,当我们输入文本时,它只通过通配符搜索项目并过滤它。

如果您最初使用所有记录设置DataGridView,那么您可以避免再次访问数据库以过滤的方式提取数据。您已经提取了所有内容,因此您可以简单地使用本地过滤的DataView设置数据源

 ' Code that loads initially the grid
  sqlstr = "SELECT Imaster.icode, Imaster.iname .....FROM ...." ' NO WHERE HERE
  ....
  dgvsearchitem.DataSource = ds.Tables(0).DefaultView

现在在你的loadsearchitems,而不是再次执行对数据库的查询,你可以采取数据源和设置RowFilter属性

 Dim v as DataView = CType(dgvsearchitem.DataSource, DataView)
 v.RowFilter = "Imaster.comcode='" & compcode & "' AND Imaster.iname like '%" & item & "'%'"

注意RowFilter属性不理解参数的使用,所以如果你的comcode字段可能包含单引号,你需要添加某种形式的双引号(字符串)。Replace就行了),以避免语法错误。是的,没有担心Sql注入对DataView(它是一个断开连接的对象,无论你的用户类型在compcode字段它不能到达数据库)