如何识别右键单击ContextMenuStrip的dataGridView单元格?

用户右键单击DGV中的单元格,然后在ContextMenuStrip中进行选择。 根据他们的CMS选择,我想做点什么(复制,隐藏,过滤)。 我的问题是识别右键单击的单元格。

我试图使用以下方法处理此方案,但无法引用[ColumnIndex]。

private void cmsDataGridView_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { switch (e.ClickedItem.Text) { case "Copy": break; case "Filter On": break; case "Hide Column": DataGridViewBand band = dataGridView1.Columns[e.ColumnIndex]; band.Visible = false; break; } } 

我应该用两种不同的方法吗? 一个处理鼠标点击(然后我可以捕获DGV列索引),然后从那里,我调用CMS项目点击事件?

感谢你的帮助,Brian。


适合我的代码。 哦,我必须从设计器中的dataGridView的ContextMenuStrip属性中删除cmsDataGridView方法。 离开那里会引起问题。

  // Identify the cell clicked for cmsDataGridView DataGridViewCell clickedCell; private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) { try { if (e.Button == MouseButtons.Right) { dataGridView1.ClearSelection(); clickedCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; clickedCell.Selected = true; cmsDataGridView.Show(dataGridView1, e.Location); } } catch (Exception ex) { Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); } } private void cmsDataGridView_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { switch (e.ClickedItem.Text) { case "Copy": break; case "Filter On": break; case "Hide Column": DataGridViewBand band = dataGridView1.Columns[clickedCell.ColumnIndex]; band.Visible = false; break; } } 

您可以通过为DataGridView的鼠标单击添加事件处理程序来跟踪上次单击的任何单元格。

就像是:

  DataGridViewCell clickedCell; private void dataGridView1_CellMouseClick_1(object sender, DataGridViewCellMouseEventArgs e) { try { DataGridView view = (DataGridView)sender; if (e.Button == System.Windows.Forms.MouseButtons.Right && e.RowIndex >= 0) { Console.WriteLine("Clicked column " + e.ColumnIndex + ", row " + e.RowIndex + " of DataGridView " + view.Name + " at " + System.Windows.Forms.Cursor.Position); clickedCell = view.Rows[e.RowIndex].Cells[e.ColumnIndex]; } } catch (Exception ex) { Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); } } 

然后在您的contextMenuStripItem单击事件中,打开clickedCell.Value,如:

 switch (clickedCell.Value) { case "Copy": break; ... // etc. } 

您可以使用带有datagridview的HitTest执行此操作。

这是我使用过的代码示例。

  DataGridView dgv= (DataGridView)sender; if (e.Button == System.Windows.Forms.MouseButtons.Right) { try { dgv.CurrentCell = dgv[gvw.HitTest(eX, eY).ColumnIndex, dgv.HitTest(eX, eY).RowIndex]; } } 

然后,您可以使用DGV.CurrentCell查找所有信息。

 switch "" { case "" break; }