自定义控件系列<第一篇>--多维表头

.NET中的DataGridView控件虽然功能强大,但有时无法满足特定的外观需求,如显示多维表头。本文介绍了如何通过重写绘制方法来实现多维表头的功能,以满足设计需求。首先,根据需求输入列索引、合并列数和大标题文本,然后利用Dictionary存储需要合并的列。接着,重写绘制方法,在OnCellPainting中判断并绘制合并的列,以达到自定义的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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;
            
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值