C#實現Repeater中Table列合計
阿新 • • 發佈:2018-12-17
一、背景
最近在做.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; } } }