[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 

时间: 2025-01-24 02:28:07

[WinForm]DataGridView列头右键菜单的相关文章

C# winform datagridview 列头排序和加过滤条件 二维表头 加合计行 dll控件

问题描述 过滤条件二维表头合计 解决方案

C# winform datagridview 列标题列能承载控件吗

问题描述 C#winformdatagridview列标题列能承载控件吗 解决方案 解决方案二:为何要承载控件?想实现什么?解决方案三:你想做标题头下拉之类的事吧挺难的要重写控件或者直接找别人写好的研究研究http://www.2cto.com/kf/201108/98931.htmlhttp://download.csdn.net/detail/linghu86/3574300解决方案四:引用2楼的回复: 你想做标题头下拉之类的事吧挺难的要重写控件或者直接找别人写好的研究研究http://ww

C#点击DataGridView的列头进行排序?

问题描述 数据绑定显示到datagridview后点击列头进行排序求大神指点!本人小白! 解决方案 解决方案二: 解决方案三:系统自带就有这功能的,设置下属性就OK了解决方案四:光设置是不行滴网查了很多还得写代码!点击列头进行正序倒序!

右键菜单-winform点击窗口意外的位置关闭窗口

问题描述 winform点击窗口意外的位置关闭窗口 -如题 用窗体做一个图标的右键菜单.. 想点窗口意外的位置关闭窗口... 本来放在 窗口不是活动窗体的时候自动关闭 - - 可是那样点任务栏和桌面时它不会关闭qwq 解决方案 焦点不在窗口内的时候关闭就好了 解决方案二: 意外的位置指的是什么,, 解决方案三: 在Deactivate事件里关闭不行吗? 解决方案四: 试试失去焦点或者activite状态转换事件 解决方案五: activite状态转换事件? 解决方案六: 声明 焦点不在窗口内 事

窗体第二次调用时,dataGridView的列头不见了!

问题描述 我要做个查询功能,用手动绘制的面.dwg文件或者shp文件查询当前场景中的数据,数据显示在dataGridView中:dataGridView的列头是在建窗体的时候就直接添加进去了:第一次查询没有问题,关闭dataGridView所在的子窗体后,第二次调用这个功能,利用shp或者dwg查询也没有问题,但是手动绘制面查询,就提示找不到相应的列了,调试发现dataGridView中没有列数.请教,这可能是什么原因? 解决方案 解决方案二:路过的朋友们谈谈看法吧,虽然不一定知道真正原因,但没

datagridview-C#Datagridview右键菜单属性

问题描述 C#Datagridview右键菜单属性 datagridview 设置不选中行的时候右键菜单就不会出现.这个要怎么做 解决方案 不要直接绑定右键菜单,而是在MouseUp中判断下,如果有选中,再弹出菜单. 解决方案二: contextXXXXX设置之后在datagirdview属性里面绑定就可以了 解决方案三: http://tieba.baidu.com/p/2021731039 这个帖子你去看看应该有你想要的

Telerik for winform 汉化怎么弄啊,怎么屏蔽gridview的右键菜单。请教感激

问题描述 Telerikforwinform汉化怎么弄啊,怎么屏蔽gridview的右键菜单,自定义一个右键菜单..急在线等! 解决方案 解决方案二:找对应的resources.dll文件进行汉化.在Program中使用,System.Threading.Thread.CurrentThread.CurrentUICulture=newSystem.Globalization.CultureInfo("zh-CN");zh-CN为程序文件夹,里面存放的是各种resources.dll文

.NET组件控件实例编程系列——3.DataGridView列标题可编辑组件

在上一篇中介绍了用Label控件模拟网页链接的组件,实现原理只是简单的将Label控件的事件进行了 处理.本篇中介绍的DataGridView列标题可编辑组件在对DataGridView控件的事件进行处理的同时,加入 了更多的技巧. 首先介绍本示例要实现的效果.WinForm中的DataGridView控件只能对单元格进行编辑,但有时候需要 对列标题进行编辑,即自定义列标题.本组件就是实现列标题编辑的功能,双击列标题即可进行编辑,支 持键盘左右键移动编辑单元格.编辑效果如下图.(注:双击列标题对

ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: var tg = new AR.DataGrid('Demo_Area', null, "grid", true); tg.options = { idField: "code", treeField: "name", parentField: &qu