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

sha*_*unf 55 .net c# datagridview winforms

更新基础数据源时刷新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);
}
Run Code Online (Sandbox Code Playgroud)

GWL*_*osa 49

我自己也碰到了这个.我的建议:如果您拥有数据源的所有权,请不要使用List.使用BindingList.该的BindingList有项目时添加或更改,以及启动事件的DataGridView当这些事件被触发将自动更新.

  • 这是一个很好的建议.之后你只需要为datagridview调用.Refresh()来刷新它显示的数据...... (4认同)
  • 可以使用:bindingList.ResetItem(bindingList.IndexOf(item))逐行刷新; (3认同)
  • `.Refresh()`只讨论控件重绘,与绑定无关,除非我非常错误!"强制控件使其客户区无效,并立即重绘自身和任何子控件." [Control.Refresh Method](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.refresh.aspx) (2认同)

Ala*_*lan 47

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

dataGridView1.DataSource = typeof(List); 
dataGridView1.DataSource = itemStates;
Run Code Online (Sandbox Code Playgroud)

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

  • @GWLlosa,如果您使用自动生成的列并将数据源设置为NULL,它将清除列.通过使用typeof(List),它应该在刷新期间保持列结构.我个人会使用AutoGenerateColumns = false; 并在刷新的第一次传递时创建列.这样,如果用户调整列的大小,则不会在刷新时丢失它们的更改. (5认同)
  • @Alan为什么不使用BindingSource然后你可以刷新那么干净整洁而不是重新绑定的东西呢? (3认同)

Ale*_*mov 15

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

var itemStates = new List<ItemState>();
var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates };
dataGridView1.DataSource = bindingSource1;
Run Code Online (Sandbox Code Playgroud)

然后,在添加项目时,使用Add()方法BindingSource而不是列表的Add()方法:

for (var i = 0; i < 10; i++)
{
    bindingSource1.Add(new ItemState { Id = i.ToString() });
    System.Threading.Thread.Sleep(500);
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以将项目添加到列表中,并DataGridView使用相同的代码行通知这些添加项.无需重新设置DataGridViewDataSource每一个你做出改变,以列表的时间.

还值得一提的是,您可以BindingSource直接在Visual Studio的Forms Designer中将表单放到表单上,并将其作为数据源附加到您的表单中DataGridView,这样可以在上面的示例中为您节省一行代码,我手动执行此操作.

  • 此答案应该已收到正确答案标志。我的投票在这里。 (3认同)
  • 绝对是最好的答案 - 很遗憾另一个得到了这么多的赞成,但是收集它们的时间要长得多,以日期来判断! (2认同)