背景
對(duì)于.NET 原本提供的DataGridView控件,制作成如下形式的表格是毫無壓力的。
但是如果把表格改了一下,變成如下形式

傳統(tǒng)的DataGridView就做不到了,如果擴(kuò)展一下還是行的,有不少網(wǎng)友也擴(kuò)展了DataGridView控件,不過有些也只能制作出二維的表頭。或者使用第三方的控件,之前也用過DevExpress的BoundGridView。不過在沒有可使用的第三方控件的情況下,做到下面的效果,就有點(diǎn)麻煩了。

那得自己擴(kuò)展了,不過最后還是用了一個(gè)控件庫的報(bào)表控件,Telerik的Reporting。不過我自己還是擴(kuò)展了DataGridView,使之能制作出上面的報(bào)表。
準(zhǔn)備
學(xué)習(xí)了一些網(wǎng)友的代碼,原來制作這個(gè)多維表頭都是利用GDI+對(duì)DataGirdView的表頭進(jìn)行重繪。
用到的方法包括
Graphics.FillRectangle //填充一個(gè)矩形
Graphics.DrawLine //畫一條線
Graphics.DrawString //寫字符串
此外為了方便組織表頭,本人還定義了一個(gè)表頭的數(shù)據(jù)結(jié)構(gòu) HeaderItem 和 HeaderCollection 分別作為每個(gè)表頭單元格的數(shù)據(jù)實(shí)體和整個(gè)表頭的集合。
HeaderItem的定義如下
代碼如下:
public class HeaderItem
{
private int _startX;//起始橫坐標(biāo)
private int _startY;//起始縱坐標(biāo)
private int _endX; //終止橫坐標(biāo)
private int _endY; //終止縱坐標(biāo)
private bool _baseHeader; //是否基礎(chǔ)表頭
public HeaderItem(int startX, int endX, int startY, int endY, string content)
{
this._endX = endX;
this._endY = endY;
this._startX = startX;
this._startY = startY;
this.Content = content;
}
public HeaderItem(int x, int y, string content):this(x,x,y,y,content)
{
}
public HeaderItem()
新聞熱點(diǎn)
疑難解答
圖片精選