1. 程式人生 > >C#實現Repeater中Table列合計

C#實現Repeater中Table列合計

一、背景

最近在做.Net專案的檔案匯出和報表功能,但是需求方要求在生成Excel和報表的時候,自動對列進行統計,橫向和縱向合計統計。其中一個需求是列名稱和列資料動態生成的表格,所以使用JQuery的列計算不能實現。所以採用了aspx頁面中asp:Repeater模板的FooterTemplate去統計列合計。

二、前端實現

一般我們在aspx頁面中載入表格資料的模板如下,我們將表格列頭放在<HeaderTemplate>中,資料放在<ItenTemplate>中:

        <form id="form1" runat="server">
            <asp:Repeater ID="RPTList_data" onitemdatabound="RPTList_data_ItemDataBound" runat="server">
            <HeaderTemplate>
                <table id="tableData" class="table">
                    <thead>
                        <tr>
                            <th></th>
                        </tr>
                    </thead>
            </HeaderTemplate>
            <ItemTemplate>
                        <tr>
                            <td></td>
                        </tr>
                    </ItemTemplate>
                    <FooterTemplate>
                        <tr>
                            <asp:Literal ID="totalData" runat="server"></asp:Literal>
                        </tr>
                        </table>
                    </FooterTemplate>
            </asp:repeater>
        </form>

要實現列統計,我們在<FooterTemplate>中增加一個標籤,用於載入服務端生成的合計行。

三、後臺實現

首先我們宣告兩個全域性變數,一個用於儲存載入到前端標籤的字串,一個用於儲存key-value的Dictionary。我這裡的專案情景是動態生成列名稱,名稱具有一定的關聯性,所以將每一列的合計值儲存在字典中。各位如果只是求一個值的合計,可以僅宣告一個變數,用於儲存合計值。最後再取出拼接到字串中,通過標籤載入到前端頁面中:

public partial class AgentDDInfoReport : BasePage
{
        protected string strTotalHtml = "<td colspan='3' style=\"width:100px;text-align:center;\">合計</td>";
        protected Dictionary<string, int> dic = new Dictionary<string, int>();
        protected void Page_Load(object sender, EventArgs e)
        {
            BindData();
        }

        private void BindData()
        {
            
        }

        protected void RPTList_data_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                DataRowView rowv = (DataRowView)e.Item.DataItem;//找到分類Repeater關聯的資料項 
                //這裡開始計算,我的是動態生成列名稱,所以將每一列的合計值儲存在字典中。最後再取出
                for (int i = 0; i < 4; i++)
                {
                    if (!string.IsNullOrEmpty(rowv["sum" + i.ToString()].ToString()))
                    {
                        if (!dic.ContainsKey("sum" + i.ToString()))
                            dic.Add("sum" + i.ToString(), rowv["sum" + i.ToString()].ToInt32());
                        else
                            if (!string.IsNullOrEmpty(rowv["sum" + i.ToString()].ToString()))
                                dic["sum" + i.ToString()] = dic["sum" + i.ToString()].ToInt32() + rowv["sum" + i.ToString()].ToInt32();
                    }
                    else
                    {
                        if (!dic.ContainsKey("sum" + i.ToString()))
                            dic.Add("sum" + i.ToString(), 0);
                        else
                            if (!string.IsNullOrEmpty(rowv["sum" + i.ToString()].ToString()))
                                dic["sum" + i.ToString()] = dic["sum" + i.ToString()].ToInt32() + rowv["sum" + i.ToString()].ToInt32();
                    } 
                }
            }
            if (e.Item.ItemType == ListItemType.Footer)
            {
                int total = 0;
                for (int i = 0; i < 4; i++)
                {
                    strTotalHtml += "<td style=\"width:100px;text-align:center;\">" + dic["sum" + i.ToString()] + "</td>";
                    total += dic["sum" + i.ToString()];
                }
                strTotalHtml += "<td style=\"width:100px;text-align:center;\">" + total + "</td>";
                Literal totalData = e.Item.FindControl("totalData") as Literal;
                totalData.Text = strTotalHtml;
            }
        }
    }

四、實現效果