IBindingList和IBindingListView

时间:2011-02-05 11:03:34

标签: c# list

怎么可能?

List<T>未实现IBindingList / IBindingListView - 因此无法提供UI更新。您将需要更改一些代码以适应BindigList api。

1 个答案:

答案 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);
        }
    }
}