如何在网格视图中计算行的总和值并将其显示在网格视图中?

问题描述:

我有一个显示一些值的网格视图。现在我必须计算每行的这些值的行明智总和,然后显示它们。如何在网格视图中计算行的总和值并将其显示在网格视图中?

我试过这段代码,但由于输入字符串的格式不正确而出现错误。

public void gv_RowCreated(Object sender, GridViewRowEventArgs e) 
{ 

    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     int total = Convert.ToInt32(e.Row.Cells[1].Text) + Convert.ToInt32(e.Row.Cells[2].Text) + Convert.ToInt32(e.Row.Cells[3].Text) + Convert.ToInt32(e.Row.Cells[4].Text) + Convert.ToInt32(e.Row.Cells[5].Text) + Convert.ToInt32(e.Row.Cells[6].Text) + Convert.ToInt32(e.Row.Cells[7].Text); 

     ((Label)gv.FindControl("Label8")).Text = Convert.ToString(total); 

    } 
} 
+1

您能通过示例代码解释一下吗? – 2011-03-14 09:21:35

试图通过设置以下代码到Label8的项目模板:

<asp:TemplateField HeaderText="Col8"> 
       <ItemTemplate> 
        <%# Convert.ToInt32(Eval("col1")) + Convert.ToInt32(Eval("col2")) + ... %> 
       </ItemTemplate> 
      </asp:TemplateField> 
</asp:TemplateField> 

检查它是否正常工作。

+0

此代码非常感谢。 – user272315 2011-03-14 10:07:11

我从想要的值相加在,而不是值的列(这是比较常用的)你的问题假设。

您的网格将绑定到IEnumerable对象列表,这些对象的属性将形成网格的列。

这样做的简单方法是在数据对象上再添加一个属性,该属性可以是其他属性的总和 - 因此您具有计算属性。

但是,您可能希望将此属性显示为网格中的最后一列,为了可靠地执行此操作(以非黑客方式),您需要专门声明列,即您必须设置AutoGenerateColumns假。

编辑:看你的代码后,

我不得不说这是一个有点丑陋的方式做到这一点(以这种方式和处理网格行很慢)。更好的方法是将计算的属性包含在数据对象中,并将计算封装在那里,因为您的网格仅用于显示,并且不需要对这些值本身有任何了解。

下面是一个例子的数据对象给你什么,我的意思是,我已经混了数据类型有些只是为了让一个想法要复杂一点:

public class MyDataObject 
{ 
    public int MyValue1 { get; set; } 

    public string MyValue2 { get; set; } 

    public decimal MyValue3 { get; set; } 

    public decimal MyTotal 
    { 
     get 
     { 
      return MyValue1 
        + MyValue3 
        + (string.IsNullOrWhiteSpace(MyValue2) ? 0 : Convert.ToInt32(MyValue2)); 
     } 
    } 

    //alternate version: 
    public decimal MyTotal2 
    { 
     get 
     { 
      return MyValue1 + MyValue3 + ConvertToInt(MyValue2, 0); 
     } 
    } 

    //helper method: 
    private int ConvertToInt(string input, int defaultVal) 
    { 
     int temp = 0; 
     if (int.TryParse(input, out temp)) 
      return temp; 
     return defaultVal; 

     //this can also be written more succinctly as: 
     //return int.TryParse(input, out temp) ? temp : defaultVal; 
    } 
} 
+0

我已将AutoGenerateColumns设置为false,并且使用以上代码与此代码我可能会出现错误,因为“输入字符串格式不正确” – user272315 2011-03-14 09:39:44

+0

@user - 检查我的编辑。 – slugster 2011-03-14 10:02:01

+0

感谢您回答我的问题。 – user272315 2011-03-14 10:08:00

使用这种代码是,

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     Label lblTotal = (Label)e.Row.FindControl("lblTotal"); 
     int iCount; 
     if (Decimal.TryParse(lblTotal.Text, iCount)) { 
      iCount += iCount; 
     } 
    } 
    if (e.Row.RowType == DataControlRowType.Footer) 
    { 
     Label lblTotalAmt = (Label)e.Row.FindControl("lblTotalAmt"); 
     lblTotalAmt.Text = iCount.ToString(); 
    } 
}