DataGridView右键单击ContextMenuStrip的特定列

时间:2013-06-18 23:13:30

标签: c# winforms datagridview

使用C#,当我右键单击ContextMenuStrip中的特定列时,我只想显示DataGridView(CMS)。我很困惑我是否应该使用DataGridView_CellContentClick和/或dataGridView1.HitTest()。然后,为了完成我的问题,我想将右键单击的单元格中的数据发送到新的表单窗口。

我当前的代码有奇怪的行为。除非我先左键单击或右键单击第4列,否则它不会显示CMS。但是,一旦我拥有它将始终显示右键单击CMS。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 4)
        {
            //Create the ContextStripMenu for Creating the PO Sub Form
            ContextMenuStrip Menu = new ContextMenuStrip();
            ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO");
            //Assign event handlers
            MenuOpenPO.MouseUp += new MouseEventHandler(MenuOpenPO_Click);
            Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
            //Assign created context menu strip to the Datagrid
            dataGridView1.ContextMenuStrip = Menu;
        }
    }

    void MenuOpenPO_Click(object sender, MouseEventArgs e)
    {
        var ht = dataGridView1.HitTest(e.X, e.Y);

               MessageBox.Show("Hello2");
               PO_Form POWindow = new PO_Form();
               POWindow.Show();
    }

我打算使用var ht = dataGridView1.HitTest(e.X, e.Y);来获取单元格值。

任何帮助将不胜感激,谢谢!

修改1 所以我将dataGridView1_CellContentClick更新为此,它让我非常接近我正在寻找的行为。如果我第一次左键单击第4列然后,请右键单击“我的CMS”。如果我左键单击另一列中的任何其他单元格,则右键单击CMS不再存在。但是,我希望能够直接单击第4列中的单元格而无需先单击以创建CMS。

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 4)
        {
            //MessageBox.Show("Hello1");
            //Create the ContextStripMenu for Creating the PO Sub Form
            ContextMenuStrip Menu = new ContextMenuStrip();
            ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO");
            //Assign event handlers
            MenuOpenPO.MouseUp += new MouseEventHandler(MenuOpenPO_Click);
            Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
            //Assign created context menu strip to the Datagrid
            dataGridView1.ContextMenuStrip = Menu;
        }

        else
            dataGridView1.ContextMenuStrip = null;
    }

2 个答案:

答案 0 :(得分:0)

我在VB中做过这个..

Private Sub DGV_CellMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DGV.CellMouseClick
    If e.Button = Windows.Forms.MouseButtons.Right Then

        DGV.CurrentCell = DGV.Rows(e.RowIndex).Cells(e.ColumnIndex)

        CMS.Show(DGV, DGV.PointToClient(Windows.Forms.Cursor.Position))

    End If
End Sub

答案 1 :(得分:0)

我想出了自己的问题,因此会发布解决方案。不幸的是,我对C#编程非常陌生,总的来说它非常生疏。我挣扎于事件处理程序的概念(不确定是否正确名称?),它们如何被调用以及它们如何变化取决于您是否使用MouseEventArgs,EventArgs,KeyEventArgs等。无论如何我离题。

我的解决方案如下。我发现使用dataGridView1.MouseUp给了我糟糕的用户交互结果,每个动作需要2个状态更改。当右键单击正确的coloumn时,IE创建我的ContextMenuStrip。或者,如果右键单击任何其他列,则使其消失。因此,请使用dataGridView1.MouseDown以获得更好的结果。

    dataGridView1.MouseDown += new MouseEventHandler(this.dataGridView_MouseDown);

    private void dataGridView_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            var ht = dataGridView1.HitTest(e.X, e.Y);

            if (ht.ColumnIndex == 4)
            {
                //Create the ContextStripMenu for Creating the PO Sub Form
                ContextMenuStrip Menu = new ContextMenuStrip();
                ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO");
                MenuOpenPO.MouseDown += new MouseEventHandler(MenuOpenPO_Click);
                Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
                //Assign created context menu strip to the DataGridView
                dataGridView1.ContextMenuStrip = Menu;
            }

            else
                dataGridView1.ContextMenuStrip = null;
        }
    }

如果要创建新表单或执行其他操作,我在单击ContextMenuStrip时使用了以下代码,在创建此事件处理程序后使用了以下代码? MenuOpenPO.MouseDown += new MouseEventHandler(MenuOpenPO_Click);

    void MenuOpenPO_Click(object sender, MouseEventArgs e)
    {
       PO_Form POWindow = new PO_Form();
       POWindow.Show();
    }