WinForm程序中表单的列可自定义显示及隐藏,是一种常见的功能,对于用户体验来说是非常好的。笔者经过一段时间的摸索,终于实现了自己想要的功能及效果,现记录一下过程:

    1、新建一个自定义控件,命名为:PopupMenuControl。

    2、在PopupMenuControl.Designet文件中的InitializeComponent()方法下面,注册以下事件:

    this.Paint += new System.Windows.Forms.PaintEventHandler(this.PopupMenuControl_Paint);
    this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PopupMenuControl_MouseDown);
    this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PopupMenuControl_MouseMove);

    3、PopupMenuControl的代码:

    public partial class PopupMenuControl : UserControl
    {
        public delegate void CheckedChanged(int hitIndex, bool isChecked);  //勾选改变委托
        public event CheckedChanged CheckedChangedEvent;                    //勾选改变事件
        PopupMenuHelper popupMenuHelper = null;                             //菜单帮助类,主要负责菜单绘制。

        public PopupMenuControl()
        {
            InitializeComponent();
        }

        public void Initialize(DataGridView dgvTarget)
        {
            //菜单帮助类实例化
            popupMenuHelper = new PopupMenuHelper();
            //将列标题添加到items
            foreach (DataGridViewColumn column in dgvTarget.Columns)
            {
                popupMenuHelper.AddItem(column.HeaderText, column.Visible);
            }
            //菜单绘制
            popupMenuHelper.Prepare(CreateGraphics());
            Width = popupMenuHelper.Width;
            Height = popupMenuHelper.Height;
        }

        /// <summary>
        /// 绘制
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PopupMenuControl_Paint(object sender, PaintEventArgs e)
        {
            popupMenuHelper.Draw(e.Graphics);
        }

        /// <summary>
        /// 鼠标移过
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PopupMenuControl_MouseMove(object sender, MouseEventArgs e)
        {
            if (popupMenuHelper.IsMouseMove(e.X, e.Y))
            {
                popupMenuHelper.Draw(CreateGraphics());
            }
        }

        /// <summary>
        /// 鼠标按下
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PopupMenuControl_MouseDown(object sender, MouseEventArgs e)
        {
            if (popupMenuHelper.IsMouseDown(e.X, e.Y))
            {
                int hitIndex = popupMenuHelper.HitIndex;
                if (hitIndex != -1)
                {
                    bool isChecked = popupMenuHelper.IsCheckedChange(hitIndex, CreateGraphics());
                    OnCheckedChanged(hitIndex, isChecked);
                }
            }
        }

        /// <summary>
        /// 勾选改变
        /// </summary>
        /// <param name="iIndex"></param>
        /// <param name="bChecked"></param>
        public virtual void OnCheckedChanged(int hitIndex, bool isChecked)
        {
            CheckedChangedEvent?.Invoke(hitIndex, isChecked);
        }
    }
View Code

相关文章: