Добавление записей при привязке сетки данных к списку объектов в приложении winforms

У меня есть следующие классы:

public class MyItems : List<MyItem>
{
...
}

public class MyItem
{
...
}

Я создал экземпляр MyItems и назначил его свойству DataSource сетки данных WinForms.

Все отображается правильно, но когда я пытаюсь добавить строки, ничего не происходит. Что я делаю, так это возвращаю сетки DataSource обратно в MyItems, добавляю к нему экземпляр MyItems и затем возвращаю DataSource обратно в список. Я могу пройтись по коду и увидеть, что количество элементов в источнике данных растет, но сетка не отображает их. Есть идеи?

//Form Load
MyItems lstItems = new MyItems();
lstItems.Add(new MyItem("1"));
lstItems.Add(new MyItem("2"));

//Grid displays two rows;
grd.DataSource = lstItems;

//Add button click event
MyItems lstItmes = (MyItems)grd.DataSource;
lstItems.Add(new MyItem("3"));

//Grid does not display new row
grd.DataSource = lstItems;

1 ответ

Решение

Для того, чтобы изменения в источнике данных отображались, он должен реализовать System.ComponentModel.IBindingList интерфейс. Это интерфейс, который обеспечивает ListChanged событие, к которому привязывается сетка, чтобы обнаружить изменения в списке (добавление и удаление элементов) или в строках (изменение значений свойств).

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

Если вы просто ищете базовые уведомления и ваш базовый класс уже наследуется от чего-то вроде List<T>попробуйте сменить родителя на System.ComponentModel.BindingList<T>, Это имеет простую реализацию IBindingList интерфейс уже. Вам придется проделать больше работы, если вы хотите более сложные вещи, такие как сортировка или поддержка уведомлений об изменении свойств, но это обеспечивает реализацию для базового добавления и удаления.

Другие вопросы по тегам