DataGridView和List 的DataBinding与BindingSource

我正在试图弄清楚如何使用BindingSource数据绑定工作我希望在更新列表时使用List的内容填充DataGridView

当我检查调试器时,我可以看到List增长并validation它是否被填充。 我认为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(); } 

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

在3.0及以上版本中,还有ObservableCollection ,其作用类似于BindingList 。 这一切都归结为IBindingListIBindingListView等接口。


来自评论; 对于添加Find to BindingList的2.0 / 3.0示例:

 public class MyBindingList : BindingList { public T Find(Predicate 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扩展方法都会做同样的事情。

如果您希望在更改属性时收到通知,则需要实现INotifyPropertyChanged

请看这里的例子。