时间:2011-10-10 10:47:00

标签: c# winforms datagridview

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

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

应该在以下时间完成:

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

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

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

myDataGridView.Rows[x].Cells[y].Value=newValue;

但是:

myBindingList[myInvoice].Property1=newValue;

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

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

感谢您的帮助。

1 个答案:

答案 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());
    }
}

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