我创建了一个项目列表,其中加载了所有项目,我需要根据文本框中输入的文本过滤数据。 请指导我如何过滤和排序数据,我创建了以下代码
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
但是在上面的代码中,应用程序很慢,因为每次输入任何文本时都会执行查询。请告诉我任何查询只执行一次的解决方案,当我们输入文本时,它只通过外卡搜索项目并过滤它。
答案 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字段中输入什么,它都无法到达数据库)