4

リストの更新時にの内容を入力しBindingSourceたい とのデータバインディングがどのように機能するかを理解しようとしています。DataGridViewList<>

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();
    }
4

2 に答える 2

8

List<T>変更イベントをサポートしていません。は、このシナリオをサポートするための適切な代替手段であり、型が を実装しBindingList<T>ている場合はアイテム レベルの変更イベントもサポートします。TINotifyPropertyChanged

3.0 以降ではObservableCollection<T>、 と同様に動作するもありBindingList<T>ます。IBindingListそれはすべて、IBindingListView、 などのインターフェースに帰着します。


コメントから; に a を追加する 2.0/3.0 のFindBindingList<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 (または LINQBridge と C# 3.0 を使用する .NET 2.0/3.0) ではこれは必要ないことに注意してください。どの LINQ 拡張メソッドでも同じことが行われます。

于 2009-12-04T12:23:49.390 に答える
0

プロパティが変更されたときに通知を受け取りたい場合は、実装する必要がありますINotifyPropertyChanged

例については、こちらを参照してください。

于 2009-12-04T11:57:14.173 に答える