2013-02-08 2 views
2

Я использую dll BindingListView, расположенную по адресу http://blw.sourceforge.net/, чтобы включить сортировку DataGridView с помощью общего списка, так как это DataSource. Я читал о фильтрации и довольно прост в использовании, но у меня возникают проблемы с попыткой выяснить, как использовать несколько параметров поиска для фильтра. Вот пример ...Фильтрация нескольких столбцов с BindingListView

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 TextBox мой фильтр будет возвращать правильные результаты. Но если я скажу «положить» в текстовом поле txtProjectNumber TextBox и захочу также выполнить поиск по txtDescription «morning», txtDescription игнорируется, потому что он попадает в txtProjectNumber и возвращается, не попадая в текстовый текст txtDescription TextBox. Как я могу заставить его продолжать весь путь вниз, создавая фильтр с каждого непустого ввода?

ответ

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 
Смежные вопросы