ASP.NET中GridView 重復表格列合并的實現(xiàn)方法
這幾天做一個項目有用到表格顯示數據的地方,客戶要求重復的數據列需要合并,就總結了一下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; // 隱藏當前行
//關鍵代碼,再判斷執(zhí)行第2列的合并單元格方法
}
}
Repeater 后臺代碼
以上所述是小編給大家介紹的ASP.NET中GridView 重復表格列合并的實現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
- asp.net實現(xiàn)固定GridView標題欄的方法(凍結列功能)
- 在ASP.NET 2.0中操作數據之六十四:GridView批量添加數據
- 在ASP.NET 2.0中操作數據之十:使用 GridView和DetailView實現(xiàn)的主/從報表
- ASP.NET數據綁定GridView控件使用技巧
- ASP.NET數據綁定之GridView控件
- ASP.NET中GridView的文件輸出流方式
- ASP.NET中GridView、DataList、DataGrid三個數據控件foreach遍歷用法示例
- asp.net GridView中使用RadioButton單選按鈕的方法
- asp.net Checbox在GridView中的應用實例分析
相關文章
asp.net下DataSet.WriteXml(String)與(Stream)的區(qū)別
asp.net下DataSet.WriteXml(String)與(Stream)的區(qū)別...2007-04-04
asp.net?core?中的Jwt(Json?Web?Token)的使用詳解
session不支持分布式并且在服務器存儲一份用戶登錄的信息,這份登錄信息會在響應時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發(fā)送給我們的應用,這篇文章主要介紹了asp.net?core?中的Jwt(Json?Web?Token)的使用,需要的朋友可以參考下2022-10-10
xpath的數據和節(jié)點類型以及XPath中節(jié)點匹配的基本方法
xpath的數據和節(jié)點類型以及XPath中節(jié)點匹配的基本方法,學習xpath的朋友可以參考下。2010-09-09
asp.net 刪除項目文件/文件夾IIS重啟,Session丟失問題
最近在做一個項目,涉及到大量文件中轉(先上傳到本項目的某個文件夾中,在移動到FTP中),后面發(fā)現(xiàn)每次一刪除文件之后在做操作都會提示未登錄,剛開始以為是WebService Session丟失問題,后面發(fā)現(xiàn)緩存也更新了2011-12-12
asp.net(c#)ref,out ,params的區(qū)別
C#中有三個關鍵字-ref,out ,params,雖然本人不喜歡這三個關鍵字,因為它們疑似破壞面向對象特性。但是既然m$把融入在c#體系中,那么我們就來認識一下參數修飾符ref,out ,params吧,還有它們的區(qū)別。2009-12-12
asp.net中獲取遠程網頁的內容之一(downmoon原創(chuàng))
asp.net中獲取遠程網頁的內容之一(downmoon原創(chuàng))...2007-04-04

