计算winforms网格视图中的列总数

本文关键字:winforms 网格 视图 计算 | 更新日期: 2023-09-27 18:20:45

表单内部有一个网格视图,其中填充了以下列

CODE, NAME, PRICE, QNT, TOTAL
1     Test  4.00    1   4.00
2     Test2 3.50    2   7.00

在这种情况下,我如何将该合计列计算为11.00,并将该值添加到labelOverall.Text属性?

感谢

更新

网格视图的填充方式如下

var sel = (Article)cmbArticleList.SelectedItem;
            DataRow newRow = articlesTable.NewRow();
            newRow["CODE"] = sel.Code;
            newRow["Name"] = sel.Name;
            articlesTable.Rows.Add(newRow);
            articlesGridView.DataSource = articlesTable;

计算winforms网格视图中的列总数

通常,您应该始终使用DataSource来计算总和,最好是在数据库本身中。但是,如果您希望稍后在客户端进行计算,那么您应该更喜欢网格的数据源,而不是解析单元格文本或使用网格的其他方法。

例如,在所有行数据绑定后直接触发的DataBound事件中:

protected void GridDataBound(object sender, EventArgs e)
{
    GridView grid = (GridView)sender;
    DataTable source = (DataTable)grid.DataSource;
    decimal totalSum = source.AsEnumerable().Sum(r => r.Field<decimal>("Total"));
    labelOverall.Text = totalSum.ToString();
}

请注意,Field方法是强类型的,如果它的实际类型不同,则抛出异常。

DataTable有一个Compute方法,允许您对表数据执行计算。

因此,要计算"总计"行的总和,您可以执行以下操作:

var sum = articlesTable.Compute("SUM(TOTAL)", "");
newRow["Total"] = sum;

这应该计算总和,然后更新"总计"行。

请记住在将行添加到表之前执行此操作。:-)

编辑:
Compute方法的第二个参数是一个筛选器表达式。这允许您在需要时筛选计算中包含的行。

作为执行

int sum;
sum = articlesTable.Compute("Sum(COLUMNNAME)", "COLUMNNAME<> 0"); 

现在sum得到该电量的总和

在代码中尝试以下操作:

int sum = 0;
for(int i=0; i<gv.Rows.Count; i++)
{
   sum += gv[i, 4].Value;
}

类似这样的东西:

labelOverall.Text  = articlesGridView.Rows.Cells.Select(n => Convert.ToDouble(n["TOTAL"].Value)).Aggregate((a,b) => a + b).ToInvariantString();

这将选择并转换所有总单元格,求和并将答案分配给labelOverall.Text