終於搞定了cxgrid的多行表頭
轉自:http://mycreature.blog.163.com/blog/static/556317200772524226400/
這一周都在處理dbgrideh向cxgrid遷移的問題,在感嘆cxgrid功能強大的同時不得不面對這種強大帶來的高昂的學習成本,然后就開始感嘆相關材料的缺乏。雖然可以從cxgrid的幫助文件中獲取相當多有用的信息,但幫助文檔中的內容更多集中在設計時的設置,對於運行時的設置的介紹相當有限,而項目里的grid大都是動態配置生成的;而網絡上關於cxgrid的資料就更少了,翻來覆去都是轉載自那兩三篇源文章的內容。於是就出現了為了實現一個類似圖一的多行表頭而花了我快兩天的時間的狀況。
dbgrideh中的實現
dbgrideh中設置多行表頭的實現很簡單,把UseMultiTitle屬性設置為true,然后設置帶層次結構的列標題。 列標題的層次結構設置規則為: 列標題可以由多個層次組成,不同層次內容用"|"分割開,dbgrideh會自動處理層次之間的相同和不同內容。
范例代碼如下: DBGridEh.Columns[0].Title.Caption := '年段|1班'; DBGridEh.Columns[1].Title.Caption := '年段|2班';
cxgrid中的實現
cxgrid中設置多行表頭的實現主要通過列中的Position.BandIndex屬性來設置,該屬性用來設置某個band對應的上級band。把如果把某個band的Position.BandIndex指定上一個band的序號,則該band則會出現在上一個band的所處列的下方。
范例代碼如下: //增加單元的實現方法 procedure addBandImpl(view:TcxGridDBBandedTableView;cptText:String;align:TAlignment;append:boolean); const MC_OFFSET_PARENT = 1; var idx : Integer; begin idx := view.Bands.Count; with view.Bands.Add do begin Caption := cptText; Alignment := align; Position.ColIndex := idx; if append then Position.BandIndex := idx-MC_OFFSET_PARENT else Position.BandIndex := idx; Options.HoldOwnColumnsOnly := true; end; end;
//增加列的首個單元格 procedure addCXBand(view:TcxGridDBBandedTableView;cptText:String;align:TAlignment=taCenter); begin addBandImpl(view,cptText,align,false); end;
//增加列的后續單元格 procedure appendCXBand(view:TcxGridDBBandedTableView;cptText:String;align:TAlignment=taCenter); begin addBandImpl(view,cptText,align,true); end;
//增加規格列表單元格 procedure addBandsOfSpecList(view:TcxGridDBBandedTableView;colIdx:Integer;objList:TObjectList); var objIdx : Integer; specText : String; holder : TSpecHolder; begin for objIdx:=0 to objList.Count-1 do begin //構造band的名稱(TSpecHolder中存儲每個規格行對應的具體規格項,數目不等) holder := TSpecHolder(objList[objIdx]); if holder.getSpecCount>colIdx then specText := holder.getSpecItems[colIdx] else specText := ''; //判斷是否新增一列 if objIdx=0 then addCXBand(view,specText,taCenter,false) else appendCXBand(view,specText); end; end;
兩種實現方式比較
如果把多表頭當作二維表來看待的話,dbgrideh多表頭的實現方式是通過從左到右設置包含行信息("|"用來區分不同行)的列來完成的,而cxgrid則是通過從上到下、從左到右設置單元格信息來完成的:首先為每一列指定所處列序號,然后順序增加該列中的所有單元格,完成后再進行下一列的設置