更新基础数据源时刷新DataGridView的最佳方法
更新基础数据源时刷新DataGridView的最佳方法是什么?
我正在经常更新数据源,并希望将结果显示给用户。
我有这样的东西(和它的工作),但空DataGridView.DataSource
似乎不是正确的方式。
List<ItemState> itemStates = new List<ItemState>(); 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); }
那么,它并没有比这更好。 正式的,你应该使用
dataGridView1.DataSource = typeof(List); dataGridView1.DataSource = itemStates;
这仍然是一个“清除/重置源”的解决scheme,但我还没有find任何其他可靠刷新DGV数据源。
我自己碰到了这个。 我的build议:如果您拥有数据源的所有权,请不要使用列表 。 使用一个BindingList 。 BindingList具有添加或更改项目时触发的事件,当这些事件触发时, DataGridView将自动更新自身。
Observablecollection :表示dynamic数据集合,用于在项目添加,删除或整个列表刷新时提供通知。 您可以枚举实现IEnumerable接口的任何集合。 但是,要设置dynamic绑定,以便集合中的插入或删除自动更新UI,集合必须实现INotifyCollectionChanged接口。 这个接口暴露了CollectionChanged事件,一个在底层集合发生变化时应该引发的事件。
Observablecollection<ItemState> itemStates = new Observablecollection<ItemState>(); for (int i = 0; i < 10; i++) { itemStates.Add(new ItemState { Id = i.ToString() }); } dataGridView1.DataSource = itemStates;
在这种情况下,最干净,最高效和范式友好的解决scheme是使用System.Windows.Forms.BindingSource
作为项目列表(数据源)和DataGridView
之间的代理:
var itemStates = new List<ItemState>(); var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates }; dataGridView1.DataSource = bindingSource1;
然后,添加项目时,请使用BindingSource
Add()
方法,而不是列表的Add()
方法:
for (var i = 0; i < 10; i++) { bindingSource1.Add(new ItemState { Id = i.ToString() }); System.Threading.Thread.Sleep(500); }
这样,您可以将项目添加到列表中,并使用同一行代码向DataGridView
通知这些添加项。 每次您对列表进行更改时,无需重置DataGridView
的DataSource
。
另外值得一提的是,你可以直接在Visual Studio的Forms Designer中将BindingSource
放到你的表单上,并把它作为数据源附加到你的DataGridView
,这样可以节省上面的例子中的一行代码手动。
这是从这个地方复制我的答案。
只需要像这样再次填充datagrid:
this.XXXTableAdapter.Fill(this.DataSet.XXX);
如果你使用自动连接从dataGridView这个代码自动创build在Form_Load()
你正在设置循环内的数据源,并在每次添加后睡眠500次。 为什么不添加到itemstate,然后设置你的数据源后,你已经添加了一切。 如果你想线程睡觉后罚款。 这里的第一个代码块是你修改的第二个块。
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); }
更改你的代码如下:这是更快。
for (int i = 0; i < 10; i++) { itemStates.Add(new ItemState { Id = i.ToString() }); } dataGridView1.DataSource = typeof(List); dataGridView1.DataSource = itemStates; System.Threading.Thread.Sleep(500);
试试这个代码
List itemStates = new List(); for (int i = 0; i < 10; i++) { itemStates.Add(new ItemState { Id = i.ToString() }); dataGridView1.DataSource = itemStates; dataGridView1.DataBind(); System.Threading.Thread.Sleep(500); }