DataGridView与List<>的DataBinding与绑定源
我试图弄清楚与 BindingSource
的数据绑定应该如何工作
我希望在更新列表时用 List<>
的内容填充 DataGridView
。
当我检查调试器时,我可以看到 List
增长并验证它是否已被填充。我认为当 List
更改时 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();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
List
不支持更改事件;BindingList
将是支持此场景的一个很好的替代方案,并且如果您的类型T
实现INotifyPropertyChanged
,它还支持项目级更改事件。在3.0及以上版本中,还有
ObservableCollection
,其作用与BindingList
类似。这一切都归结为诸如 IBindingList、IBindingListView 等接口。对于将
Find
添加到BindingList
的 2.0/3.0 示例:请注意,在 3.5 中(或在具有 LINQBridge 和 C# 3.0 的 .NET 2.0/3.0 中),您不需要不需要这个 - 任何 LINQ 扩展方法都会做同样的事情。
List<T>
doesn't support change events;BindingList<T>
would be a good substitute to support this scenario, and it also supports item-level change events if your typeT
implementsINotifyPropertyChanged
.In 3.0 and above, there is also
ObservableCollection<T>
, which acts similarly toBindingList<T>
. It all comes down to interfaces such asIBindingList
,IBindingListView
, etc.From comments; for a 2.0/3.0 example of adding a
Find
toBindingList<T>
:Note that in 3.5 (or in .NET 2.0/3.0 with LINQBridge and C# 3.0) you don't need this - any of the LINQ extension methods would do the same thing.
如果您想在属性更改时收到通知,则需要实现
INotifyPropertyChanged
请参阅 此处 为例。
If you want to get notified when a property get's changed you'll need to implement
INotifyPropertyChanged
See here for an example.