【发布时间】:2016-07-27 07:00:59
【问题描述】:
我已将 2 级数据绑定到 MS DataGridView。通过 Complex 属性填充的子表不可见。是否需要进行任何自定义才能在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的数据源加载代码。
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = new Data();
this.dataGridView1.DataSource = bindingSource;
this.dataGridView1.DataMember = "Level1Data";
我还有一个问题,在处理DataGridView 中的复杂属性数据时,我实现了INotifyPropertyChanged 来通知属性更改到网格的绑定数据源。虽然子表不可见,但我已经更改了子类属性的一些属性值,子类的PropertyChanged事件始终为空,因此不会通知属性更改。但是对于父类,总是通知属性更改。
为了解决子类的PropertyChanged 变为空,我为子类数据挂钩PropertyChanged 事件,同时为子表列表创建值。这样,属性就会得到正确的通知。
我的问题是,是否有任何特定的原因或必要性为子类挂钩 PropertyChanged 事件?因为没有对父级类属性进行连接。以及如何使用我的数据源在DataGridView 中显示子表?
请让我知道挂钩PropertyChanged 事件的必要性。
【问题讨论】:
标签: c# winforms datagridview parent-child inotifypropertychanged