右键单击 select DataGrid 行不起作用

Right-click to select DataGrid Row not working

我读过几个问题,询问如何在右键单击网格时实现 DataGridRow selection。答案显示了实现它的几种不同方法,并且在大多数情况下,除了这个奇怪的错误外,它们对我有用。

该行似乎是 selected,但除非先左键单击该行,否则第一行始终是选择操作时 selected 的行。即当我点击第 3 行的编辑时,第 1 行的数据将被传递到编辑表单(除非我在右键单击它之前左键单击第 3 行)

这是显示表观select离子的右键菜单:

注意小指示器仍在第一行。

如果我关闭上下文菜单,该行看起来 selected 但不是:

如果我左键单击同一行,现在 selected

这是右键单击事件的代码:

设计师代码:

MyDataGrid.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);

表单代码:

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {       
        var hti = MyDataGrid.HitTest(e.X, e.Y);
        MyDataGrid.CurrentCell = MyDataGrid.Rows[hti.RowIndex].Cells[hti.ColumnIndex];
    }
}

实际上 select 我错过了什么?

这是因为右键单击实际上不会 select 您右键单击的单元格,只有左键单击才会这样做。您需要为单元格鼠标按下事件添加一个处理程序,将其添加到您的表单设计器中:

MyDataGridView.CellMouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);

并将此添加到您的表单 class:

private void MyDataGridView_MouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    MyDataGridView.CurrentCell = MyDataGridView(e.ColumnIndex, e.RowIndex);
}

这将设置 CurrentCell a.k.a。当前 select 编辑到调用 MouseDown 事件时光标所在的单元格。

您可以像这样在 CellMouseDown 事件中使右键单击的行成为焦点行

if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
     DataGridView1.CurrentCell = DataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
}

MouseDown 事件回调中的代码替换为:

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

        if (hti.RowIndex != -1)
        {
            dataGridView1.ClearSelection();
            dataGridView1.Rows[hti.RowIndex].Selected = true;
            dataGridView1.CurrentCell = dataGridView1.Rows[hti.RowIndex].Cells[0];
        }
    }
}

这是它的工作演示: