右键单击以选择DataGrid Row不起作用

时间:2018-06-08 14:41:48

标签: c# winforms right-click

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

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

这是显示明显选择的右键菜单:

enter image description here

注意小指标仍在第一行。

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

enter image description here

如果我左键单击同一行,则现在选择

enter image description here

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

设计师代码:

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];
    }
}

实际选择行时我错过了什么?

3 个答案:

答案 0 :(得分:2)

使用以下代码替换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];
        }
    }
}

以下是它的工作演示:

enter image description here

答案 1 :(得分:0)

您可以将右键单击的行设置为CellMouseDown事件中的焦点行,如下所示

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

答案 2 :(得分:-1)

这是因为右键单击实际上并未选择您右键单击的单元格,只有左键单击才能执行此操作。您需要为单元格鼠标按下事件添加处理程序,将其添加到表单的设计者:

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

并将其添加到表单的类中:

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

这将设置CurrentCell a.k.a.当调用MouseDown事件时,当前选择的单元格指向光标所在的单元格。