Привязка данных DataGridView и List <> с BindingSource - PullRequest
4 голосов
/ 04 декабря 2009

Я пытаюсь выяснить, как должна работать привязка данных с BindingSource Я хочу, чтобы DataGridView был заполнен содержимым List<> при обновлении списка.

Я вижу рост List и проверяю, заполнен ли он, когда проверяю отладчик Я думал, что BindingSource вызовет событие при изменении List. Но ни один из доступных не уволен. Как мне получить уведомление при изменении базового списка?

Я следую инструкциям и у меня есть следующий тестовый код:

    Data d;
    BindingSource bs;

    public Form1()
    {
        InitializeComponent();
        bs = new BindingSource();
        d = new Data();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        bs.DataSourceChanged += new EventHandler(bs_DataSourceChanged);
        bs.ListChanged += new ListChangedEventHandler(bs_ListChanged);
        bs.DataMemberChanged += new EventHandler(bs_DataMemberChanged);
        bs.CurrentChanged += new EventHandler(bs_CurrentChanged);
        bs.CurrentItemChanged += new EventHandler(bs_CurrentItemChanged);

        bs.DataSource = d.list;
        dataGridView1.DataSource = bs;
    }
    // ... all the handling methods caught with a break point in VS.

    private void button1_Click(object sender, EventArgs e)
    {
        d.addOneItem();
    }

Ответы [ 2 ]

8 голосов
/ 04 декабря 2009

List<T> не поддерживает события изменения; BindingList<T> будет хорошей заменой для поддержки этого сценария, а также поддерживает события изменения уровня элемента, если ваш тип T реализует INotifyPropertyChanged.

В версии 3.0 и выше также существует ObservableCollection<T>, который действует аналогично BindingList<T>. Все сводится к интерфейсам, таким как IBindingList, IBindingListView и т. Д.


из комментариев; для примера 2.0 / 3.0 добавления Find к BindingList<T>:

public class MyBindingList<T> : BindingList<T>
{
    public T Find(Predicate<T> predicate)
    {
        if (predicate == null) throw new ArgumentNullException("predicate");
        foreach (T item in this)
        {
            if (predicate(item)) return item;
        }
        return default(T);
    }
}

Обратите внимание, что в 3.5 (или в .NET 2.0 / 3.0 с LINQBridge и C # 3.0) это вам не нужно - любой из методов расширения LINQ будет делать то же самое.

0 голосов
/ 04 декабря 2009

Если вы хотите получать уведомления при изменении свойства, вам нужно реализовать INotifyPropertyChanged

См. здесь для примера.

...