DataGridView和List <>的DataBinding与BindingSource

rdo*_*eui 4 .net c# data-binding bindingsource

我试图弄清楚数据绑定BindingSource应该如何工作我希望DataGridView用一个List<>更新列表的内容填充.

List当我检查调试器时,我可以看到增长并验证它是否被填充.我认为BindingSourceList改变时会发生一个事件.但没有一个是可用的.如何更改基础列表时收到通知?

我按照说明操作,并提供以下测试代码:

    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();
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 8

List<T>不支持变更事件; BindingList<T>将是支持此场景的良好替代品,并且如果您的类型T实现,它还支持项目级别的更改事件INotifyPropertyChanged.

在3.0及以上版本中,也有ObservableCollection<T>类似的行为BindingList<T>.这一切都归结于诸如接口IBindingList,IBindingListView等等.


来自评论; 添加Find到的2.0/3.0示例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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,在3.5(或带有LINQBridge和C#3.0的.NET 2.0/3.0)中,您不需要这样做 - 任何LINQ扩展方法都会做同样的事情.