我有一个从数据表绑定的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
}
当计算列的值发生变化时,必定会触发一些事件。
答案 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事件将是我开始的地方。
正如我所说,我无法自己测试这些,但希望其中一个想法可以指出你正确的方向。