2

我正在使用位于http://blw.sourceforge.net/的 BindingListView dll来启用具有通用列表的 DataGridView 的排序,因为它是 DataSource。我阅读了有关过滤的内容,它使用起来相当简单,但我在试图弄清楚如何为过滤器使用多个搜索参数时遇到了问题。这是一个例子......

Private Sub txtProjectNumber_TextChanged(sender As Object, e As System.EventArgs) Handles txtProjectNumber.TextChanged, txtDescription.TextChanged,
    txtOracleNumber.TextChanged, txtBudgetYearFrom.TextChanged, txtBudgetYearTo.TextChanged, txtWeek3Start.TextChanged, txtWeek3End.TextChanged
    view.ApplyFilter(AddressOf FilterData)
End Sub

Private Function FilterData(ByVal projectDetails As ProjectDetails) As Boolean
    Try
        If Not String.IsNullOrWhiteSpace(txtProjectNumber.Text) Then  
            Return projectDetails.ProjectNum.ToLower().StartsWith(txtProjectNumber.Text.ToLower())
        End If
        If Not String.IsNullOrWhiteSpace(txtDescription.Text) Then
            Return projectDetails.Description.ToLower().StartsWith(txtDescription.Text.ToLower())
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
    Return False
End Function

所以在这里您可以看到,如果我更改 txtProjectNumber 文本框中的文本,我的过滤器将返回正确的结果。但是,如果我说在 txtProjectNumber 文本框中放置“x”,并且还想通过“早上”的 txtDescription 进行搜索,则 txtDescription 将被忽略,因为它命中了 txtProjectNumber 并被返回,而从未命中 txtDescription 文本框。我怎样才能让它一直继续下去,从每个非空输入构建一个过滤器?

4

1 回答 1

0

您只需要根据测试返回一个布尔值,您实际上并没有返回对象本身,因此多个返回只是将您的条件放在 if/andalso 语句中,如果满足所有条件,则返回 true。

Private Function FilterData(ByVal projectDetails As ProjectDetails) As Boolean
    Dim result As Boolean = False

    If projectDetails.ProjectNum.ToLower().StartsWith(txtProjectNumber.Text.ToLower()) andalso _
       projectDetails.Description.ToLower().StartsWith(txtDescription.Text.ToLower()) andalso _

              <remaining tests>

       result = true
    End If
Return result
End Function
于 2013-11-29T16:07:45.153 回答