这应该很容易,但我一直在努力让它发挥作用!我做了一个搜索,并尝试了所有的每一个。什么都不管用。我有一个带有绑定源的数据网格。用户将在文本框中键入文本,并且网格应更改为仅显示包含用户在名称中键入的内容的记录。简单吧?不!不适合我!我做错了什么?下面的代码。
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
您应该去掉几乎所有的代码。如果您想过滤数据,那么只需过滤数据即可。不需要条件语句,也不需要循环。只需设置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
中以这种方式进行的比较默认情况下是不区分大小写的。您必须将DataTable
或其父级DataSet
的CaseSensitive
属性显式设置为True
,以使此类比较区分大小写。
我还应该指出,过滤的能力取决于实现某些接口的数据源。如果数据源是DataTable
,那么这些接口是免费的。如果你实际上绑定到了其他东西,例如List(Of T)
,那么你将无法以这种方式进行筛选,因为所需的成员不存在。