4

我有一个从数据表绑定的 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
}

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

4

3 回答 3

1

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

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

这就是你所需要的!

于 2012-04-21T05:10:41.403 回答
1

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

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

于 2009-08-10T23:40:31.817 回答
0

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

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

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

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

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

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

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

于 2009-08-11T02:56:08.043 回答