Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# winforms datagridview计算字段更改事件_C#_Winforms_Datagridview_Datatable_Expression - Fatal编程技术网

C# winforms datagridview计算字段更改事件

C# winforms datagridview计算字段更改事件,c#,winforms,datagridview,datatable,expression,C#,Winforms,Datagridview,Datatable,Expression,我有一个从datatable绑定的datagridview。我有一个计算列linetotal,它乘以单价*数量 我还有一个totalprice标签,我想在datagridview中包含linetotal列的总和 当用户对单价或数量进行任何更改时,该行的linetotal应更新,totalprice标签应与linetotal列相加 我似乎找不到用于计算totalprice标签的正确事件。我尝试了cellvaluechanged、currentcelldirtystatechanged和rowlea

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

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

当用户对单价或数量进行任何更改时,该行的linetotal应更新,totalprice标签应与linetotal列相加

我似乎找不到用于计算totalprice标签的正确事件。我尝试了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
}

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

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


如果希望在不更改代码结构的情况下使其正常工作,请订阅DataTable的RowChanged事件,然后可以扫描dgv并从此处更新标签。这不完全是一个干净的解决方案,但它是有效的。我会考虑在DATAGRIDVIEW中切换到一个计算列,如果这是一个选项。

通常我在给出答案之前测试我的答案,但是我正在远离我的DEV PC,所以我不确定哪条路线是最好的,但是这里有一些想法可以尝试。 在DataGridView上,您可以使用事件来告知单元格何时被编辑。还有一个事件,但我还没有使用它,你可能需要尝试一下

在DataGrid上,可以使用事件

但是,要进行任何计算,您需要从基础Dataable或DataView中提取值(取决于控件绑定到的内容)。我还发现,使用DataGrid.CurrentCellChanged事件是有缺陷的,当DataGrid是databaound时,而不仅仅是当用户编辑内容时,就会发生错误,因此您可能需要解决这个问题。。。我想DataGridView的CellLeave事件可能也有类似的问题。就像我说的,我不是100%确定,所以你需要进行实验

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

DataTable.RowChanged或DataView.ListChanged事件将是我的起点


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

每次需要刷新计算数据列时,只需再次使用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);
}
这就是你所需要的