0

MS DataGridViewに2レベルのデータをバインドしました。 Complexプロパティによって設定された子テーブルは表示されません。ネストしたテーブルビューを有効にするために必要なカスタマイズがありますか?DataGridView添付のサンプルを参照してください。2レベルアイテムをDataGridviewにロードするには?

ここは私のDataSourceクラスです。

public class Level1 : INotifyPropertyChanged 
{ 
    bool a; 
    bool dispatch, abandon; 
    List<Level2> sample2data = new List<Level2>(); 

    // private Sample2 sampleval; 
    public Level1(bool value, bool disp, bool aban, List<Level2> val) 
    { 
     a = value; 
     dispatch = disp; 
     abandon = aban; 
     sample2data = val; 

    } 
    public bool Status 
    { 
     get { return a; } 
     set { a = value; OnPropertyChanged("A"); } 
    } 

    public bool Dispatch 
    { 
     get { return dispatch; } 
     set 
     { 
      dispatch = value; 
      sample2data.ForEach(item => item.SampleA = false); 
      OnPropertyChanged("Dispatch"); 
     } 

    } 
    public bool Abandon 
    { 
     get { return abandon; } 
     set { abandon = value; sample2data.ForEach(item => item.SampleB = true); OnPropertyChanged("Abandon"); } 
    } 

    public List<Level2> Sample2 
    { 
     get { return sample2data; } 
     set 
     { 
      sample2data = value; OnPropertyChanged("Sample2"); 
     } 
    } 

    public void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class Level2 : INotifyPropertyChanged 
{ 
    public Level2() 
    { 

    } 
    public bool _a, _b; 
    public bool SampleA 
    { 
     get { return _a; } 
     set { _a = value; OnPropertyChanged("SampleA"); } 
    } 
    public bool SampleB 
    { 
     get { return _b; } 
     set { _b = value; OnPropertyChanged("SampleB"); } 
    } 
    public bool SampleC 
    { 
     get; 
     set; 
    } 
    public void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 


class Data 
{ 
    public List<Level1> level1Data = new List<Level1>(); 
    public List<Level2> level2Data = new List<Level2>(); 
    public List<Level1> Level1Data 
    { 
     get { return level1Data; } 
     set { level1Data = value; } 
    } 
    public List<Level2> Level2Data 
    { 
     get { return level2Data; } 
     set { level2Data = value; } 
    } 
    public Data() 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      var newLevel2data = new Level2 
      { 
       SampleC = false 
      }; 
      level2Data.Add(newLevel2data); 
     } 
     for (int i = 0; i < 5; i++) 
     { 
      level1Data.Add(new Level1(false, false, false, level2Data)); 
     } 
    } 

} 

DataGridViewのデータソースの読み込みコードは次のとおりです。 DataGridViewで複雑なプロパティデータを扱う場合

BindingSource bindingSource = new BindingSource(); 
bindingSource.DataSource = new Data(); 
this.dataGridView1.DataSource = bindingSource; 
this.dataGridView1.DataMember = "Level1Data"; 

そしてまた、私はもう一つ質問があり、私はグリッドのバウンドデータソースへのプロパティの変更を通知するINotifyPropertyChangedを実装しています。子テーブルは表示されませんが、子クラスのプロパティの一部のプロパティ値が変更されました。子クラスのPropertyChangedイベントは常にnullなので、変更されたプロパティは通知されません。しかし、親クラスでは、変更されたプロパティは常に通知されます。

PropertyChangedを解決するには、子クラスの場合はNULLになりますが、子クラスのデータの場合はPropertyChangedイベントをフックして、子テーブルのリストの値を作成しています。これにより、プロパティが適切に通知されます。

ここで私の質問は、具体的な理由や必要性は、子クラスのPropertyChangedイベントをフックにはありますか?親レベルのクラスプロパティに対しては、接続が行われないためです。私のデータソースにDataGridViewの子テーブルを表示する方法は?

PropertyChangedイベントにフックする必要性を教えてください。

答えて

0

WindowsフォームDataGridViewは、ネストされたオブジェクトのバインドをサポートしていません。あなたはそれをサポートするために、元のコントロールを拡張する必要がありますので、私はあなたが以下の記事を見てみることをお勧め:

DataGridView: How to bind nested objects

記事のソースコードはGitHub上で見つけることができます。

上記の記事がお役に立てない場合は、お気に入りの検索エンジンでNested Windows Forms DataGridViewを検索してください。あなたが持っている問題は非常に共通しているので、多くの同様のリソースがあります。

編集:PropertyChangedイベントに関するご質問がありませんでした。正しく動作させるには、両方のクラスにINotifyPropertyChangedを実装する必要があります。

関連する問題