這幾天做一個項目有用到表格顯示數據的地方,客戶要求重復的數據列需要合並,就總結了一下GridView 和 Repeater 關於重復數據合並的方法。
效果圖如下:
GridView :
前台代碼 :
<div> <asp:GridView ID="gvIncome" runat="server" AutoGenerateColumns="False"> <Columns> <asp:TemplateField HeaderText="一級"> <ItemTemplate> <asp:Label ID="Label0" runat="server" Text='<%#Eval("aname") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="二級"> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%#Eval("bname") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="三級"> <ItemTemplate> <asp:Label ID="Label2" runat="server" Text='<%#Eval("cname") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="四級"> <ItemTemplate> <asp:Label ID="Label3" runat="server" Text='<%#Eval("dname") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </div> GridView 前台代碼
<span style="line-height: 1.5; font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; background-color: rgb(255, 255, 255);"> </span>
後台代碼 :
public void DataBind() { string sql = "select a.aname,b.bname,c.cname ,d.dname from aa as a right join bb as b on a.aid=b.aid right join cc as c on b.bid=c.bid left join dd as d on d.cid=c.cid order by a.aid"; SqlDataAdapter sda = new SqlDataAdapter(sql, cn); DataSet ds = new DataSet(); sda.Fill(ds); gvIncome.DataSource = ds; gvIncome.DataBind(); //MergeRows(gvIncome.HeaderRow, gvIncome.Rows.Count); int colnum = gvIncome.Columns.Count; // 獲取GridView中獲取列數 MergeRows(gvIncome, 4, "Label"); // GridView 要整合的列數 需要改變的Lable控件 } public static void MergeRows(GridView gvw, int colnum, string controlNameo) { for (int col = 0; col < colnum; col++) // 遍歷每一列 { string controlName = controlNameo + col.ToString(); // 獲取當前列需要改變的Lable控件ID for (int rowIndex = gvw.Rows.Count - 2; rowIndex >= 0; rowIndex--) //GridView中獲取行數 並遍歷每一行 { GridViewRow row = gvw.Rows[rowIndex]; // 獲取當前行 GridViewRow previousRow = gvw.Rows[rowIndex + 1]; // 獲取當前行 的上一行 Label row_lbl = row.Cells[col].FindControl(controlName) as Label; //// 獲取當前列當前行 的 Lable 控件ID 的文本 Label previousRow_lbl = previousRow.Cells[col].FindControl(controlName) as Label; //// 獲取當前列當前行 的上一行 的 Lable控件ID 的文本 if (row_lbl != null && previousRow_lbl != null) // 如果當前行 和 上一行 要改動的 Lable 的ID 的文本不為空 { if (row_lbl.Text == previousRow_lbl.Text) // 如果當前行 和 上一行 要改動的 Lable 的ID 的文本不為空 且相同 { // 當前行的當前單元格(單元格跨越的行數。 默認值為 0 ) 與下一行的當前單元格的跨越行數相等且小於一 則 返回2 否則讓上一行行的當前單元格的跨越行數+1 row.Cells[col].RowSpan = previousRow.Cells[col].RowSpan < 1 ? 2 : previousRow.Cells[col].RowSpan + 1; //並讓上一行的當前單元格不顯示 previousRow.Cells[col].Visible = false; } } } } } GridView 後台代碼
Repeater :
前台代碼 :
// table樣式 <style> table { border-collapse:collapse; } table tr td,th { border:1px solid black; } </style> //***************** <div> <table> <tr> <th>一級</th> <th>二級</th> <th>三級</th> <th>四級</th> </tr> <asp:Repeater ID="rptIncome" runat="server"> <ItemTemplate> <tr> <td runat="server" id="td0"><%#Eval("aname") %></td> <td runat="server" id="td1"><%#Eval("bname") %></td> <td runat="server" id="td2"><%#Eval("cname") %></td> <td runat="server" id="td3"><%#Eval("dname") %></td> </tr> </ItemTemplate> </asp:Repeater> </table> </div> Repeater 前台代碼
後台代碼 :
public void DataBind() { string sql = "select a.aname,b.bname,c.cname ,d.dname from aa as a right join bb as b on a.aid=b.aid right join cc as c on b.bid=c.bid left join dd as d on d.cid=c.cid order by a.aid"; SqlDataAdapter sda = new SqlDataAdapter(sql, cn); DataSet ds = new DataSet(); sda.Fill(ds); rptIncome.DataSource = ds; rptIncome.DataBind(); for (int i = 0; i < 4; i++) // 遍歷每一列 { string rpttd = "td"; string tdIdName1 = rpttd + i.ToString(); MergeCell(tdIdName1); // 把當前列的 td 的 ID文本作為方法的參數 } } /// <summary> /// /// </summary> /// <param name="tdIdName1">當前列當前行的 td 的ID文本</param> private void MergeCell(string tdIdName1) { for (int i = rptIncome.Items.Count - 1; i > 0; i--) // rptIncome.Items.Count - 1 數據總行數(數據從0開始) 遍歷當前列的每一行 { MergeCellSet(tdIdName1, i); } } /// <summary> /// /// </summary> /// <param name="tdIdName1">當前列當前行的 td 的ID文本</param> /// <param name="i">當前行</param> private void MergeCellSet(string tdIdName1, int i) { HtmlTableCell cellPrev = rptIncome.Items[i - 1].FindControl(tdIdName1) as HtmlTableCell; // 獲取下一行當前列的 td 所在的單元格 HtmlTableCell cell = rptIncome.Items[i].FindControl(tdIdName1) as HtmlTableCell; // 獲取當前行當前列的 td 所在的單元格 cell.RowSpan = (cell.RowSpan == -1) ? 1 : cell.RowSpan; // 獲取當前行當前列單元格跨越的行數 cellPrev.RowSpan = (cellPrev.RowSpan == -1) ? 1 : cellPrev.RowSpan; // 獲取下一行當前列單元格跨越的行數 if (cell.InnerText == cellPrev.InnerText) { // 讓下一行的當前單元格的跨越行數 + 當前行的跨越行數 cellPrev.RowSpan += cell.RowSpan; cell.Visible = false; // 隱藏當前行 //關鍵代碼,再判斷執行第2列的合並單元格方法 } } Repeater 後台代碼
以上所述是小編給大家介紹的ASP.NET中GridView 重復表格列合並的實現方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!