这将是一个愚蠢的问题,但在集合中有一个Datagridview和一个数据对象。 de datagridview的数据源设置为此集合(类型为BindingList)。
当我更新属性时,将显示所有数据并且datagrid中的某些数据也会更新。但仅限于数据对象的第一级。更改第二级属性(来自嵌套对象)将不会使用新值自动刷新数据网格的数据列。
示例:
class A
{
public string SampleField;
public B ClassB;
}
class B
{
public string FieldB;
}
当B.FieldB类按代码更新时,datagridview不会显示更改。
我也尝试使用datagrid的CelLFormatting_Event,但它不会触发事件。
另一个解决方案是调用BindingList.ResetBindings(),但是在这种情况下,datagridview重新显示所有不好看的东西(你会看到al row再次构建)。
所以,我的问题是,解决这个问题的最佳解决方案是什么。
感谢。
答案 0 :(得分:1)
DGV未更新,因为您的代码在值更改时未通知DGV。您需要在两个类中实现INotifyPropertyChanged
。为此,您还需要将字段更改为属性:
class A : INotifyPropertyChanged
{
private string _sampleField;
public string SampleField
{
get { return _sampleField; }
set
{
_sampleField = value;
OnPropertyChanged("SampleField");
}
};
private B _classB
public B ClassB
{
get { return _classB; }
set
{
_classB = value;
OnPropertyChanged("ClassB");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHander handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName);
}
}
class B : INotifyPropertyChanged
{
private string _fieldB;
public string FieldB
{
get { return _fieldB; }
set
{
_fieldB = value;
OnPropertyChanged("FieldB");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHander handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName);
}
}