ASP.NET中GridView和Repeater重復(fù)數(shù)據(jù)如何合并
這幾天做一個項目有用到表格顯示數(shù)據(jù)的地方,客戶要求重復(fù)的數(shù)據(jù)列需要合并,就總結(jié)了一下GridView 和 Repeater 關(guān)于重復(fù)數(shù)據(jù)合并的方法。

效果圖如下 :

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 后臺代碼
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中獲取列數(shù)
MergeRows(gvIncome, 4, "Label"); // GridView 要整合的列數(shù) 需要改變的Lable控件
}
public static void MergeRows(GridView gvw, int colnum, string controlNameo)
{
for (int col = 0; col < colnum; col++) // 遍歷每一列
{
string controlName = controlNameo + col.ToString(); // 獲取當(dāng)前列需要改變的Lable控件ID
for (int rowIndex = gvw.Rows.Count - 2; rowIndex >= 0; rowIndex--) //GridView中獲取行數(shù) 并遍歷每一行
{
GridViewRow row = gvw.Rows[rowIndex]; // 獲取當(dāng)前行
GridViewRow previousRow = gvw.Rows[rowIndex + 1]; // 獲取當(dāng)前行 的上一行
Label row_lbl = row.Cells[col].FindControl(controlName) as Label; //// 獲取當(dāng)前列當(dāng)前行 的 Lable 控件ID 的文本
Label previousRow_lbl = previousRow.Cells[col].FindControl(controlName) as Label; //// 獲取當(dāng)前列當(dāng)前行 的上一行 的 Lable控件ID 的文本
if (row_lbl != null && previousRow_lbl != null) // 如果當(dāng)前行 和 上一行 要改動的 Lable 的ID 的文本不為空
{
if (row_lbl.Text == previousRow_lbl.Text) // 如果當(dāng)前行 和 上一行 要改動的 Lable 的ID 的文本不為空 且相同
{
// 當(dāng)前行的當(dāng)前單元格(單元格跨越的行數(shù)。 默認(rèn)值為 0 ) 與下一行的當(dāng)前單元格的跨越行數(shù)相等且小于一 則 返回2 否則讓上一行行的當(dāng)前單元格的跨越行數(shù)+1
row.Cells[col].RowSpan = previousRow.Cells[col].RowSpan < 1 ? 2 : previousRow.Cells[col].RowSpan + 1;
//并讓上一行的當(dāng)前單元格不顯示
previousRow.Cells[col].Visible = false;
}
}
}
}
}
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); // 把當(dāng)前列的 td 的 ID文本作為方法的參數(shù)
}
}
/// <summary>
///
/// </summary>
/// <param name="tdIdName1">當(dāng)前列當(dāng)前行的 td 的ID文本</param>
private void MergeCell(string tdIdName1)
{
for (int i = rptIncome.Items.Count - 1; i > 0; i--) // rptIncome.Items.Count - 1 數(shù)據(jù)總行數(shù)(數(shù)據(jù)從0開始) 遍歷當(dāng)前列的每一行
{
MergeCellSet(tdIdName1, i);
}
}
/// <summary>
///
/// </summary>
/// <param name="tdIdName1">當(dāng)前列當(dāng)前行的 td 的ID文本</param>
/// <param name="i">當(dāng)前行</param>
private void MergeCellSet(string tdIdName1, int i)
{
HtmlTableCell cellPrev = rptIncome.Items[i - 1].FindControl(tdIdName1) as HtmlTableCell; // 獲取下一行當(dāng)前列的 td 所在的單元格
HtmlTableCell cell = rptIncome.Items[i].FindControl(tdIdName1) as HtmlTableCell; // 獲取當(dāng)前行當(dāng)前列的 td 所在的單元格
cell.RowSpan = (cell.RowSpan == -1) ? 1 : cell.RowSpan; // 獲取當(dāng)前行當(dāng)前列單元格跨越的行數(shù)
cellPrev.RowSpan = (cellPrev.RowSpan == -1) ? 1 : cellPrev.RowSpan; // 獲取下一行當(dāng)前列單元格跨越的行數(shù)
if (cell.InnerText == cellPrev.InnerText)
{
// 讓下一行的當(dāng)前單元格的跨越行數(shù) + 當(dāng)前行的跨越行數(shù)
cellPrev.RowSpan += cell.RowSpan;
cell.Visible = false; // 隱藏當(dāng)前行
//關(guān)鍵代碼,再判斷執(zhí)行第2列的合并單元格方法
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- datalist,Repeater和Gridview的區(qū)別分析
- asp.net中讓Repeater和GridView支持DataPager分頁
- repeater、gridview 在綁定時判斷判斷顯示不同的行樣式或文本
- ASP.NET MVC4之js css文件合并功能(3)
- Asp.net程序優(yōu)化js、css實(shí)現(xiàn)合并與壓縮的方法
- Asp.net_Table控件の單元格縱向合并示例
- ASP.NET GridView 實(shí)現(xiàn)課程表顯示(動態(tài)合并單元格)實(shí)現(xiàn)步驟
- asp.net中GridView和DataGrid相同列合并實(shí)現(xiàn)代碼
- asp.net中rdlc 合并行的方法
- asp.net 合并GridView中某列相同信息的行(單元格)
相關(guān)文章
visual studio 2015+opencv2.4.13配置教程
這篇文章主要為大家詳細(xì)介紹了visual studio 2015+opencv2.4.13配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
asp.net datalist綁定數(shù)據(jù)后可以上移下移實(shí)現(xiàn)示例
這篇文章主要介紹了asp.net datalist綁定數(shù)據(jù)后可以上移下移的示例代碼,需要的朋友可以參考下2014-02-02
GridView中checkbox"全選/取消"完美兼容IE和Firefox
GridView中checkbox的的"全選/取消"使用還是比較頻繁的,本文有個不錯的示例完美兼容IE和Firefox,感興趣的朋友可以參考下,希望對大家有所幫助2013-10-10
asp.net aspnetpager分頁統(tǒng)計時與實(shí)際不符的解決辦法
最近分頁方面根據(jù)實(shí)際需要修改了一些函數(shù)2008-11-11
詳解Asp.net web.config customErrors 如何設(shè)置
這篇文章主要介紹了詳解Asp.net web.config customErrors 如何設(shè)置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
Asp.Net Core中服務(wù)的生命周期選項區(qū)別與用法詳解
這篇文章主要給大家介紹了關(guān)于Asp.Net Core中服務(wù)的生命周期選項區(qū)別與用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11

