4

我试图弄清楚数据绑定BindingSource应该如何工作我希望在更新列表时DataGridView用 a 的内容填充。List<>

当我检查调试器时,我可以看到List增长并验证它正在被填充。我认为在更改BindingSource时会触发一个事件。List但是没有一个可用的被解雇。当基础列表更改时,我如何收到通知?

我按照说明进行操作并具有以下测试代码:

    Data d;
    BindingSource bs;

    public Form1()
    {
        InitializeComponent();
        bs = new BindingSource();
        d = new Data();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        bs.DataSourceChanged += new EventHandler(bs_DataSourceChanged);
        bs.ListChanged += new ListChangedEventHandler(bs_ListChanged);
        bs.DataMemberChanged += new EventHandler(bs_DataMemberChanged);
        bs.CurrentChanged += new EventHandler(bs_CurrentChanged);
        bs.CurrentItemChanged += new EventHandler(bs_CurrentItemChanged);

        bs.DataSource = d.list;
        dataGridView1.DataSource = bs;
    }
    // ... all the handling methods caught with a break point in VS.

    private void button1_Click(object sender, EventArgs e)
    {
        d.addOneItem();
    }
4

2 回答 2

8

List<T>不支持更改事件;将是支持这种情况的一个很好的替代品,如果您的类型实现BindingList<T>,它还支持项目级更改事件。TINotifyPropertyChanged

在 3.0 及更高版本中,还有ObservableCollection<T>,其作用类似于BindingList<T>。这一切都归结为诸如IBindingList,IBindingListView等接口。


来自评论;对于添加Find到的 2.0/3.0 示例BindingList<T>

public class MyBindingList<T> : BindingList<T>
{
    public T Find(Predicate<T> predicate)
    {
        if (predicate == null) throw new ArgumentNullException("predicate");
        foreach (T item in this)
        {
            if (predicate(item)) return item;
        }
        return default(T);
    }
}

请注意,在 3.5 中(或在带有 LINQBridge 和 C# 3.0 的 .NET 2.0/3.0 中)你不需要这个 - 任何 LINQ 扩展方法都会做同样的事情。

于 2009-12-04T12:23:49.390 回答
0

如果您想在属性更改时收到通知,您需要实现INotifyPropertyChanged

有关示例,请参见此处。

于 2009-12-04T11:57:14.173 回答