我已经阅读了一些问题,询问如何在网格上单击鼠标右键时选择DataGridRow。答案显示了实现它的几种不同方法,并且在大多数情况下,除了这个奇怪的错误之外,它们对我有用。
该行似乎已被选中,但除非首先左键单击该行,否则第一行始终是选择操作时选择的行。即,当我单击第3行上的编辑时,第1行的数据将被传递到编辑表单(除非我在右键单击之前左键单击第3行)
这是显示明显选择的右键菜单:
注意小指标仍在第一行。
如果我关闭上下文菜单,该行看起来已选中但不是:
如果我左键单击同一行,则现在选择
这是右键单击事件的代码:
设计师代码:
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];
}
}
实际选择行时我错过了什么?
答案 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];
}
}
}
以下是它的工作演示:
答案 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
事件时,当前选择的单元格指向光标所在的单元格。