zoukankan      html  css  js  c++  java
  • 重绘DataGridView标头

    最近突然想在DataGridView标头放置一个CheckBox,我就想着重写下DataGridViewColumnHeaderCell
    抱着试试的心态结果真的是可以的
    下面是源码:(如果有看不懂的可以加 源码分享群 81582487 来问我)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Windows.Forms.VisualStyles;

    namespace WindowsDemo
    {

          public  class MyDataGridViewColumnHeaderCell : DataGridViewColumnHeaderCell
        {

            public delegate void CheckBoxClick(DataGridViewCellMouseEventArgs e);
            public delegate void ButtonClick(DataGridViewCellMouseEventArgs e);
            public event CheckBoxClick checkboxClick = null;
            public event ButtonClick buttonClick = null;

            public MyDataGridViewColumnHeaderCell()
                : base()
            {
               
            }
            private Rectangle ChecboxLocation
            {
                get;
                set;
            }

           private Rectangle ButtonLocation { get; set; }

           public CheckBoxState CheckBoxTestState { get; set; }
             /// <summary>
            /// 单元格边框颜色
            /// </summary>
            private Color CellBorderColor { get { return Color.FromArgb(172, 168, 153); } }

            protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle

    cellBounds, int rowIndex, DataGridViewElementStates dataGridViewElementState, object value,

    object formattedValue, string errorText, DataGridViewCellStyle cellStyle,

    DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
            {
                var check = (Boolean)value;
                CheckBoxTestState = check ? CheckBoxState.CheckedNormal :

    CheckBoxState.UncheckedNormal;
                if (paintParts == DataGridViewPaintParts.Background || paintParts ==

    DataGridViewPaintParts.All)
                {
                    graphics.FillRectangle(new SolidBrush(cellStyle.BackColor), cellBounds);
                }
                if (paintParts == DataGridViewPaintParts.Border || paintParts ==

    DataGridViewPaintParts.All)
                {
                    graphics.DrawRectangle(new Pen(CellBorderColor), cellBounds);
                }
                if (paintParts == DataGridViewPaintParts.SelectionBackground || Selected)
                {
                    graphics.FillRectangle(new SolidBrush(cellStyle.SelectionBackColor),

    cellBounds);
                }
                Point checboxPoint = new Point(cellBounds.X + 4, cellBounds.Y + cellBounds.Height

    / 4);
                Rectangle checboxRegtangle = new Rectangle(new Point(cellBounds.X + 4,

    cellBounds.Y + cellBounds.Height / 4), new Size(40, 40));
                Rectangle buttonRectangle = new Rectangle(new Point(cellBounds.X + 50,

    cellBounds.Y + cellBounds.Height / 4), new Size(40, 20));
                ChecboxLocation = checboxRegtangle;
                ButtonLocation = buttonRectangle;
                CheckBoxRenderer.DrawCheckBox(graphics, checboxPoint,checboxRegtangle,"tasi",new

    Font("宋体",12),false,CheckBoxTestState);
                ButtonRenderer.DrawButton(graphics, buttonRectangle, true,

    PushButtonState.Default);
                // base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value,

    formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
            }

          //DataGridview标头单元格绘制两个按钮,并指定两个按钮的事件
            protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
            {
                //这里位置要计算好,计算出CheckBox位置
                if (e.Location.X > ChecboxLocation.Location.X && e.Location.X <

    ChecboxLocation.Location.X + ChecboxLocation.Width)
                {
                    if (checkboxClick != null)
                    {
                        checkboxClick(e);
                    }
                }
                 //计算出button的位置
                else if(e.Location.X

    >ButtonLocation.Location.X&&e.Location.X<ButtonLocation.Location.X + ButtonLocation.Width)
                {
                    buttonClick(e);
                }
                base.OnMouseClick(e);
            }
        }
    }



    使用也很简单:(使用时先把结构加载完了在对这列进行如下操作)
        MyDataGridViewColumnHeaderCell mycell = new MyDataGridViewColumnHeaderCell();
                mycell.checkboxClick+=new MyDataGridViewColumnHeaderCell.CheckBoxClick

    (mycell_checkboxClick);
                mycell.buttonClick += new MyDataGridViewColumnHeaderCell.ButtonClick

    (mycell_buttonClick);
                mycell.Value = true;
                this.view.Columns[0].HeaderCell = mycell;
                view.CellPainting += new DataGridViewCellPaintingEventHandler

    (dataGridView1_CellPainting);

    这个里面我写了两个控件,有点注意的是点击事件时我对按钮的位置没有控制好,我暂时没有认真写这个,

    要是用的话自己要想下如何控制点击事件的位置,第二个是按钮的大小我没有控制,这个也需要自己来控制

  • 相关阅读:
    GridView中checkbox实现全选[转]
    go 格式化秒 running
    mysql 聚簇索引和非聚簇索引 running
    go context上下文取消 running
    go reflect running
    time.ticker running
    go 数据结构与算法之二分查找 running
    mysql 联合索引最左前缀匹配原则 running
    es 修改 mapping 字段类型 running
    linux 查看虚拟机网卡命令 running
  • 原文地址:https://www.cnblogs.com/libinsoft/p/4201780.html
Copyright © 2011-2022 走看看