C# winforms datagridview计算字段更改事件
我有一个从datatable绑定的datagridview。我有一个计算列linetotal,它乘以单价*数量 我还有一个totalprice标签,我想在datagridview中包含linetotal列的总和 当用户对单价或数量进行任何更改时,该行的linetotal应更新,totalprice标签应与linetotal列相加 我似乎找不到用于计算totalprice标签的正确事件。我尝试了cellvaluechanged、currentcelldirtystatechanged和rowleave。它们似乎都不正常。我想我需要一个在计算完所有linetotal列后激发的事件 我的伪代码: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
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);
}
这就是你所需要的