分享
 
 
 

DataGrid使用技巧(二)

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

DataGrid使用技巧(二)

------------如何实现多行表头

有时候听有些朋友抱怨.NET的DataGrid不是很好用。就我个人的体会,DataGrid的功能非常强大,可以使我们随心所欲的完成各种各样的工作,可惜就是实现起来不够简单明了。我对平时经常碰到的一些问题积累了一些解决的方法,现在把它们总结一下供大家参考。

比较经常碰到的一个问题是:我们希望DataGrid的表头是多行的(图1)。我在网上找了很久也找不到解决的方法,后来想到了DataGrid的CaptionText和CaptionFont属性。于是我就想能不能在Caption的显示区域画出多行表头。下面的示例代码实现了这个想法,结果如图1所示。

首先需要编写一个类来表示自画的表头,这个类将记录表头的显示文本、图标和属于它管辖的列的信息。

//表头类

public class TopHeaderColumn

{

public TopHeaderColumn()

{

this.columnCollection=new ArrayList();

}

private string caption;

//表头的显示文本

public string Caption

{

get {return caption;}

set {caption=value;}

}

private ArrayList columnCollection;

//用来记录属于表头管辖的各列的信息(通过往集合里添加object)

public ArrayList ColumnCollection

{

get {return this.columnCollection;}

set {this.columnCollection=value;}

}

private int width;

//表头的宽度

public int Width

{

get {return width;}

set {width=value;}

}

private Image image=null;

//表头的图标

public Image Image

{

get {return image;}

set {image=value;}

}

}

另外,因为以后的代码需要DataGrid水平滚动条的位置,而DataGrid无法取得水平滚动条的位置,所以需要对DataGrid做一点修改。

public class myDataGrid:DataGrid

{

public ScrollBar HScrollBar

{

get {return this.HorizScrollBar;}

}

}

好了,可以工作了。新建一个Window应用程序,加入一个myDataGrid、SqlConnection和ImageList,连接SQL数据库NorthWind。当然,还得加入上面的代码

namespace WindowsApplication1

{

public class Form1 : System.Windows.Forms.Form

{

private System.Data.SqlClient.SqlConnection sqlConnection1;

private myDataGrid dataGrid1;

private ArrayList al;

private System.Windows.Forms.ImageList imageList1;

\\在InitializeComponent()里加入这一句:this.dataGrid1 = new myDataGrid(),并根据你的需要设置其他的DataGrid属性。注意,CaptionVisible必须设为true,CaptionText=""。

private void Form1_Load(object sender, System.EventArgs e)

{

SqlDataAdapter da=new SqlDataAdapter("select lastname, firstname, Address,City from employees",this.sqlConnection1);

DataSet ds=new DataSet();

da.Fill(ds,"employees");

this.dataGrid1.DataSource=ds;

this.dataGrid1.DataMember="employees";

//设置DataGrid的各列

DataGridTextBoxColumn c1=new DataGridTextBoxColumn();

DataGridTextBoxColumn c2=new DataGridTextBoxColumn();

DataGridTextBoxColumn c3=new DataGridTextBoxColumn();

DataGridTextBoxColumn c4=new DataGridTextBoxColumn();

c1.MappingName="lastname";

c2.MappingName="firstname";

c3.MappingName="Address";

c4.MappingName="City";

c1.HeaderText="lastname";

c2.HeaderText="firstname";

c3.HeaderText="Address";

c4.HeaderText="City";

c1.WidthChanged+=new EventHandler(this.abc);//列的宽变动时调整表头宽度

c2.WidthChanged+=new EventHandler(this.abc);

c3.WidthChanged+=new EventHandler(this.abc);

c4.WidthChanged+=new EventHandler(this.abc);

DataGridTableStyle dts=new DataGridTableStyle();

dts.GridColumnStyles.Add(c1);

dts.GridColumnStyles.Add(c2);

dts.GridColumnStyles.Add(c3);

dts.GridColumnStyles.Add(c4);

dts.MappingName="employees"; this.dataGrid1.TableStyles.Add(dts);

//建立自画的表头类并将它们加入集合al

al=new ArrayList();

TopHeaderColumn tc1=new TopHeaderColumn();

tc1.Caption="Name";

tc1.Image=this.imageList1.Images[0];

tc1.ColumnCollection.Add(0);//记录它管辖的列的index

tc1.ColumnCollection.Add(1);

tc1.Width=c1.Width+c2.Width;

TopHeaderColumn tc2=new TopHeaderColumn();

tc2.Caption="Address";

tc2.ColumnCollection.Add(2);

tc2.ColumnCollection.Add(3);

tc2.Width=c3.Width+c4.Width;

al.Add(tc1);

al.Add(tc2);

this.dataGrid1.Paint += new System.Windows.Forms.PaintEventHandler(this.dataGrid1_Paint);

}

private void dataGrid1_Paint(object sender, System.Windows.Forms. PaintEventArgs e)

{

int x=0;

//计算出第一个表头的左边距

int left=this.dataGrid1.TableStyles[0].RowHeaderWidth-this.dataGrid1.HScrollBar.Value;

//遍历表头集合al,画出表头

foreach (object o in this.al)

{

//计算出表头文字(文字居中)的左边距

x=left+(((TopHeaderColumn)o).Width-Convert.ToInt32(e.Graphics. MeasureString (((TopHeaderColumn)o).Caption, this.dataGrid1.CaptionFont). Width))/2;

//完成表头绘制

if (((TopHeaderColumn)o).Image!=null)

e.Graphics.DrawImage(((TopHeaderColumn)o).Image,x-imageList1.Images[0].Size.Width,0);

e.Graphics.DrawString(((TopHeaderColumn)o).Caption,this.dataGrid1. CaptionFont,new SolidBrush(this.dataGrid1.CaptionForeColor),x,0);

if (x>0)

e.Graphics.DrawLine(new Pen(Color.Black,2),left-1,0,left-1,this.dataGrid1.Height);

//计算出下一个表头的左边距

left+=((TopHeaderColumn)o).Width;

}

if (x<this.dataGrid1.Width)

e.Graphics.DrawLine(new Pen(Color.Black,2),left-1,0,left-1,this.dataGrid1.Height);

}

private void abc(object sender,EventArgs e)

{

//设置表头的宽度

foreach (object o in this.al)

{

((TopHeaderColumn)o).Width=0;

foreach (int i in ((TopHeaderColumn)o).ColumnCollection)

{ ((TopHeaderColumn)o).Width+=this.dataGrid1.TableStyles[0].GridColumnStyles[i].Width;

}

}

}

private void dataGrid1_Scroll(object sender, System.EventArgs e)

{

this.dataGrid1.Refresh();

}

上面的代码实现了两层表头,至于三层表头也同理。

关于如何实现DataGrid多层表头,许多网友都提到,目前好像没有一种特别好的方便的方法。如果那位网友发现了更好的方法,请给我留一条短训告知,谢谢。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有