Хорошая коллекция для использования при привязке к DataGridView в C # - PullRequest
5 голосов
/ 12 ноября 2009

Какую коллекцию лучше всего использовать при привязке списка данных к DataGridview в C #? В настоящее время я использую только общий список, но сетка данных не обновляется при добавлении или удалении объектов из списка. Я рассмотрел использование BindingList или ObservableCollection, но не могу решить, какой из них лучше использовать, который обновит и будет легко сортировать / фильтровать без повторной привязки к сетке данных. В настоящее время я работаю в форме Windows на платформе .Net 3.5 с планами в ближайшее время перейти на WPF.

Ответы [ 7 ]

9 голосов
/ 12 ноября 2009
  • ObservableCollection<T> не будет работать для DataGridView: он реализует INotifyCollectionChanged, а не IBindingList, а DataGridView не знает о INotifyCollectionChanged. Он предназначен для привязок WPF и не используется в Windows Forms
  • BindingList<T> - хороший вариант, но учтите, что он не поддерживает сортировку или фильтрацию из коробки. Тем не менее, вы можете найти некоторые пользовательские реализации этих функций в Интернете.
  • DataTable, вероятно, ваш лучший вариант, если вам нужна возможность сортировки и / или фильтрации
2 голосов
/ 12 ноября 2009

Если вы хотите связать коллекцию с сеткой данных, я бы использовал список связывания. Хотя список связывания не поддерживает сортировку «из коробки», вы можете расширить ее, создав собственный список, производный от BindinList, и реализовать собственную сортировку.

См. здесь о том, как это сделать.

2 голосов
/ 12 ноября 2009

На самом деле Microsoft рекомендует использовать коллекцию в качестве коллекции привязок, а не список из-за возможности выполнять автоматические функции, такие как добавление и удаление элементов, очистка коллекции или установка значения существующего элемента.

Класс сбора в MSDN.

2 голосов
/ 12 ноября 2009

Фреймворк привязки данных полностью отличается в WinForms и WPF, поэтому (в общем) для них обоих не существует «лучшего выбора».

Для WinForms, использование универсального BindingList<T> выполнит большую часть того, что вы хотите (хотя он не обрабатывает изменения отдельных элементов; вам придется реализовать это самостоятельно).

Для WPF ObservableCollection<T> служит аналогичной цели.

0 голосов
/ 12 ноября 2009

Я создал свою собственную коллекцию, унаследованную от BindingList, которая поддерживает сортировку, фильтрацию и т. Д. Сейчас она работает хорошо, но было много работы, я не рекомендую делать ее самостоятельно ... Я думаю, что одна уже реализована в CodeProject или похожий сайт, я дам вам ссылку, если найду ее.

Edit:

Я нашел эту статью CodeProject с реализацией IBindingList, которая поддерживает сортировку, фильтрацию и т. Д. Я не тестировал ее, поэтому не знаю, насколько хороша реализация, но она может стоит проверить это.

0 голосов
/ 12 ноября 2009

Я не думаю, что существует жесткое / общее правило того, какой тип коллекции лучше всего подходит для DataGridView.

Это действительно зависит от нескольких факторов:
- характер данных
- Какие операции (если таковые имеются) должны выполняться из пользовательского интерфейса в БД (например, CRUD, сортировка, фильтр) - размер данных
и т.д и т.д ..

0 голосов
/ 12 ноября 2009

A DataTable, возможно?

Кроме того, вы часто можете принудительно перерисовать вид сетки и включить новые элементы, вызвав DataGridview.Invalidate () сразу после добавления элементов.

...