winforms datagridview计算字段更改事件

时间:2009-08-10 22:51:42

标签: c# winforms datagridview datatable expression

我有一个从数据表绑定的datagridview。我有一个计算的列linetotal,倍数unitprice *数量。

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

当用户对unitprice或quantity进行任何更改时,linetotal应更新该行,而totalprice标签应该对linetotal列求和。

我似乎无法找到用于计算总价标签的正确事件。我尝试过cellvaluechanged,currentcelldirtystatechanged,rowleave。他们似乎都没有正常工作。我想我需要在计算完所有的总计列之后触发的事件。

我的伪代码:

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
}

当计算列的值发生变化时,必定会触发一些事件。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

每次需要刷新计算数据列时,只需再次使用expresion。它对我有用。

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

我的代码中的verbi gratia

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

这就是你所需要的一切!

答案 2 :(得分:0)

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

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

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

但是,要进行任何计算,您需要从基础Dataable或DataView中提取值(取决于控件绑定的内容)。我还发现使用DataGrid.CurrentCellChanged事件是错误的,当DataGrid是数据绑定时它是throwwn,而不仅仅是当用户编辑内容时,所以你可能需要与之抗争......我会想象DataGridView的CellLeave事件可能有类似的问题。就像我说的那样,我不是百分百肯定,所以你需要进行实验。

另外,正如Kyle建议的那样,您可以尝试使用基础DataSource中的事件。

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

正如我所说,我无法自己测试这些,但希望其中一个想法可以指出你正确的方向。