【问题标题】:How to calculate totals of column data?如何计算列数据的总数?
【发布时间】:2015-03-13 06:19:45
【问题描述】:

我正在从返回给我的存储过程中填写GridView

但问题在最后一行,你可以看到它返回了 TotalTransactions 列的总和,但我想要的只是总数的总和,即被包围的元素,并且它在

上增长
<asp:GridView ID="GridViewConductorTransactions" runat="server" Width="100%" AutoGenerateColumns="False"
              ShowFooter="True" OnRowDataBound="GridViewConductorTransactions_RowDataBound" CssClass="table table-hover table-striped table-bordered">
    <Columns>
        <asp:TemplateField HeaderText="Conductor Name" HeaderStyle-CssClass="visible-desktop" ItemStyle-CssClass="visible-desktop">
            <ItemTemplate>
                <asp:Label ID="lblConductorName" runat="server" Text='<%# Eval("ConductorName") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:Label ID="totals" runat="server" Text="Totals"></asp:Label>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Denominations" HeaderStyle-CssClass="visible-desktop" ItemStyle-CssClass="visible-desktop">
            <ItemTemplate>
                <asp:Label ID="lblDenomination" runat="server" Text='<%# Eval("Denomination") == DBNull.Value ? "Grand Total" : Eval("Denomination") %>'></asp:Label>
            </ItemTemplate>
            <%--<FooterTemplate>
                <asp:Label runat="server" ID="lblTotalDenominations" Font-Bold="true"></asp:Label>
                </FooterTemplate> --%>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Total Transactions" HeaderStyle-CssClass="visible-desktop" ItemStyle-CssClass="visible-desktop">
            <ItemTemplate>
                <asp:Label ID="lblTotalTransactions" runat="server" Text='<%# Bind("totaltransactions") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:Label runat="server" ID="lblTotalTransactionsSum" Font-Bold="true"></asp:Label>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Total Amount" HeaderStyle-CssClass="visible-desktop" ItemStyle-CssClass="visible-desktop">
            <ItemTemplate>
                <asp:Label ID="lblTotalAmount" runat="server" Text='<%# Bind("totalamount") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:Label runat="server" ID="lblTotalAmountSum" Font-Bold="true"></asp:Label>
            </FooterTemplate>
        </asp:TemplateField>

    </Columns>
</asp:GridView>

protected void GridViewConductorTransactions_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {

        string lblTotalTransactions = ((Label)e.Row.FindControl("lblTotalTransactions")).Text;
        TotalTransactionsSum = TotalTransactionsSum + float.Parse(lblTotalTransactions);

        string lblTotalAmount = ((Label)e.Row.FindControl("lblTotalAmount")).Text;
        TotalAmountSum = TotalAmountSum + float.Parse(lblTotalAmount);

    }

    if (e.Row.RowType == DataControlRowType.Footer)
    {

        Label lb5 = (Label)(e.Row.FindControl("lblTotalTransactionsSum"));
        lb5.Text = TotalTransactionsSum.ToString("n2");

        Label lb7 = (Label)(e.Row.FindControl("lblTotalAmountSum"));
        lb7.Text = TotalAmountSum.ToString("n2");
    }
}

SP:

SELECT N, 
       case when N = 1 then ConductorName else NULL end ConductorName, 
       Denomination, 
       totaltransactions, 
       totalamount
    FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY c.name order by c.name) 'N',
        CASE WHEN isnull(CAST(T.amount AS varchar(30)), c.name + ' total') LIKE '%total%' 
             THEN NULL
             ELSE c.name 
        END AS ConductorName, 
        ISNULL(CAST(T.Amount AS varchar(30)), c.Name + ' total') AS Denomination, 
        COUNT(*) AS totaltransactions, 
        SUM(T.Amount) AS totalamount
    FROM dbo.Tickets AS T INNER JOIN
            Transport.Conductors AS c ON c.ConductorID = T.Conductor_ID
    WHERE CONVERT(DATE,ServerDateTime) BETWEEN @FromDate and @ToDate
    GROUP BY c.Name, T.Amount WITH ROLLUP

【问题讨论】:

  • 如何循环 GridRow 并获得列的总和?
  • 不会降低性能,因为未来数据可能会超过数百万
  • 您要在 GridView 中显示数百万条记录吗?

标签: c# sql asp.net tsql gridview


【解决方案1】:

我会调整查询本身的数据。但是您尚未提供有关数据的任何详细信息。所以其他方法是使用GridViewConductorTransactions_RowDataBound 方法来获得你想要的。您可以检查 if 行包含 txt 中的 total 然后只将总和添加到变量中,

  if (e.Row.RowType == DataControlRowType.DataRow)
    {
          string denominationText = ((Label)e.Row.FindControl("lblDenomination")).Text;
          if(denominationText.Contains("total"))
          {
             string lblTotalAmount = ((Label)e.Row.FindControl("lblTotalAmount")).Text;
             TotalAmountSum = TotalAmountSum + float.Parse(lblTotalAmount);    

             string lblTotalTransactions = ((Label)e.Row.FindControl("lblTotalTransactions")).Text;
             TotalTransactionsSum = TotalTransactionsSum + float.Parse(lblTotalTransactions);
          }

    }

【讨论】:

  • 先生,SP返回的数据与上面gridview中出现的数据相同,请检查
  • 我也粘贴了存储过程,请检查!
  • 我可以选择回复我想要的任何内容,如果他也会比我糟糕,感谢您的回答,它帮助了@CoderofCode
  • 很高兴它有帮助。编码愉快。
  • @AamirShah 我指的是 Coder of Code 拒绝 my edit。毫不奇怪,他在我发表评论后做了同样的编辑。顺便说一句,谢谢你的评论。我希望你得到了模组的警告?
猜你喜欢
  • 1970-01-01
  • 2011-08-19
  • 2012-12-17
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
相关资源
最近更新 更多