应用多个过滤器时如何保留datagrid视图的内容

时间:2014-06-30 10:11:33

标签: vb.net datagridview filtering

我正在尝试为我的用户提供一个很好的搜索功能。我想使用文本框来过滤数据网格视图。我有一个包含数据库中所有动物的dgv。为简单起见,我们假设前两列是animalName和animal(dog或cat)。我有两个文本框用于过滤,一个用于这两列中的每一列。让我们说我想找到所有名叫Buddy的狗。在我的第一个文本框中输入' Buddy'并且,由于文本框更改事件后面的过滤器代码,dgv现在只包含Buddys。当我转到textboxAnimal并输入' d'对于狗,dgv改变以显示所有的狗;不只是名为Buddy的人。当我应用第二个过滤器时,如何使第一个过滤器的结果保持不变?

我假设我需要使用第一个文本框的lostFocus(或gotFocus或leave)事件,但只是不知道要放在后面的代码。我想我可以硬编码一个select语句,然后用它来重新填充datagridview,但这可能会变得繁重,因为我将有很多文本框;不只是两个。

非常感谢任何帮助。

1 个答案:

答案 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