Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridView和List的数据绑定<&燃气轮机;使用BindingSource_C#_.net_Data Binding_Bindingsource - Fatal编程技术网

C# DataGridView和List的数据绑定<&燃气轮机;使用BindingSource

C# DataGridView和List的数据绑定<&燃气轮机;使用BindingSource,c#,.net,data-binding,bindingsource,C#,.net,Data Binding,Bindingsource,我试图弄清楚使用BindingSource进行数据绑定应该如何工作 我希望在更新列表时用列表的内容填充DataGridView 我可以看到列表增长,并在检查调试器时验证它是否已填充。我以为BindingSource会在列表更改时触发事件。但所有可用的都没有被解雇。当基础列表发生更改时,如何通知我 我按照说明进行操作,并具有以下测试代码: Data d; BindingSource bs; public Form1() { InitializeCo

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

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

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

    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();
    }

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

请参阅以获取示例。

列表
不支持更改事件
BindingList
将是支持此场景的一个很好的替代方案,如果您的类型
T
实现了
INotifyPropertyChanged
,它还支持项目级更改事件

在3.0及以上版本中,还有一个类似于
BindingList
。所有这些都归结为接口,如
IBindingList
IBindingListView
,等等


根据评论;对于将
Find
添加到
BindingList
的2.0/3.0示例:

公共类MyBindingList:BindingList
{
公共T查找(谓词)
{
如果(谓词==null)抛出新的ArgumentNullException(“谓词”);
foreach(本文件中的T项)
{
if(谓词(项))返回项;
}
返回默认值(T);
}
}

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

这很有效,谢谢,但是对于BindingList,我没有一个compare方法,可以向其传递谓词(我发现它非常有用)。我用它来防止列表中的重复项。。。我是否可以通过对象属性循环检查列表的存在性?您可以使用LINQ,这很好。或者子类
BindingList
,并添加一些缺少的方法(非常容易做到——如果您想了解如何使用谓词,请告诉我)。正如Marc Gravell所述,它无法使用List。因此,我采用BindingList的方法。
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);
    }
}