2011-10-10 93 views
5

我有datagrid设置为myBindingList datagridview。 列表项的实现INotifyPropertyChanged使datagridview自动响应列表中的更改。DataGridView&BindingList:如何检查单元格值是否已更改?

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

它应该做的事的时候:

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

第一个是明确的,但我有一个小问题,第二个。

OnCellValueChanged火灾时,用户通过控制或改变细胞的价值:

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

但什么:

myBindingList[myInvoice].Property1=newValue; 

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

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

感谢您的帮助。

回答

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

这样做的问题是,有没有办法(我能想到的),以获得正确的单元格属性,所以你将不得不重新评估所有列,而不仅仅是包含更改的列。

相关问题