过滤绑定源

时间:2019-11-18 18:25:38

标签: vb.net

这应该很容易,但是我正在努力尝试使它生效!我进行了搜索,并尝试了所有大多数单项。什么都没有。我有一个带有绑定源的数据网格。用户将在文本框中键入文本,并且网格将更改为仅显示包含用户键入名称的记录。简单吧?不!不适合我!我究竟做错了什么?下面的代码。

Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click
    Dim Found As Boolean = False
    Dim StringToSearch As String = ""
    Dim ValueToSearchFor As String = "%" & SearchTextBox.Text.Trim.ToLower & "%"
    Dim CurrentRowIndex As Integer = 0

    Try

        If ReferencesGrid.Rows.Count = 0 Then
            CurrentRowIndex = 0
        Else
            CurrentRowIndex = ReferencesGrid.CurrentRow.Index + 1
        End If
        If CurrentRowIndex > ReferencesGrid.Rows.Count Then
            CurrentRowIndex = ReferencesGrid.Rows.Count - 1
        End If

        If ReferencesGrid.Rows.Count > 0 Then
            For Each gRow As DataGridViewRow In ReferencesGrid.Rows
                StringToSearch = gRow.Cells(1).Value.ToString.Trim.ToLower
                If InStr(1, StringToSearch, LCase(Trim(SearchTextBox.Text)), vbTextCompare) Then
                    TrainingItemBindingSource.Filter = String.Format("Name LIKE '{0}'", ValueToSearchFor)

                    Exit For
                End If
            Next
        End If
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

1 个答案:

答案 0 :(得分:2)

您应该删除几乎所有这些代码。如果要过滤数据,则仅过滤数据。不需要条件语句和循环。只需设置Filter属性,所有与过滤器不匹配的记录都将被隐藏:

Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click
    TrainingItemBindingSource.Filter = $"Name LIKE '%{SearchTextBox.Text.Trim()}%'"
End Sub

您可以看到,这很简单。我不知道您实际上要使用其余的代码来实现什么。这将排除Name列不包含搜索文本的所有记录。

请注意,无需尝试通过使用ToLower等来强制不区分大小写。就像在真正的SQL中一样,在DataTable中以这种方式进行的比较默认情况下不区分大小写。您必须将CaseSensitive或其父项DataTable的{​​{1}}属性显式设置为DataSet,以使这种比较区分大小写。

我还应该指出,过滤能力取决于实现某些接口的数据源。如果数据源是True,那么您可以免费使用那些接口。如果您确实绑定了其他内容,例如DataTable,那么您将无法通过这种方式进行过滤,因为所需的成员不存在。