进入ContextMenuStrip_Click事件后获取列索引

本文关键字:获取 索引 事件 ContextMenuStrip Click 进入 | 更新日期: 2023-09-27 18:25:38

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

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。

我该怎么办?

进入ContextMenuStrip_Click事件后获取列索引

您可以使用DataGridViewCellContextMenuStripNeeded事件。

创建一个ContextMenuStrip,然后处理DataGridViewCellContextMenuStripNeeded事件,并检查这是否是列标题,显示上下文菜单。

在那里,您可以使用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.
    }
}