C 中DataGridView多層表頭的製作 3

2021-04-16 05:27:01 字數 3882 閱讀 9635

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...