更新基础数据源时刷新DataGridView的最佳方法

时间:2008-10-31 15:05:17

标签: c# .net winforms 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);
}

8 个答案:

答案 0 :(得分:47)

嗯,它并没有比那更好。正式地说,你应该使用

dataGridView1.DataSource = typeof(List); 
dataGridView1.DataSource = itemStates;

它仍然是一种“清除/重置源”的解决方案,但我还没有找到任何能够可靠地刷新DGV数据源的东西。

答案 1 :(得分:47)

我自己遇到了这个问题。我的建议:如果您拥有数据源的所有权,请不要使用List。使用BindingListBindingList包含在添加或更改项目时触发的事件,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);
}