zoukankan      html  css  js  c++  java
  • [WinForm]DataGridView列头右键菜单

    [WinForm]DataGridView列头右键菜单

    前言
      继续"不误正业" - - #,记录一下。有时候有这样的需求:DataGridView的列头菜单可以选择具体显示哪些列,而数据区域的菜单显示增删改查,这样就需要设置两个菜单了,而DataGridView并没有为列头设置菜单的选项,这里分享一段代码。
     
    声明
      欢迎转载,但请保留文章原始出处:) 
        博客园:http://www.cnblogs.com
        农民伯伯: http://over140.cnblogs.com

    正文 

      一、拖拽一个ContextMenuStrip到界面上,设置好列头要显示的菜单,可以通过编程来动态设置。

          二、为DataGridView设置ColumnHeaderMouseClick事件:

    复制代码
            private void DataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                if (e.Button == MouseButtons.Right)
                {
                    Point point = DataGridView1.PointToScreen(new Point(0, 0));
                    int x = 0;
                    DataGridViewColumnCollection columns = DataGridView1.Columns;
                    for (int i = 0; i < e.ColumnIndex; i++)
                    {
                        if (columns[i].Visible)
                            x += columns[i].Width;
                    }
                    menu1.Show(DataGridView1.PointToScreen(new Point(x + e.X, e.Y)));
                } 
    复制代码

            }  

    代码说明:

    1.  只处理右键事件

    2.  处理隐藏列的问题和菜单显示位置。

    三、效果图:

     

      四、后期维护

        2012-5-1  如果同时设置了DataGridView的ContextMenuStrip,上面的代码将不执行,可使用下列代码:

    复制代码
            /// <summary>
            /// 显示菜单
            /// </summary>
            /// <param name="grid"></param>
            /// <param name="menu"></param>
            /// <param name="e"></param>
            private void ShowMenu(DataGridView grid, ContextMenuStrip menu, DataGridViewCellMouseEventArgs e)
            {
                Point point = grid.PointToScreen(new Point(0, 0));
                int x = 0, y = 0;

                foreach (DataGridViewColumn column in grid.Columns)
                {
                    if (column.Index >= e.ColumnIndex)
                        break;
                    if (column.Visible)
                        x += column.Width;
                }

                foreach (DataGridViewRow row in grid.Rows)
                {
                    if (row.Index > e.RowIndex)
                        break;
                    if (row.Visible)
                        y += row.Height;
                }
                menu.Show(grid.PointToScreen(new Point(x + e.X, y + e.Y)));
    复制代码

            }

        调用代码:

    复制代码
            /// <summary>
            /// 右键列头
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void DataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                if (e.Button == MouseButtons.Right)
                {
                    ShowMenu(DataGridView1, headMenu, e);
                }
            }

            /// <summary>
            /// 右键内容区域
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void DataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                if (e.Button == MouseButtons.Right)
                {
                    ShowMenu(DataGridView1, MenuRemove, e);
                }
    复制代码

            } 

    代码说明:

    这样就不要再设置DataGridView的ContextMenuStrip,自己来控制到底显示哪个菜单和菜单的位置,如此可更加灵活显示多个菜单。 

    http://www.cnblogs.com/over140/archive/2012/04/16/2451200.html
  • 相关阅读:
    需要登陆网站后才能获取数据的页面爬取
    PTA中提交Python3程序的一些套路
    PAT 甲级 1014 Waiting in Line (30 分)(queue的使用,模拟题,有个大坑)
    PAT 甲级 1013 Battle Over Cities (25 分)(图的遍历,统计强连通分量个数,bfs,一遍就ac啦)
    PAT 甲级 1012 The Best Rank (25 分)(结构体排序)
    anconda + python 3.6安装(以前的anconda,anaconda和python版本对应关系)
    数学建模python matlab 编程(喷泉模拟)
    数学建模python matlab 编程(疾病传播模型)
    scikit-learn机器学习(四)使用决策树做分类,并画出决策树,随机森林对比
    scikit-learn机器学习(四)使用决策树做分类
  • 原文地址:https://www.cnblogs.com/gisoracle/p/4726482.html
Copyright © 2011-2022 走看看