datagridview多層表頭的製作(3)
引言:受網上文章的啟發,終於用樹做出了多層表頭.將程式碼做了一些修改,比較滿意,現在就只有一點不滿意,那就是columnheadersheightsizemode仍要設為disableresizing.先看效果.
原理:利用treeview的nodes屬性儲存表頭資訊,也還是過載oncellpainting,支援設計時的可視.支援表頭顏色自定義.
開發環境:vs2005
原始碼:treeheaddatagridview.cs
using system;
using system.componentmodel;
using system.collections.generic;
using system.diagnostics;
using system.text;
using system.windows.forms;
using system.collections;
using system.drawing;
namespace cellpaintingdatagridview
public treeheaddatagridview(icontainer container)
[designerserializationvisibility(designerserializationvisibility.content)]
public treenodecollection headsource
private int _cellheight = 17;
private int _columndeep = 1;
[description("設定或獲得合併表頭樹的深度")]
public int columndeep
set}
//////繪製合併表頭
//////合併表頭節點
///繪圖引數集
///結點深度
///public void paintunitheader(treenode node, system.windows.forms.datagridviewcellpaintingeventargs e, int level)
else
color backcolor = e.cellstyle.backcolor;
if (node.backcolor != color.empty)
solidbrush backcolorbrush = new solidbrush(backcolor);
//畫矩形
e.graphics.fillrectangle(backcolorbrush, uhrectangle);
//劃底線
e.graphics.drawline(gridlinepen
, uhrectangle.left
, uhrectangle.bottom
, uhrectangle.right
, uhrectangle.bottom);
//劃右端線
e.graphics.drawline(gridlinepen
, uhrectangle.right
, uhrectangle.top
, uhrectangle.right
, uhrectangle.bottom);
寫字段文字
color forecolor = color.black;
if (node.forecolor != color.empty)
e.graphics.drawstring(node.text, this.font
, new solidbrush(forecolor)
, uhrectangle.left + uhrectangle.width / 2 -
e.graphics.measurestring(node.text, this.font).width / 2 - 1
, uhrectangle.top +
uhrectangle.height / 2 - e.graphics.measurestring(node.text, this.font).height / 2);
遞迴呼叫()
if (node.prevnode == null)
if (node.parent != null)
paintunitheader(node.parent, e, level - 1);
}///
/// 獲得合併標題欄位的寬度
///
/// 字段節點
/// 字段寬度
///
private int getunitheaderwidth(treenode node)
return uhwidth;
}///
/// 獲得底層字段索引
///
/// 底層字段節點
/// 索引
///
private int getcolumnlistnodeindex(treenode node)
return -1;
}private list_columnlist = new list();
[description("最底層結點集合")]
public listnadircolumnlist
return _columnlist;}}
private void getnadircolumnnodes(listallist, treenode node)
else
}else
}else}}
///
/// 獲得底層字段集合
///
/// 底層字段集合
/// 字段節點
/// 向上搜尋與否
///
private void getnadircolumnnodes(listallist, treenode node, boolean ischecked)
if (node.parent != null)
}else}}
else
else
if (node.parent != null)}}
}///
/// 單元格繪製(重寫)
///
///
///
protected override void oncellpainting(system.windows.forms.datagridviewcellpaintingeventargs e)
if (_columndeep == 1)
//繪製表頭
if (e.rowindex == -1)}}
}treeheaddatagridview.design.cs(主要是修改一下dispose函式)
protected override void dispose(bool disposing)
if (disposing && (components != null))
base.dispose(disposing);
}呼叫:
直接拖動自定義控制項到介面上設定屬性即可.
參考文獻:
(vb實現) http://blog.csdn.net/jomuncher/archive/2007/11/02/1862977.aspx
(c#實現) http://blog.csdn.net/teacatcn/archive/2008/01/23/2060482.aspx
C 中DataGridView操作技巧
複製 如下 region 操作datagridview 初始化datagridview屬性 要處理的datagridview 允許使用者新增行 允許使用者刪除行 是否顯示包含行標題的列 列標頭高度大小模式 是否多選 是否唯讀 列頭寬度 列選擇模式 public virtual void initse...
C 中DataGridView編輯狀態控制
datagridview的編輯狀態可以根據需求任意設定。1 設定 datagridview1為唯讀 dgv.readonly true 此時,使用者的新增行操作和刪除行操作也被遮蔽了。2 設定 datagridview的第n列整列單元格為唯讀 dgv.columns n readonly true ...
C 列印dataGridView中的資料
這幾天,我研究了以下c 如何列印datagridview中的資料,在網上 圖書館搜尋和查閱了一些內容,現總結一下 執行列印窗體中的資料操作 private void toolstripbutton2 click object sender,eventargs e 在窗體中繪製要列印的資料 priva...