【问题标题】:DataBinding of DataGridView and List<> with BindingSourceDataGridView 和 List<> 的 DataBinding 与 BindingSource
【发布时间】:2009-12-04 11:45:08
【问题描述】:

我试图弄清楚与BindingSource 的数据绑定应该如何工作 我希望在更新列表时用List&lt;&gt; 的内容填充DataGridView

当我检查调试器时,我可以看到 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();
    }

【问题讨论】:

    标签: c# .net data-binding bindingsource


    【解决方案1】:

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

    在 3.0 及更高版本中,还有ObservableCollection&lt;T&gt;,其作用类似于BindingList&lt;T&gt;。这一切都归结为IBindingListIBindingListView等接口。


    来自 cmets;对于将Find 添加到BindingList&lt;T&gt; 的2.0/3.0 示例:

    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 扩展方法都会做同样的事情。

    【讨论】:

    • 这行得通,谢谢,但是使用 BindingList 我没有比较方法,我可以将谓词传递给它(我发现它非常有用)。我用它来防止列表中的重复...我会绕过列表检查对象属性的存在吗?
    • 您可以使用 LINQ,它可以正常工作。或者子类BindingList&lt;T&gt; 并添加一些缺失的方法(很容易做到 - 如果你想看看如何用谓词做到这一点,请告诉我)。
    【解决方案2】:

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

    有关示例,请参阅 here

    【讨论】:

    • 它不适用于 List,正如 Marc Gravell 所说。所以我遵循 BindingList 的方法。
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2021-09-15
    • 2018-05-13
    • 1970-01-01
    • 2012-09-25
    • 2011-10-17
    • 2010-09-30
    相关资源
    最近更新 更多