怎么可能?
List<T>
未实现IBindingList
/ IBindingListView
- 因此无法提供UI更新。您将需要更改一些代码以适应BindigList api。
答案 0 :(得分:2)
UI通知通常通过事件完成。在这种情况下,这意味着IBindingList和ListChanged
事件;还有一些侧面接口,比如IBindingListView,以及一些其他可选的东西,用于改进列表添加等。BindingList<T>
支持你需要的几乎所有东西,但结果却有一些小的开销。
相比之下,List<T>
故意提供 none ;它是一个通用(和快速)动态列表设备,而不是“观察者”设备。
注意,如果您需要逐个单元格更新,通常还需要您的类型T
来实现INotifyPropertyChanged;如果没有这个,你只能获得行级更新(添加,删除等)。
例如:
using System;
using System.ComponentModel;
using System.Windows.Forms;
static class Program
{
class Foo
{
public int A { get; set; }
public string B { get; set; }
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
using (var form = new Form())
using (var grid = new DataGridView { Dock = DockStyle.Fill })
using (var add = new Button { Dock = DockStyle.Bottom, Text = "add" })
using (var remove = new Button { Dock = DockStyle.Top, Text = "remove" })
{
form.Controls.Add(grid);
form.Controls.Add(add);
form.Controls.Add(remove);
var lst = new BindingList<Foo>();
var rnd = new Random();
add.Click += delegate
{
lst.Add(new Foo { A = rnd.Next(1, 6), B = "new" });
};
remove.Click += delegate
{
int index = 0;
foreach (var row in lst)
{ // just to illustrate removing a row by predicate
if (row.A == 2) { lst.RemoveAt(index); break; }
index++;
}
};
grid.DataSource = lst;
Application.Run(form);
}
}
}