过滤和排序datagridview

时间:2015-10-12 17:15:04

标签: vb.net 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

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

1 个答案:

答案 0 :(得分:1)

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

设置DataSource即可
 ' 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字段可能包含单引号,则需要添加某种形式的双引号引号(String.Replace将执行)以避免语法错误。是的,不用担心DataView上的Sql Injection(它是一个断开连接的对象,无论你的用户在compcode字段中输入什么,它都无法到达数据库)