右键单击 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];
}
}
}
这是它的工作演示:
我读过几个问题,询问如何在右键单击网格时实现 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];
}
}
}
这是它的工作演示: