4

用户右键单击 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 项目单击事件?

谢谢你的帮助,布赖恩。


适合我的代码。哦,我确实必须从设计器中 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;
        }
    }
4

2 回答 2

7

您可以通过为 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.
}
于 2013-05-22T22:34:37.523 回答
1

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

这是我使用的代码示例。

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

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

switch ""
{
    case ""
      break;
}
于 2013-05-23T03:42:43.353 回答