这应该很容易,但是我正在努力尝试使它生效!我进行了搜索,并尝试了所有大多数单项。什么都没有。我有一个带有绑定源的数据网格。用户将在文本框中键入文本,并且网格将更改为仅显示包含用户键入名称的记录。简单吧?不!不适合我!我究竟做错了什么?下面的代码。
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
答案 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
,那么您将无法通过这种方式进行过滤,因为所需的成员不存在。