67

DataGridView更新基础数据源时刷新 a 的最佳方法是什么?

我经常更新数据源,并希望在结果发生时向用户显示结果。

我有这样的东西(并且它有效),但设置DataGridView.DataSourcetonull似乎不是正确的方法。

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);
}
4

7 回答 7

55

我自己遇到了这个。我的建议:如果您拥有数据源的所有权,请不要使用List。使用BindingListBindingList具有在添加或更改项目时触发的事件,并且DataGridView在触发这些事件时自动更新自身。

于 2009-07-13T11:42:37.950 回答
49

好吧,没有比这更好的了。正式地,你应该使用

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

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

于 2008-10-31T15:40:20.937 回答
26

在这种情况下,最干净、最有效和范式友好的解决方案是使用 aSystem.Windows.Forms.BindingSource作为您的项目列表(数据源)和您的DataGridView:

var itemStates = new List<ItemState>();
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 的表单设计器中将 a 拖放到表单上,并将其作为数据源附加到您的表单中DataGridView,这样可以在上面的示例中为您节省一行代码,我正在手动执行此操作。

于 2016-12-03T23:54:04.770 回答
3

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;
于 2015-05-11T18:55:59.603 回答
0

这是从这个地方复制我的答案。

只需要像这样再次填充数据网格:

this.XXXTableAdapter.Fill(this.DataSet.XXX);

如果您使用从 dataGridView 自动连接此代码在 Form_Load() 中自动创建

于 2015-05-11T18:23:02.890 回答
0

您在循环内设置数据源并在每次添加后休眠 500。为什么不直接添加到 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);
}

更改您的代码如下:这要快得多。

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);
于 2015-08-14T20:24:15.863 回答
-5

试试这个代码

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);
}
于 2008-10-31T15:10:40.747 回答