汇总列值并使用标签显示在列的正下方

时间:2014-03-10 12:55:29

标签: asp.net

这是我的gridview设计。

 <asp:GridView ID="GridView1" runat="server" HorizontalAlign="Center" CellPadding="3"
                GridLines="Both" ShowFooter="True" CssClass="contentfont">
                <RowStyle Wrap="False" />                    
                <HeaderStyle Wrap="False" Height="25px" />
                <FooterStyle Forecolor="Black" BackColor="LightGray" />
            </asp:GridView>

从DB绑定列后,此grdiview有大约8列。现在,我需要将某些列的总值相加并使用标签将其显示在列的正下方。如果需要添加,删除,编辑和更新功能,我可以添加带标签的footerrow。由于gridview是只读的,不需要更新,我很困惑如何实现这一点。

查询:

我正在使用此查询来绑定网格。我需要在我的选择查询中对除前两个之外的所有列进行求和。

command.CommandText = "select AppName, Year, RevisedValue, SalesProfit, Variance, MonthlyProfit, QuarterProfit, YearlyProfit from Reports 

任何人都可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您没有指定存储数据的方式,因此我将使用数据表,在我的示例中将称为DTable。

将以下颂歌添加到您的标记中:

<asp:GridView ID="GridView1" /* .... */ OnRowDataBound="GridView1_RowDataBound">                
</asp:GridView>

编辑从这里我编辑了帖子,用我在示例项目中测试的代码进行更改。我使用AdventureWorks数据库来获取一些示例数据。为了快速实现,我使用Linq-to-Entites获取数据并将其绑定到GridView。 在此之后,我使用上面提到的OnRowDataBound="GridView1_RowDataBound来计算页脚值。

    void Page_Load(Object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            using (var context = new AdventureWorks2008R2Entities())
            {
                var result = context.Products.Where(p => p.ListPrice != 0)
                                    .Select(x => new
                                    {
                                        Name = x.Name,
                                        ListPrice = x.ListPrice,
                                        StandardCost = x.StandardCost
                                    })
                                    .Take(5);
                GridView1.DataSource = result.ToList();
                GridView1.DataBind();
            }
        }

    }

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        using (var context = new AdventureWorks2008R2Entities())
        {
            var result = context.Products.Where(p => p.ListPrice != 0)
                                .Select(x => new
                                {
                                    Name = x.Name,
                                    ListPrice = x.ListPrice,
                                    StandardCost = x.StandardCost
                                })
                                .Take(5);
            if (e.Row.RowType == DataControlRowType.Footer)
            {
                e.Row.Cells[1].Text = result.ToList().Sum(x => x.ListPrice).ToString();
                e.Row.Cells[2].Text = result.ToList().Sum(x => x.StandardCost).ToString();
            }   
        }
    }

输出:

GridView calculated footer

*注意:*此代码远非最佳,因为我两次查询数据库。请不要在生产代码中使用它。获取数据,将其存储在数据库中然后计算内存中所需字段的Sum()可能更好。