注册 登录
编程论坛 C# 论坛

Datagridview 上下文菜单

习惯被动 发布于 2014-06-23 17:47, 1017 次点击
我想给datagridview添加一个上下文菜单(ContextMenuStrip),可以冻结,隐藏或者显示一些列。我想要的效果是只有右击列头时才弹出上下文菜单,并能真正按要求对右击时所在的列进行操作。我现在遇到的问题有:1、目前的效果是只要在datagridview中右击都会显示上下文菜单,不能实现只有在右击时才显示上下文菜单;2、执行的列索引是当前活动索引(currentCell),不是我右击时所在的列。求大神指导指导。
7 回复
#2
习惯被动2014-06-24 11:26
没人回答?
#3
xydddaxia2014-06-24 16:11
假设dataGridView1的右键菜单是contextMenuStrip1
增加事件处理:
程序代码:

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
    //如果点击无效区域,返回,不弹出菜单
    Point gdvPoint = this.dataGridView1.PointToScreen(new Point(0, 0));
    int totalWidth = 0;
    foreach (DataGridViewColumn col in this.dataGridView1.Columns)
    {
        totalWidth += col.Width;
    }
    if (totalWidth > this.dataGridView1.Width - this.dataGridView1.RowHeadersWidth)
    {
        totalWidth = this.dataGridView1.Width - this.dataGridView1.RowHeadersWidth;
    }
    if (MousePosition.X < gdvPoint.X + this.dataGridView1.RowHeadersWidth || MousePosition.X > (gdvPoint.X + this.dataGridView1.RowHeadersWidth + totalWidth) ||
        MousePosition.Y < gdvPoint.Y || MousePosition.Y > (gdvPoint.Y + this.dataGridView1.ColumnHeadersHeight))
    {
        e.Cancel = true;
    }
}
#4
习惯被动2014-06-24 17:45
回复 3 楼 xydddaxia
这样是能做到在单击列标题是才显示上下文菜单了,不过第二个问题不能解决。我想过通过鼠标的位置和列宽来计算单击时的列数,不过代码在对datagridview的列进行操作时是包含隐藏的列的,所以这个方法行不通。请问版主有什么好的方法吗?
#5
xydddaxia2014-06-25 08:24


 Point gdvPoint = this.dataGridView1.PointToScreen(new Point(0, 0));

 int clickColumnIndex = this.dataGridView1.HitTest(MousePosition.X - gdvPoint.X, MousePosition.Y - gdvPoint.Y).ColumnIndex;
#6
习惯被动2014-06-25 15:04
回复 5 楼 xydddaxia
完全正确。版主很好很强大
#7
习惯被动2014-06-25 15:04
回复 5 楼 xydddaxia
完全正确。版主很好很强大
#8
jczhijia2014-06-30 18:44
不会帮顶可以吗?
1