protected void inderGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
decimal rowTotal = Convert.ToDecimal
(DataBinder.Eval(e.Row.DataItem, "DC_No_Decimal"));
//grdTotal = grdTotal + rowTotal;
grdTotal += rowTotal;
}
if (e.Row.RowType == DataControlRowType.Footer)
{
Label lbl = (Label)e.Row.FindControl("lblTotal");
e.Row.Cells[3].Text = grdTotal.ToString("c");
//lbl.Text = grdTotal.ToString("c");
}
}
从上面的代码我得到网格视图中每个页面的总数。我没有得到每个页面的总数,而是需要在网格视图页脚末尾的所有页面总数。帮助Immediatly。 提前致谢
答案 0 :(得分:1)
如果您想要所有页面的总数,并且页脚只显示在最后一页上,那么您无法计算总体情况。
此时你循环遍历gridview上的每一行。如果您使用分页,gridview将不会显示所有行,因此总计将不正确。
您是使用PagedDataSource
进行分页还是限制从SQL等返回的记录?如果您使用DataSet
和PagedDataSource
,您将能够从DataSet中找到总数(因为这将包含所有记录)。否则,您将不得不创建第二个查询来计算总数。
然后,就在页脚中显示值而言,您必须在IF
事件中添加ItemDataBound
语句,以便仅显示最终页面。
答案 1 :(得分:0)
Noddy,但你可以在if条件下再试一次。
if(e.Row.RowType == DataControlRowType.Footer && inderGrid.PageCount == inderGrid.PageIndex + 1)
{
//code here.
}
//试试这个
if(e.Row.RowType == DataControlRowType.Footer && inderGrid.PageCount == inderGrid.PageIndex + 1)
{
for (int i=0; i< inderGrid.Rows.Count; i++)
{
var currentRowCellVal = Convert.ToDecimal(inderGrid.Rows[i].Cells[0].Text);
grdTotal += currentRowCellVal;
}
e.Row.Cells[3].Text = grdTotal.ToString("c");
}
答案 2 :(得分:0)
如果您尝试显示记录摘要,请查看有关Displaying Summary Information in the GridView's Footer
的内容答案 3 :(得分:0)
我所做的是在后面的代码中设置以下内容(这只是一个示例列):
int totalCallsTaken = 0;
public int CallsTaken(int value)
{
totalCallsTaken += value;
return value;
}
public int CallsTakenTotal()
{
return totalCallsTaken;
}
然后在ASPX页面中,我将以下模板字段放在:
中<asp:TemplateField HeaderText="Calls Taken" FooterStyle-Font-Bold="true">
<ItemTemplate>
<%#CallsTaken(Convert.ToInt32(Eval("CallsTakenCount").ToString())).ToString("N0")%>
</ItemTemplate>
<FooterTemplate>
<%#CallsTakenTotal().ToString("N0")%>
</FooterTemplate>
</asp:TemplateField>
我希望有帮助,伊恩。
答案 4 :(得分:0)
只是为了确定我理解,你说你有一个说100个项目的网格,但在任何给定时间只显示25个。然后,您希望页脚仅显示页面上显示的那25个项目的总和。
您可以在此处执行以下几个选项:
1)使用JavaScript计算页面渲染后的总数。
2)使用智能SQL仅返回您想要在网格上显示的特定行 - 然后保持网格相同
3)计算代码中的可见行,并仅在需要时添加它们。请记住,你知道你所使用的Grid.PageIndex背后的代码以及每个页面有多少项。有了这些知识,您应该能够通过行索引确定是否将任何给定的数据行呈现给屏幕。
答案 5 :(得分:0)
您需要使用实际数据生成所有记录总数。
如果您正在数据 - 父(数据库)端进行分页,那么您在数据分析方面有总数 - 您可以使用返回页面记录的相同SP来返回所有记录的总和。如果要检索所有记录并在Web服务器端进行分页,则可以使用检索数据源进行总计。
从优化角度来看,您可以计算一次总数并将其存储在视图状态中 如果您希望在最后一行显示页脚,则可以使用ShowFooter - 仅在最后一页上将其设置为true。
答案 6 :(得分:0)
您需要做的就是检查您的行是否在当前页面中并进行计算。 例如,像这样:
if (e.Row.RowType == DataControlRowType.DataRow)
{
decimal rowTotal = Convert.ToDecimal
(DataBinder.Eval(e.Row.DataItem, "DC_No_Decimal"));
if (e.Row.DataItemIndex >= inderGrid.PageIndex * inderGrid.PageSize
&& e.Row.DataItemIndex < inderGrid.PageIndex * inderGrid.PageSize + inderGrid.PageSize)
grdTotal += rowTotal;
}
答案 7 :(得分:0)
试试这个,
using System.Linq;
dt.AsEnumerable().Select(x => x.Field<decimal>("DC_No_Decimal")).Sum().ToString();
you can use the code like this for get sum at the footer
gv.DataSource = dt;
gv.Columns[2].FooterText = dt.Rows.Count > 0 ? dt.AsEnumerable().Select(x => x.Field<decimal>("DC_No_Decimal")).Sum().ToString() : "";
gv.DataBind();