C# DataGridView和List的数据绑定<&燃气轮机;使用BindingSource
我试图弄清楚使用C# DataGridView和List的数据绑定<&燃气轮机;使用BindingSource,c#,.net,data-binding,bindingsource,C#,.net,Data Binding,Bindingsource,我试图弄清楚使用BindingSource进行数据绑定应该如何工作 我希望在更新列表时用列表的内容填充DataGridView 我可以看到列表增长,并在检查调试器时验证它是否已填充。我以为BindingSource会在列表更改时触发事件。但所有可用的都没有被解雇。当基础列表发生更改时,如何通知我 我按照说明进行操作,并具有以下测试代码: Data d; BindingSource bs; public Form1() { InitializeCo
BindingSource
进行数据绑定应该如何工作
我希望在更新列表时用列表的内容填充DataGridView
我可以看到列表
增长,并在检查调试器时验证它是否已填充。我以为BindingSource
会在列表更改时触发事件。但所有可用的都没有被解雇。当基础列表发生更改时,如何通知我
我按照说明进行操作,并具有以下测试代码:
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();
}
如果要在属性发生更改时收到通知,则需要实现INotifyPropertyChanged
请参阅以获取示例。列表
不支持更改事件BindingList
将是支持此场景的一个很好的替代方案,如果您的类型T
实现了INotifyPropertyChanged
,它还支持项目级更改事件
在3.0及以上版本中,还有一个类似于BindingList
。所有这些都归结为接口,如IBindingList
,IBindingListView
,等等
根据评论;对于将Find
添加到BindingList
的2.0/3.0示例:
公共类MyBindingList:BindingList
{
公共T查找(谓词)
{
如果(谓词==null)抛出新的ArgumentNullException(“谓词”);
foreach(本文件中的T项)
{
if(谓词(项))返回项;
}
返回默认值(T);
}
}
请注意,在3.5中(或在带有LINQBridge和C#3.0的.NET 2.0/3.0中),您不需要这样做-任何LINQ扩展方法都可以做同样的事情。这很有效,谢谢,但是对于BindingList,我没有一个compare方法,可以向其传递谓词(我发现它非常有用)。我用它来防止列表中的重复项。。。我是否可以通过对象属性循环检查列表的存在性?您可以使用LINQ,这很好。或者子类BindingList
,并添加一些缺少的方法(非常容易做到——如果您想了解如何使用谓词,请告诉我)。正如Marc Gravell所述,它无法使用List。因此,我采用BindingList的方法。
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);
}
}