更新基础数据源时刷新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);
}
答案 0 :(得分:47)
嗯,它并没有比那更好。正式地说,你应该使用
dataGridView1.DataSource = typeof(List);
dataGridView1.DataSource = itemStates;
它仍然是一种“清除/重置源”的解决方案,但我还没有找到任何能够可靠地刷新DGV数据源的东西。
答案 1 :(得分:47)
我自己遇到了这个问题。我的建议:如果您拥有数据源的所有权,请不要使用List。使用BindingList。 BindingList包含在添加或更改项目时触发的事件,DataGridView会在触发这些事件时自动更新。
答案 2 :(得分:13)
在这种情况下,最干净,最有效和范例友好的解决方案是使用System.Windows.Forms.BindingSource
作为项目列表(数据源)和DataGridView
之间的代理:
var itemStates = new List<ItemState>();
var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates };
dataGridView1.DataSource = bindingSource1;
然后,在添加项目时,请使用Add()
的{{1}}方法,而不是列表的BindingSource
方法:
Add()
这样您就可以将项目添加到列表中,并通过相同的代码行通知for (var i = 0; i < 10; i++)
{
bindingSource1.Add(new ItemState { Id = i.ToString() });
System.Threading.Thread.Sleep(500);
}
这些添加内容。每次更改列表时都无需重置DataGridView
DataGridView
。
还值得一提的是,您可以直接在Visual Studio的表单设计器中将DataSource
放到表单上,并将其作为数据源附加到BindingSource
那里,从而节省你在上面的例子中给我一行代码,我手动完成。
答案 3 :(得分:2)
Observablecollection :表示提供通知的动态数据集合 添加,删除项目或刷新整个列表时。 您可以枚举实现IEnumerable接口的任何集合。 但是,要设置动态绑定以便插入或删除 集合自动更新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;
答案 4 :(得分:0)
这是我THIS地方的答案。
只需要像这样再次填充数据网格:
this.XXXTableAdapter.Fill(this.DataSet.XXX);
如果您使用从dataGridView自动连接此代码,则在Form_Load()中自动创建
答案 5 :(得分:0)
亚历山大·阿巴库莫夫的答案是正确的。它解决了我已经更新了基础数据并更新了网格的每个绑定问题。
易于实现和修改任何现有的源代码。
grdDetails.DataSource = new System.Windows.Forms.BindingSource { DataSource = OrderDetails };
答案 6 :(得分:-1)
您正在循环内设置数据源,并在每次添加后休眠500。为什么不添加到项目状态,然后在添加完所有内容后设置数据源。如果你希望线程在那之后休眠。这里的第一个代码块是你修改的第二个块。
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);
答案 7 :(得分:-4)
试用此代码
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);
}