【问题标题】:winforms datagridview calculated field change eventwinforms datagridview 计算字段变化事件
【发布时间】:2026-02-08 09:55:01
【问题描述】:

我有一个从数据表绑定的 datagridview。我有一个计算列 linetotal 乘以单价 * 数量。

我还有一个 totalprice 标签,我想在 datagridview 中包含 linetotal 列的总和。

当用户对单价或数量进行任何更改时,该行的 linetotal 应该更新,并且 totalprice 标签应该对 linetotal 列求和。

我似乎找不到用于计算总价格标签的正确事件。我试过 cellvaluechanged、currentcelldirtystatechanged、rowleave。它们似乎都不能正常工作。我想我需要一个在计算完所有 linetotal 列后触发的事件。

我的伪代码:

dt = getallitems(itemnumber);
dt.Columns.Add("LineTotal", typeof(double));
dt.Columns["Linetotal"].Expression = "[unitprice] * [quantity]";

dgv.DataSource = dt;

private void dgv_WhatEventToUse???(object sender, DataGridViewCellEventArgs e)
{
    //method to iterate the rows of the datagridview, and sum linetotal column
}

当计算列的值改变时,一定有一些事件会触发。

【问题讨论】:

    标签: c# winforms datagridview datatable expression


    【解决方案1】:

    您的问题似乎来自您的计算列是 DataTable 的一部分而不是 DataGridView 的一部分。我不确定 DataGridView 是否会在 dgv 的基础数据源更改时公开事件。有 DataGridView.DataSourceChanged 事件,但这似乎只在您实际设置 DataSource 属性时触发,而不是在 DataTable 随您的计算而改变时触发。

    如果您想在不更改代码结构的情况下使其工作,请订阅 DataTable 的 RowChanged 事件,您可以扫描 dgv 并从那里更新您的标签。这不是一个干净的解决方案,但它确实有效。如果可以的话,我会考虑切换到 DataGridView 中的计算列。

    【讨论】:

      【解决方案2】:

      每次需要刷新计算数据列时,再次使用表达式的赋值即可。它对我有用。

      dt.Columns["Linetotal"].Expression = "[unitprice] * [quantity]"
      

      感谢我的代码

      private void malla18_Mask_Validated(object sender, EventArgs e)
      {
        analisis_Tabla_Lote.Columns["SUMA_MALLAS"].Expression = "100 - (Malla12 + Malla14 + Malla15 + Malla16 + Malla17 + Malla18 )";
        analisis_BindingSource.ResetBindings(false);
      }
      

      这就是你所需要的!

      【讨论】:

        【解决方案3】:

        通常我会在给出答案之前测试我的答案,但我在远离我的开发 PC 的情况下进行操作,所以我不能 100% 确定哪条路线是最好的,但这里有一些想法可以尝试。

        在 DataGridView 上,您可以使用 CellEndEdit 事件来判断单元格何时被编辑。还有一个CellLeave 事件,但我没有使用它,你可能需要尝试一下。

        在 DataGrid 上,您可以使用 CurrentCellChanged 事件。

        但是,要进行任何计算,您需要从底层 Dataable 或 DataView 中提取值(取决于控件绑定到的内容)。我还发现使用 DataGrid.CurrentCellChanged 事件是错误的,当 DataGrid 是数据包时它会被抛出,而不仅仅是在用户编辑内容时,所以你可能需要与之抗衡......我想 DataGridView 的 CellLeave事件可能有类似的问题。就像我说的,我不能 100% 确定,所以你需要尝试一下。

        此外,正如 Kyle 所建议的,您可以尝试使用来自底层数据源的事件。

        DataTable.RowChanged 或 DataView.ListChanged 事件将是我开始的地方。

        正如我所说,我无法自己测试这些,但希望其中一个想法能为您指明正确的方向。

        【讨论】: