进入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。
我该怎么办?
您可以使用DataGridView
的CellContextMenuStripNeeded
事件。
创建一个ContextMenuStrip
,然后处理DataGridView
的CellContextMenuStripNeeded
事件,并检查这是否是列标题,显示上下文菜单。
在那里,您可以使用e.RowIndex
和e.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.
}
}