如何在网格视图中计算行的总和值并将其显示在网格视图中?
我有一个显示一些值的网格视图。现在我必须计算每行的这些值的行明智总和,然后显示它们。如何在网格视图中计算行的总和值并将其显示在网格视图中?
我试过这段代码,但由于输入字符串的格式不正确而出现错误。
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);
}
}
试图通过设置以下代码到Label8的项目模板:
<asp:TemplateField HeaderText="Col8">
<ItemTemplate>
<%# Convert.ToInt32(Eval("col1")) + Convert.ToInt32(Eval("col2")) + ... %>
</ItemTemplate>
</asp:TemplateField>
</asp:TemplateField>
检查它是否正常工作。
此代码非常感谢。 – 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;
}
}
我已将AutoGenerateColumns设置为false,并且使用以上代码与此代码我可能会出现错误,因为“输入字符串格式不正确” – user272315 2011-03-14 09:39:44
@user - 检查我的编辑。 – slugster 2011-03-14 10:02:01
感谢您回答我的问题。 – 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();
}
}
您能通过示例代码解释一下吗? – 2011-03-14 09:21:35