计算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;
通常,您应该始终使用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
。