0

使用 C#,ContextMenuStrip当我右键单击DataGridView. 我对是否应该使用 a DataGridView_CellContentClickand/or感到困惑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;
    }
4

2 回答 2

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
于 2013-06-19T02:02:11.060 回答
0

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

我的解决方案如下。我发现 usingdataGridView1.MouseUp给了我糟糕的用户交互结果,需要每个动作中的 2 个来改变状态。当右击正确的列时,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();
    }
于 2013-06-19T18:34:56.077 回答