正在筛选绑定源

  • 本文关键字:绑定 筛选 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

您应该去掉几乎所有的代码。如果您想过滤数据,那么只需过滤数据即可。不需要条件语句,也不需要循环。只需设置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或其父级DataSetCaseSensitive属性显式设置为True,以使此类比较区分大小写。

我还应该指出,过滤的能力取决于实现某些接口的数据源。如果数据源是DataTable,那么这些接口是免费的。如果你实际上绑定到了其他东西,例如List(Of T),那么你将无法以这种方式进行筛选,因为所需的成员不存在。

最新更新