4

私はこれを投稿しますが、それを解決するために数時間を費やした後、私はどこにも行きません。まず、WinFormsでのデータバインディングが最適ではないことを十分に認識しています。とはいえ、ほとんどのシナリオで機能します。

私のシナリオでは、フォームのマスターであるバインディングソースがあります。このバインディングソースに使用されるオブジェクトには、いくつかの単純なプロパティと、プロパティとして2つのバインディングリストがあります。このクラスとバインディングリストのクラスタイプの両方がINotifyPropertyChangedを実装します。私のフォームには、バインディングリストのプロパティの内容を表示するための2つのDataGridViewがあります。

これも、設計時にデータバインディングを介して行われます。それぞれに2つのバインディングソースがあり、メインのバインディングソースをデータソースとして使用し、次にそれぞれのバインディングリストプロパティをデータメンバーとして使用します。

これまでのところ、これはかなり標準的なものだと思います。

これらのリストの内容を更新するために、新しいアイテムを作成するフォームを表示するボタンがあり、BindingList.Add()を使用してリストに追加します。

コードでは、デバッグすると、アイテムはリストに含まれますが、グリッドは更新されません。しかし、リストバインディングソースの1つだけを使用するフォームにリストボックスを追加すると、両方のグリッドが期待どおりに更新を開始します。

不明な点がある場合はお詫び申し上げます。混乱を招く状況で、できる限り説明するように努めました。

非表示のリストボックスを使用する必要は本当にないので、どんな考えでも役に立ちます。

4

1 に答える 1

5

このコードは私にとってはうまくいきます

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を変更しました

于 2013-01-16T15:02:28.947 に答える