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

发布于 2024-12-09 04:14:03 字数 673 浏览 0 评论 0原文

我已经将 datagridview 的 DataSource 设置为 myBindingList。 列表项实现 INotifyPropertyChanged,以便 datagridview 自动响应列表中的更改。

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

应该在以下情况下完成:

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

第一个很清楚,但第二个有一个小问题。

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

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

但是呢:

myBindingList[myInvoice].Property1=newValue;

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

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

感谢您的帮助。

I've got datagridview with DataSource set to myBindingList.
Items of list implement INotifyPropertyChanged so datagridview automatically responds to changes in the list.

Now I have to calculate some summaries of datagridview columns.

It should be done when:

  • datasource changes(OnDataSourceChanged)
  • cell value changes(OnCellValueChanged)

First one is clear, but I've got a small problem with the second one.

OnCellValueChanged fires when the user changes value of cell by control or on:

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

but what about:

myBindingList[myInvoice].Property1=newValue;

DataGridView automatically refreshes (INotifyPropertyChanged) but it doesn't fire OnCellValueChanged event.

Any idea how can I get such info from my DataGridView?
It has to be done on DataGridView level because I'm writing my own control which extends dgv.

Thanks for the help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

才能让你更想念 2024-12-16 04:14:03

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

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

The best way I can think of to solve this is to use a BindingSource as the datasource and then within your custom DataGridView raise your own event in response to the BindingSource.ListChanged event.

I'd probably override OnDataSourceChanged with something like this:

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

The problem with this is that there is no way (I can think of) to get the correct cell properties so you would have to reevaluate all the columns, not just the column that contained the change.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文