首页 文章

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

提问于
浏览
5

我有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

    我能想到的最接近的解决方法是使用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());
        }
    }
    

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

相关问题