在NET中,自带的控件很多很强大,一般情况下是足够使用了。但是要满足客户需求和设计需求还是有些远远不够。
在显示数据表格或者操作数据表格的时候,我们往往会采用DataGridView控件去显示数据和操作数据。毕竟一般我们表格的基础功能,在这个控件中已经可以完美实现。
但是在外观方面,比如列标题只是显示一行。有时候我们设计时因为大量的不同数据内容显示在同一张表格中是比较凌乱的,此时需要有大标题和小标题让用户更直观的看清数据本身的归类。而自带的DataGridView控件中没办法这样实现,只能对控件外观进行重绘。
下面分段分析代码的步骤:
本代码主要运用函数:
Dictionary泛型(字典)
Draphics类(绘制)
自定义控件主要重写的三种方法
protected override void OnPaint(PaintEventArgs e){
base.OnPaint(e);//绘制界面}
protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e){
base.OnCellPainting(e);}//绘制表格属性
protected override void OnCellClick(DataGridViewCellEventArgs e){
base.OnCellClick(e);}//在单元格中单击
执行过程
输入第一个列索引,合并列数,大标题文本
#region 二维表头之合并列
/// <param name="ColIndex">列的索引</param>
/// <param name="ColCount">需要合并的列数</param>
/// <param name="Text">合并列后的文本</param>
public void AddSpanHeader(int CoIindex, int CoICount, string Text)//合并列
{
if (CoIindex < 2)
{
throw new Exception("行宽应大于等于2,合并1列无意义");
}
else
{
//将小标题列加入大标题列中
int Right = CoIindex + CoICount - 1;//同一大标题下的最后一列的索引
TableRows[CoIindex] = new TableTou(Text, 1, CoIindex, Right);//添加标题下的最左列
TableRows[Right] = new TableTou(Text, 3, CoIindex, Right);//添加标题下的最右列
for (int i = CoIindex + 1; i < Right; i++)
{
TableRows[i] = new TableTou(Text, 2, CoIindex, Right);//添加标题下的中间列
}
}
}
#endregion
选出需要合并的列,存入一个集合中Dictionary。
#region 二维表头之需要合并的列存入Dictionary
private Dictionary<int, TableTou> TableRows = new Dictionary<int, TableTou>();
//二维键值数据
private struct TableTou
{
public TableTou(string Text, int Position, int Left, int Right)
{
this.Text = Text;//标题文本
this.Position = Position;//位置1左 2中 3右
this.Left = Left;//对应左边
this.Right = Right;//对应右边
}
public string Text;
public int Position;
public int Left;