0

在表单内部有 gridview 填充以下列

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

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

谢谢

更新

Gridview 是这样填充的

var sel = (Article)cmbArticleList.SelectedItem;

            DataRow newRow = articlesTable.NewRow();
            newRow["CODE"] = sel.Code;
            newRow["Name"] = sel.Name;

            articlesTable.Rows.Add(newRow);
            articlesGridView.DataSource = articlesTable;
4

5 回答 5

2

一般来说,您应该始终使用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方法是强类型的,如果它的实际类型不同,则会引发异常。

于 2013-07-02T09:19:51.913 回答
1

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

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

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

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

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

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

于 2013-07-02T09:18:15.807 回答
0

在您的代码中尝试以下操作:

int sum = 0;
for(int i=0; i<gv.Rows.Count; i++)
{
   sum += gv[i, 4].Value;
}
于 2013-07-02T09:15:22.130 回答
0

像这样的东西:

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

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

于 2013-07-02T09:17:54.143 回答
0

这样做

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

现在sum得到那个库的总数

于 2013-07-02T09:19:52.133 回答