teisipäev, 25. august 2009

GridView ridade kokkusummeerimine Contentpage ja UpdatePanel-i sees .NET Framework 3.5 SP1

Kui on Masterpage sees asp:Content lehekülg mille see on UpdatePanel ja selle sees GridView võib juhtuda, et
GridView RowDataBound kutsutakse kaks korda välja, kusjuures mõnel serveril töötab korralikult mõnel aga mitte, täitsa kuidas juhtub.
Kui nüüd summerida GridView RowDataBound eventis mingeid väärtusi kokku võib saada topelt tulemuse ja juhtub see täiesti suvaliselt

if (e.Row.RowType == DataControlRowType.DataRow)
{
this.tsumma += Convert.ToDecimal(((System.Data.DataRowView)e.Row.DataItem)["total_summa"]);
}
if (e.Row.RowType == DataControlRowType.Footer)
{
e.Row.Cells[2].Text = Resources.Resource.Total;
e.Row.Cells[3].Text = String.Format("{0:F2}", this.tsumma);
}

Siin võib juhtuda, et summa on tegelikult kahekordselt arvutatud.

Lahendusena võib summerimise tuua GridView DataBound eventisse
this.tsumma=0;
foreach (GridViewRow rida in this.GridViewArved.Rows)
{
if (rida.RowType == DataControlRowType.DataRow)
{
Label rs = (Label)rida.FindControl("LabelArveSumma");
if (rs != null)
{
this.tsumma += Convert.ToDecimal(rs.Text.Trim());
}
}
}
if (this.GridViewArved.FooterRow != null)
{
this.GridViewArved.FooterRow.Cells[2].Text = Resources.Resource.Total;
this.GridViewArved.FooterRow.Cells[3].Text = String.Format("{0:F2}", this.tsumma);
}


LabelArveSumma on GridView TeplateField-is olev WebControl
<asp:TemplateField SortExpression="total_summa" HeaderText="<%$ Resources:resource, InvoiceTotal %>">
<ItemTemplate>
<asp:Label ID="LabelArveSumma" runat="server"
Text='<%# Eval("total_summa", "{0:F2}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Blogged with the Flock Browser