ASP.NET 關於GridView 表格重覆列合併

来源:http://www.cnblogs.com/hanxiaofei/archive/2016/08/18/5784936.html
-Advertisement-
Play Games

這幾天做一個項目有用到表格顯示數據的地方,客戶要求重覆的數據列需要合併,就總結了一下GridView 和 Repeater 關於重覆數據合併的方法。 效果圖如下 : GridView : 前臺代碼 : 1 <div> 2 <asp:GridView ID="gvIncome" runat="serv ...


這幾天做一個項目有用到表格顯示數據的地方,客戶要求重覆的數據列需要合併,就總結了一下GridView 和 Repeater 關於重覆數據合併的方法。

 

 

效果圖如下 :

 

 

 


GridView :

前臺代碼 :

 1 <div>
 2      <asp:GridView ID="gvIncome" runat="server" AutoGenerateColumns="False">
 3             <Columns>
 4                 <asp:TemplateField HeaderText="一級">   
 5                     <ItemTemplate>
 6                         <asp:Label ID="Label0" runat="server" Text='<%#Eval("aname") %>'></asp:Label>
 7                     </ItemTemplate>
 8                 </asp:TemplateField>
 9                 <asp:TemplateField HeaderText="二級">
10                     <ItemTemplate>
11                         <asp:Label ID="Label1" runat="server" Text='<%#Eval("bname") %>'></asp:Label>
12                     </ItemTemplate>
13                 </asp:TemplateField>
14                 <asp:TemplateField HeaderText="三級">
15                     <ItemTemplate>
16                         <asp:Label ID="Label2" runat="server" Text='<%#Eval("cname") %>'></asp:Label>
17                     </ItemTemplate>
18                 </asp:TemplateField>
19                   <asp:TemplateField HeaderText="四級">
20                     <ItemTemplate>
21                         <asp:Label ID="Label3" runat="server" Text='<%#Eval("dname") %>'></asp:Label>
22                     </ItemTemplate>
23                 </asp:TemplateField>
24             </Columns>
25         </asp:GridView>
26     </div>
GridView 前臺代碼
 

後臺代碼  :  

 1  public void DataBind()
 2         {
 3             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";
 4             SqlDataAdapter sda = new SqlDataAdapter(sql, cn);
 5             DataSet ds = new DataSet();
 6             sda.Fill(ds);
 7             gvIncome.DataSource = ds;
 8             gvIncome.DataBind();
 9             //MergeRows(gvIncome.HeaderRow, gvIncome.Rows.Count);
10             int colnum = gvIncome.Columns.Count;  //   獲取GridView中獲取列數
11             MergeRows(gvIncome, 4, "Label");    //   GridView    要整合的列數    需要改變的Lable控制項
12         }
13         public static void MergeRows(GridView gvw, int colnum, string controlNameo)
14         {
15             for (int col = 0; col < colnum; col++)     //   遍歷每一列
16             {
17                 string controlName = controlNameo + col.ToString();    //  獲取當前列需要改變的Lable控制項ID
18                 for (int rowIndex = gvw.Rows.Count - 2; rowIndex >= 0; rowIndex--)     //GridView中獲取行數    並遍歷每一行
19                 {
20                     GridViewRow row = gvw.Rows[rowIndex];        //  獲取當前行
21                     GridViewRow previousRow = gvw.Rows[rowIndex + 1];   //  獲取當前行 的上一行
22                     Label row_lbl = row.Cells[col].FindControl(controlName) as Label;    ////  獲取當前列當前行 的 Lable 控制項ID 的文本
23                     Label previousRow_lbl = previousRow.Cells[col].FindControl(controlName) as Label;    ////  獲取當前列當前行 的上一行 的 Lable控制項ID  的文本
24                     if (row_lbl != null && previousRow_lbl != null)    //   如果當前行 和 上一行 要改動的 Lable 的ID 的文本不為空
25                     {
26                         if (row_lbl.Text == previousRow_lbl.Text)     //   如果當前行 和 上一行 要改動的 Lable 的ID 的文本不為空 且相同
27                         {
28                             //   當前行的當前單元格(單元格跨越的行數。 預設值為 0 ) 與下一行的當前單元格的跨越行數相等且小於一  則 返回2 否則讓上一行行的當前單元格的跨越行數+1
29                             row.Cells[col].RowSpan = previousRow.Cells[col].RowSpan < 1 ? 2 : previousRow.Cells[col].RowSpan + 1;
30                             //並讓上一行的當前單元格不顯示
31                             previousRow.Cells[col].Visible = false;
32                         }
33                     }
34                 }
35             }
36            
37         }
GridView 後臺代碼

 

 

********************************************************
*                華麗的分割線                *
********************************************************

Repeater :

前臺代碼 :

 

 1 //  table樣式
 2 <style>
 3         table {
 4             border-collapse:collapse;
 5         }
 6             table tr td,th {
 7                 border:1px solid black;
 8             }
 9 </style>
10 
11 //*****************
12 
13 <div>
14       <table>
15           <tr>
16               <th>一級</th> <th>二級</th> <th>三級</th> <th>四級</th>
17           </tr>
18           <asp:Repeater ID="rptIncome" runat="server">
19               <ItemTemplate>
20                   <tr>
21                       <td runat="server" id="td0"><%#Eval("aname") %></td>
22                       <td runat="server" id="td1"><%#Eval("bname") %></td>
23                       <td runat="server" id="td2"><%#Eval("cname") %></td>
24                       <td runat="server" id="td3"><%#Eval("dname") %></td>
25                   </tr>
26               </ItemTemplate>
27           </asp:Repeater>
28       </table>
29 </div>
Repeater 前臺代碼

 

後臺代碼  :

 1       public void DataBind()
 2         {
 3             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";
 4             SqlDataAdapter sda = new SqlDataAdapter(sql, cn);
 5             DataSet ds = new DataSet();
 6             sda.Fill(ds);
 7             rptIncome.DataSource = ds;
 8             rptIncome.DataBind();
 9 
10             for (int i = 0; i < 4; i++)   //  遍歷每一列
11             {
12                 string rpttd = "td";
13                 string tdIdName1 = rpttd + i.ToString();
14                 MergeCell(tdIdName1);   //  把當前列的 td 的 ID文本作為方法的參數
15             }
16             
17         }
18 
19         /// <summary>
20         /// 
21         /// </summary>
22         /// <param name="tdIdName1">當前列當前行的 td 的ID文本</param>
23         private void MergeCell(string tdIdName1)
24         {
25             for (int i = rptIncome.Items.Count - 1; i > 0; i--)  // rptIncome.Items.Count - 1 數據總行數(數據從0開始)     遍歷當前列的每一行
26             {
27                 MergeCellSet(tdIdName1, i);      
28             }     
29         }
30         /// <summary>
31         /// 
32         /// </summary>
33         /// <param name="tdIdName1">當前列當前行的 td 的ID文本</param>
34         /// <param name="i">當前行</param>
35         private void MergeCellSet(string tdIdName1, int i)
36         {
37             HtmlTableCell cellPrev = rptIncome.Items[i - 1].FindControl(tdIdName1) as HtmlTableCell; //  獲取下一行當前列的 td 所在的單元格
38             HtmlTableCell cell = rptIncome.Items[i].FindControl(tdIdName1) as HtmlTableCell;    //  獲取當前行當前列的 td 所在的單元格
39             cell.RowSpan = (cell.RowSpan == -1) ? 1 : cell.RowSpan;    //   獲取當前行當前列單元格跨越的行數    
40             cellPrev.RowSpan = (cellPrev.RowSpan == -1) ? 1 : cellPrev.RowSpan; //   獲取下一行當前列單元格跨越的行數  
41             if (cell.InnerText == cellPrev.InnerText)
42             {
43                 //   讓下一行的當前單元格的跨越行數   + 當前行的跨越行數
44                 cellPrev.RowSpan += cell.RowSpan;
45                 cell.Visible = false;     // 隱藏當前行
46 
47                 //關鍵代碼,再判斷執行第2列的合併單元格方法
48             }
49         } 
Repeater 後臺代碼

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、 常用屬性:①color:文本顏色;②background-color:背景顏色;③font-size:文字大小; 2、 樣式聲明:①內部樣式:style=“樣式規則;”,寫於作用標簽內,優先順序最高;②內聯樣式:<style>樣式規則</style>,寫於head標簽內,優先順序其次;③外聯樣式: ...
  • 前言: 正則表達是就是用特殊字元組成的有一定規則的邏輯公式(規則字元串),主要用於對字元串進行過濾操作。 正則表達式的三個功能: 1.快速匹配指定的字元串; 2.替換遵照正則表達式規則的字元串; 3.在目標字元串中篩選指定的子字元串; 正則表達式的語法: 正則表達式是由普通字元(例如:a-z)和元字 ...
  • h5活動需要插入音頻,但又需要自定義樣式,於是自己寫咯 html css js 以上基本可以實現自定義音頻播放,但是在拖動進度條的時候出現了問題,電腦上是ok的,但是在手機上可以拖動,只不過音頻的總時長比正常播放少了好幾分鐘,導致拖動進度後播放不准確。通過測試發現手機上拿到的duration(總時長 ...
  • 我們可以通過css來做出動畫效果,下麵我為大家演示的是div的旋轉,顏色過渡的動畫 效果自己測試,很絢麗哦 ...
  • × 目錄 [1]元素 [2]特性 [3]文本[4]CDATA[5]實體引用[6]實體名稱[7]處理指令[8]註釋[9]文檔[10]文檔類型[11]文檔片段[12]DTD 前面的話 DOM是javascript操作網頁的介面,全稱為文檔對象模型(Document Object Model)。它的作用是 ...
  • ...
  • 0.快速入門 border-radius:50px; 1.border-radius詳解 border-radius:50px; 上右下左,水平和垂直距離都是50px border-radius:50%; 這裡的%號是已應用該css樣式元素的長度和寬度為基數的 border-radius:50% 3 ...
  • 1. 準備向伺服器發送數據 Ajax 最常見的一大用途是向伺服器發送數據。最典型的情況是從 客戶端發送表單數據,即用戶在form元素所含的各個 input 元素里輸入的值。下麵代碼展示了一張簡單的表單: 這個例子中的表單包含三個input元素和一個提交button 。這些input元素讓用戶可以指定 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...