更新基础数据源时刷新DataGridView的最佳方法是什么?
我经常更新数据源,并希望在发生时向用户显示结果.
我已经得到了这样的东西(并且它可以工作),但是忽略DataGridView.DataSource
它似乎不是正确的方式.
ListitemStates = new List (); dataGridView1.DataSource = itemStates; for (int i = 0; i < 10; i++) { itemStates.Add(new ItemState { Id = i.ToString() }); dataGridView1.DataSource = null; dataGridView1.DataSource = itemStates; System.Threading.Thread.Sleep(500); }
GWLlosa.. 49
我自己也碰到了这个.我的建议:如果您拥有数据源的所有权,请不要使用List.使用BindingList.该的BindingList有项目时添加或更改,以及启动事件的DataGridView当这些事件被触发将自动更新.
我自己也碰到了这个.我的建议:如果您拥有数据源的所有权,请不要使用List.使用BindingList.该的BindingList有项目时添加或更改,以及启动事件的DataGridView当这些事件被触发将自动更新.
嗯,它并没有比那更好.正式地说,你应该使用
dataGridView1.DataSource = typeof(List); dataGridView1.DataSource = itemStates;
它仍然是一种"清除/重置源"类型的解决方案,但我还没有找到任何可以可靠地刷新DGV数据源的东西.
在这种情况下,最干净,最有效和范例友好的解决方案是在System.Windows.Forms.BindingSource
项目列表(数据源)和您的项目列表中使用a 作为代理DataGridView
:
var itemStates = new List(); var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates }; dataGridView1.DataSource = bindingSource1;
然后,在添加项目时,使用Add()
方法BindingSource
而不是列表的Add()
方法:
for (var i = 0; i < 10; i++) { bindingSource1.Add(new ItemState { Id = i.ToString() }); System.Threading.Thread.Sleep(500); }
这样,您可以将项目添加到列表中,并DataGridView
使用相同的代码行通知这些添加项.无需重新设置DataGridView
的DataSource
每一个你做出改变,以列表的时间.
还值得一提的是,您可以BindingSource
直接在Visual Studio的Forms Designer中将表单放到表单上,并将其作为数据源附加到您的表单中DataGridView
,这样可以在上面的示例中为您节省一行代码,我手动执行此操作.