DataGridViewRow的C#ContextMenuStrip:SourceControl的等价物是什么?

时间:2017-05-28 07:37:56

标签: c# datagridview contextmenustrip

编辑3:很明显RowTemplate.ContextMenuStrip并非设计为任何理智的程序员使用。除了下面描述的所有问题之外,为每一行生成的上下文菜单是原始的克隆 - 但仅限于第一级。任何子菜单都会出现在上下文菜单中。显然它也会导致memory leak。故事的寓意:不要永远使用RowTemplate.ContextMenuStrip

所以我认为当用户右键单击DataGridView的任意一行时,我想出了显示上下文菜单的“正确”方法,但是当用户右键单击{{}内的空白区域时1}}:

Setting ContextMenuStrip for Row

通过设置DataGridView的{​​{1}}的{​​{1}}属性,我可以轻松地将上下文菜单附加到ContextMenuStrip的每一行。但是,在显示上下文菜单时,我需要知道右键单击了哪个行。通常,知道上下文菜单来自何处的方法是使用RowTemplate属性,但在这种情况下,该属性仅返回DataGridView,因为显然DataGridView不是控件。那我怎么知道右键单击了哪一行?

编辑:我发现在以这种方式为行分配上下文菜单时,每行实际上都有一个相同ContextMenuStrip.SourceControl克隆。这意味着我们可以将每个DataGridView的{​​{1}}属性设置为相应的DataGridViewRow。但是我不知道这是否效率低,如果这会引起其他看不见的问题。

编辑2:我认为ContextMenuStrip属性返回null,但这是不正确的 - 我正在检查原始Tag的{​​{1}}属性,ContextMenuStrip开放只是一个克隆。

编辑3:请参阅问题的顶部。

1 个答案:

答案 0 :(得分:0)

您使用“CellMouseEnter”。

    {
        ...
        dataGridView1.CellMouseEnter += new DataGridViewCellEventHandler(dataGridView1_CellMouseEnter);
        menuItem1.Click += new System.EventHandler(this.menuItem1_Click);
    }

    void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
    {
        mPoint = dataGridView1.PointToClient(Cursor.Position);
    }

    private void menuItem1_Click(object sender, EventArgs e)
    {
        DataGridView.HitTestInfo hitTestInfo = dataGridView1.HitTest(mPoint.X, mPoint.Y);

        Console.WriteLine(hitTestInfo.RowIndex + ", " + hitTestInfo.ColumnIndex);
    }