我正在尝试弄清楚使用 BindingSource
进行数据绑定(bind)应该如何工作
我希望在更新列表时用 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();
}
最佳答案
List<T>
不支持更改事件; BindingList<T>
将是支持这种情况的一个很好的替代品,如果您的类型 T
实现了 INotifyPropertyChanged
,它也支持项目级别的更改事件。
在 3.0 及以上版本中,还有 ObservableCollection<T>
,其作用类似于 BindingList<T>
。这一切都归结为 IBindingList
、 IBindingListView
等接口(interface)。
来自评论;对于将 Find
添加到 BindingList<T>
的 2.0/3.0 示例:
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 扩展方法都会做同样的事情。
关于c# - DataGridView 和 List<> 与 BindingSource 的数据绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1846464/