DataGridView和BindingList:如何检查单元格值是否已更改?

Grz*_*rzM 5 c# datagridview winforms

我有datagridview,DataSource设置为myBindingList.列表项目实现INotifyPropertyChanged,因此datagridview自动响应列表中的更改.

现在我必须计算一些datagridview列的摘要.

它应该在以下时间完成:

  • 数据源更改(OnDataSourceChanged)
  • 单元格值更改(OnCellValueChanged)

第一个很清楚,但第二个问题我遇到了一个小问题.

当用户通过控制或更改时更改单元格的值时,将触发OnCellValueChanged:

myDataGridView.Rows[x].Cells[y].Value=newValue;
Run Code Online (Sandbox Code Playgroud)

但是关于:

myBindingList[myInvoice].Property1=newValue;
Run Code Online (Sandbox Code Playgroud)

DataGridView会自动刷新(INotifyPropertyChanged),但它不会触发OnCellValueChanged事件.

知道如何从我的DataGridView获取此类信息?它必须在DataGridView级别上完成,因为我正在编写自己的控件,扩展了dgv.

谢谢您的帮助.

Dav*_*all 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

问题在于,(我能想到的)无法获得正确的单元格属性,因此您必须重新评估所有列,而不仅仅是包含更改的列。