Проблема с фильтрацией DataGrid - PullRequest
1 голос
/ 15 сентября 2010

Я привязал свою DataGrid к DataTable, и в сетке отображаются только некоторые детали. Когда я захотел отфильтровать DataGrid, я создал представление с помощью ItemsSource моего DataGrid. Код:

  Dim myView As ICollectionView = CollectionViewSource.GetDefaultView(MyDGrid.ItemsSource)
  myView.Filter = New Predicate(Of Object)(AddressOf filterFunc1)

Теперь, когда я выполняю поиск, неотображаемые поля также включаются в поиск.

Public Function filterFunc1(ByVal obj As Object) As Boolean
    Dim filStr As String = "*" & TextBox1.Text & "*"
    For Each item As String In obj.Row.ItemArray
        **If item.ToLower Like filStr.ToLower Then**
            Return True
        End If
    Next
    Return False
End Function

Также у меня есть поля ComboBox в DataGrid, которые загружаются отдельно от других таблиц DataTable. Теперь я не могу включить их в поиск.

Скриншот из моего приложения: A screenshot from my App:

Так как мне выполнить поиск, который включает в себя только текст из отображаемой части.

РЕДАКТИРОВАТЬ: Кроме того, как я могу пропустить поиск файлов с нулевым значением? потому что это вызывает исключение в моем случае.

1 Ответ

0 голосов
/ 16 сентября 2010

Ну тогда ... Ваш вопрос довольно разрозненный, и я не могу понять всего этого - может быть, поэтому вы до сих пор не получили ответа. Пропуск пустых полей - это просто вопрос добавления нового условия в filterFunc1 - if Convert.IsDBNull(item) then continue for (при условии, конечно, item - это поле в DataRow).

Однако этот стиль программирования довольно туманный, и я бы рекомендовал, по крайней мере, более четко определить, какие столбцы вы фильтруете, и типы объектов в столбцах. Гораздо лучшим подходом было бы сопоставить данные, которые вы получаете из базы данных, с реальными объектами в вашем приложении - это позволяет более безопасно программировать. Я думаю, что главная проблема здесь в том, что никто не может действительно сказать, что там происходит, из нескольких строк кода, потому что никто не может делать какие-либо предположения о том, какие там объекты.

Об элементах в ComboBox, Понятия не имею, с какими трудностями вы столкнулись, возможно, вы захотите немного прояснить это. вместо простых строк можно поддерживать структуры, содержащие как заголовки, так и идентификаторы, например, скажем

public class YourComboItem
  public property Id as string [get/set]
  public property Title as string [get/set]
end class

Затем свяжите ItemsSource вашего ComboBox с коллекцией этих элементов, извлеченных из базы данных, и установите DisplayMemberPath на Title и ValueMemberPath на Id. Затем вы можете использовать SelectedValue ComboBox, чтобы получить выбранный идентификатор. Как видите, наличие объектов вместо необработанных структур данных может иметь довольно много преимуществ.

Конечно, я описал получение SelectedValue напрямую из ComboBox, в то время как гораздо лучшая архитектура была бы MVVM, с ViewModel, содержащей ObservableCollection(Of YourComboItem), и ItemSource ComboBox, привязанного к нему с фактической привязкой. Затем вы также можете привязать SelectedItem к свойству в вашей ViewModel и иметь элемент в целом, включая Id и Title, для работы, ничего не зная о вашем пользовательском интерфейсе. В качестве альтернативы вы можете создать ICollectionView из коллекции элементов и связать с ним ItemsSource, тогда у вас будет выбранный элемент в свойстве CurrentItem объекта ICollectionView.

Я бы порекомендовал почитать MVVM (Model-View-ViewModel), чтобы значительно упростить вашу работу с WPF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...