gridview与网格的最后一页中的页脚行总数

时间:2011-11-03 05:31:25

标签: asp.net

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。 提前致谢

8 个答案:

答案 0 :(得分:1)

如果您想要所有页面的总数,并且页脚只显示在最后一页上,那么您无法计算总体情况。

此时你循环遍历gridview上的每一行。如果您使用分页,gridview将不会显示所有行,因此总计将不正确。

您是使用PagedDataSource进行分页还是限制从SQL等返回的记录?如果您使用DataSetPagedDataSource,您将能够从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();