我正在尝试为我的用户提供一个很好的搜索功能。我想使用文本框来过滤数据网格视图。我有一个包含数据库中所有动物的dgv。为简单起见,我们假设前两列是animalName和animal(dog或cat)。我有两个文本框用于过滤,一个用于这两列中的每一列。让我们说我想找到所有名叫Buddy的狗。在我的第一个文本框中输入' Buddy'并且,由于文本框更改事件后面的过滤器代码,dgv现在只包含Buddys。当我转到textboxAnimal并输入' d'对于狗,dgv改变以显示所有的狗;不只是名为Buddy的人。当我应用第二个过滤器时,如何使第一个过滤器的结果保持不变?
我假设我需要使用第一个文本框的lostFocus(或gotFocus或leave)事件,但只是不知道要放在后面的代码。我想我可以硬编码一个select语句,然后用它来重新填充datagridview,但这可能会变得繁重,因为我将有很多文本框;不只是两个。
非常感谢任何帮助。
答案 0 :(得分:1)
焦点无关紧要。您处理两个TextChanged
控件的TextBox
事件,并且每次都从头开始构建过滤器,同时考虑这两个字段,例如
Private Sub TextBoxes_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged,
TextBox2.TextChanged
Me.BindingSource1.Filter = String.Format("Column1 LIKE '%{0}%' AND Column2 LIKE '%{1}%'",
TextBox1.Text,
TextBox2.Text)
End Sub
在TextChanged
上进行过滤的一个陷阱,无论您过滤了多少字段,都会在用户输入多个字母时不必要地多次过滤。例如,如果用户打算键入“bud”,那么在“b”和“bu”之后没有必要进行过滤,如果数据集很大,它实际上可能会降低性能。出于这个原因,使用Timer
来延迟短时间的过滤是很好的。这将推迟过滤,直到用户在大多数情况下停止输入。您可以使用Interval
来获得所需的效果。可能大约500毫秒应该这样做,但这取决于你。
Private Sub TextBoxes_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged,
TextBox2.TextChanged
'Start or restart the timer because the user typed something.
Me.Timer1.Stop()
Me.Timer1.Start()
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
'The timer has expired so the user has not typed anything for the prescribed amount of time.
Me.BindingSource1.Filter = String.Format("Column1 LIKE '%{0}%' AND Column2 LIKE '%{1}%'",
TextBox1.Text,
TextBox2.Text)
End Sub