更新基础数据源时刷新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通知这些添加项。 每次您对列表进行更改时,无需重置DataGridViewDataSource

另外值得一提的是,你可以直接在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); }