我有datagridview,DataSource设置为myBindingList。 列表项目实现INotifyPropertyChanged,因此datagridview会自动响应列表中的更改。
现在我必须计算一些datagridview列的摘要。
应该在以下时间完成:
第一个很清楚,但第二个问题我遇到了一个小问题。
当用户通过控制或更改时更改单元格的值时,将触发OnCellValueChanged:
myDataGridView.Rows[x].Cells[y].Value=newValue;
但是:
myBindingList[myInvoice].Property1=newValue;
DataGridView会自动刷新(INotifyPropertyChanged),但它不会触发OnCellValueChanged事件。
任何想法如何从我的DataGridView获取此类信息? 它必须在DataGridView级别上完成,因为我正在编写自己的控件,扩展了dgv。
感谢您的帮助。
答案 0 :(得分:0)
我能想到解决这个问题的最接近的方法是使用BindingSource作为数据源,然后在自定义DataGridView中引发自己的事件以响应BindingSource ListChanged事件。
我可能会覆盖OnDataSourceChanged这样的东西:
public event EventHandler CustomCellValueChanged;
protected override void OnDataSourceChanged(EventArgs e)
{
bs = this.DataSource as BindingSource;
if (bs == null)
{
throw new ArgumentException("DataSource must be a BindingSource");
}
bs.ListChanged += new System.ComponentModel.ListChangedEventHandler(bs_ListChanged);
base.OnDataSourceChanged(e);
}
void bs_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
{
if (CustomCellValueChanged != null)
{
CustomCellValueChanged(this, new EventArgs());
}
}
问题在于,我无法(我能想到)获得正确的单元格属性,因此您必须重新评估所有列,而不仅仅是包含更改的列。