2015年10月29日 星期四

[.net]Gridview 合併標題的處理方式(跨行、跨列)

工作上遇到需要將gridview的欄位合併
但並非資料內容合併,是gridview的表題

網路上找到的幾乎都是資料內容合併的方式
因此決定稍微整理一下最後做出來的結果,留個紀錄

首先整理一下gridview的一些事件

參考來源 : https://msdn.microsoft.com/zh-tw/library/hf8xwy0t.aspx
RowDataBound=>資料列繫結至 GridView 控制項中的資料時發生

RowCreated=>建立 GridView 控制項中的資料列時發生

這兩個事件都是需要在有資料的情況下才會觸發的
相較之下比較常用的為RowDataBound,處理資料欄位的binding
而RowCreated會發生在RowDataBound執行前,兩種都是一筆一筆去執行
意思就是若今天gridview都沒有資料,裡面的調正都不會呈現在web網頁上


若要改變gridview的格式,以VS的工具是做不到的
需要針對這些事件去做調整

再來記錄一下GridViewRow row.RowType的幾個類別
DataControlRowType.Footer =>表尾
DataControlRowType.Header=>表頭
DataControlRowType.DataRow=>資料的row

因此,就看需求需要調整表尾還是表頭或是資料
依序加入判斷
 GridViewRow row = e.Row;

            if (row.RowType == DataControlRowType.DataRow)
//...
          if (row.RowType == DataControlRowType.Header)
//...
          if (row.RowType == DataControlRowType.Footer )
//...

回到正題,今天遇到的狀況是改變標題列
當然我後來也是請求google好不容易才找到下列的參考文章(1)
http://adamschen9921.pixnet.net/blog/post/92005651

根據裡面的敘述大概就可以完成改變標題了
but 我需要的表題其實應該要長這樣



除了跨行之外,我還需要將標題一和標題二的上下row跨行阿
再找上下row合併的有發現幾篇不錯的參考文章(2)

但是這些看起來都是針對資料列去做調整
我需要的是標題要合併
有試過裡面的方式但發現還是沒有用

因此最後決定使用有點土法煉鋼的方法

原始的gridview設定為

(圖一)

step1.
根據我前面的參考文章(1),會先針對目前的row.Cells繼續編號
在此之前要先將(圖一)的標題一和標題二刪除

 tcc.Remove(tcc[0]);
 tcc.Remove(tcc[0]);

為什麼都是tcc[0]?因為對於Gridview來說,刪除一個欄位編號會重編
所以對於這個CASE來說都是刪除最前面的標題


step2.

   intcount = intcount - 2;

 for (int i = 0; i <= intcount - 1; i++)
      {
      tcc.Add(tcc[0]);
       }
執行重新編號後(注意intcount 需要配合刪減長度,意即你remove幾個就要所小幾個長度)
紅色部分為我新增加的,新增加的經過重新排列後如下圖
黃色標題六會因為紅色的標題六rowspan=2所以被擠到後面,這也正是我要的結果


step3.
再來同樣的,合併完需要將多餘標題六的刪除
但標題六為我們合併過後的最後面
 tcc.Remove(tcc[6]);

假如需要刪除的有兩個標題則為
 tcc.Remove(tcc[6]);
 tcc.Remove(tcc[5]);
//....


這樣就完成表格合併的問題了
因為這個例子的欄位比較少,所以會比較容易看出來
但實際上遇到的是十幾個欄位的時候
在測試驗證過程還蠻困難的
所以最後才採用這個比較直觀的方式去做
但相信應該還有更好的方式來處理這類的問題

若有各位大大們有更好的方式再麻煩指教了











1 則留言: