与DataGridView的WinForms数据绑定

本文关键字:数据绑定 WinForms DataGridView | 更新日期: 2023-09-27 17:53:49

我想我会在花了几个小时试图解决这个问题之后发布这个,我一无所获。首先,我充分意识到WinForms中的数据绑定并不是最好的。也就是说,它在大多数情况下都有效。

在我的场景中,我有一个绑定源,它是我的表单的主。用于此绑定源的对象有几个简单的属性和两个绑定列表作为属性。这个类和绑定列表的类类型都实现了INotifyPropertyChanged。在我的表单中,我有两个datagridview用于显示绑定列表属性的内容。

这也是通过设计时的数据绑定完成的。我有两个绑定源,每个都使用主绑定源作为数据源,然后使用各自的bindinglist属性作为数据成员。

到目前为止,我认为这是相当标准的。

为了更新这些列表中的内容,我使用按钮来显示创建新项目的表单,然后使用BindingList.Add()将其添加到列表中。

现在在代码中,如果您调试,项目在列表中,但是,网格没有更新。但是如果我在表单中添加一个列表框,而这个列表框只使用其中一个列表绑定源,那么这两个网格就会像预期的那样开始刷新。

如果有任何不清楚的地方,我很抱歉,我已经尽我所能解释这个令人困惑的情况。

任何想法都会有帮助,因为我真的不想使用隐藏列表框

与DataGridView的WinForms数据绑定

这段代码可以正常运行

BindingList<Foo> source; // = ...
private void Form1_Load(object sender, EventArgs e)
{
    this.dataGridView1.DataSource = new BindingSource { DataSource = source };
    this.dataGridView2.DataSource = new BindingSource { DataSource = source, DataMember = "Children" };
}
private void button1_Click(object sender, EventArgs e)
{
    source.Add(new Foo { X = Guid.NewGuid().ToString() });
}
private void button2_Click(object sender, EventArgs e)
{
    source[0].Children.Add(new FooChild { Y = Guid.NewGuid().ToString() });
}

与模型

public class Foo : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    string x;
    public string X
    {
        get { return x; }
        set
        {
            x = value;
            this.NotifyPropertyChanged();
        }
    }
    BindingList<FooChild> children;
    public BindingList<FooChild> Children
    {
        get { return children; }
        set
        {
            children = value;
            this.NotifyPropertyChanged();
        }
    }
}
public class FooChild : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    string y;
    public string Y
    {
        get { return y; }
        set
        {
            y = value;
            this.NotifyPropertyChanged();
        }
    }
}

刷新两个网格。

我希望这对你有帮助

编辑

我改变了Form1_Load impl