博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[WinForm]DataGridView列头右键菜单
阅读量:6813 次
发布时间:2019-06-26

本文共 2215 字,大约阅读时间需要 7 分钟。

前言
  继续"不误正业" - - #,记录一下。有时候有这样的需求: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 

你可能感兴趣的文章
Maven3路程(三)用Maven创建第一个web项目(转)
查看>>
网站pr突然从0变成3了.一夜之间pr升到3了.
查看>>
php新手入门之PHP常用特殊运算符号
查看>>
Android Studio 使用NDK编译jni
查看>>
口字型网络建立HSRP
查看>>
PostgreSQL中如何判断某个SCHEMA是否存在。
查看>>
多线多IP交换机配置(华为交换机)
查看>>
Linux平台下PHP zip模块
查看>>
写其他进程的环境变量
查看>>
Visual Studio统计有效代码行数
查看>>
Qt连接Oracle数据库常见问题
查看>>
45个实用的JavaScript技巧、窍门和最佳实践
查看>>
sqlserver 2005 列字符串拼接
查看>>
TSharding源码阅读-MapperShardingInitializer
查看>>
【01】模板模式
查看>>
在C++中,内存分成5个区
查看>>
华为SDN技术注入联通云清洗业务 从源头拒绝DDoS攻击
查看>>
python 学习day4
查看>>
ofbiz中的类加载机制classloader
查看>>
深入理解JS中的变量作用域
查看>>