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
イベントにフックする必要性を教えてください。