输入ContextMenuStrip_Click事件后获取列索引

时间:2015-12-04 18:48:01

标签: c# .net winforms user-interface datagridview

我有一个简单的数据网格视图,我添加了一个上下文菜单条,有一个选项。如果您右键单击控件上的任何位置,通常会显示此上下文菜单条,但是使用此代码,我只有在您右键单击标题列时才会显示。

private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        var ht = dataGridView1.HitTest(e.X, e.Y);
        if ((ht.Type == DataGridViewHitTestType.ColumnHeader))
        {
            contextMenuStrip1.Show(MousePosition);
        }
    }
}

目标:我希望能够在showToolStripMenuItem_Click事件中获取列索引(我右键单击并随后启用上下文菜单)。这是此活动的代码。

private void showToolStripMenuItem_Click(object sender, EventArgs e)
{         
    var ht = dataGridView1.HitTest(Cursor.Position.X, Cursor.Position.Y);
    DataGridViewCellMouseEventArgs args = new       
        DataGridViewCellMouseEventArgs(ht.ColumnIndex, 0, 0, 0, new 
        MouseEventArgs(System.Windows.Forms.MouseButtons.Right, 0, 0, 0, 0));
    dataGridView1_ColumnHeaderMouseClick(null, args);
}

不幸的是,showToolStripMenuItem_Click事件具有EventArgs而不是DataGridViewCellMouseEventArgs,在这种情况下,很容易获得列索引:e.ColumnIndex。

你在第二个函数中看到的是我试图实例化一个DataGridViewCellMouseEventArgs类并使用它来获取我的索引,不幸的是,e.ColumnIndex属性总是返回-1。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您可以使用DataGridView的{​​{3}}事件。

创建ContextMenuStrip,然后处理DataGridView的{​​{3}}事件并检查这是否是列标题,显示上下文菜单。

您可以使用e.RowIndexe.ColumnIndex检测行索引和列索引。

<强>代码

private void dataGridView1_CellContextMenuStripNeeded(object sender, 
    DataGridViewCellContextMenuStripNeededEventArgs e)
{
    //Check if this is column header
    if (e.RowIndex == -1)
    {
        //Show the context menu
        e.ContextMenuStrip = this.contextMenuStrip1;

        //e.ColumnIndex is the column than you right clicked on it.
    }
}