首页 > 解决方案 > DataGridView 行选择器(记录选择器)实际上不选择

问题描述

var hit = dataGridView1.HitTest(e.X, e.Y);
int rowHit = hit.RowIndex;
dataGridView1.ClearSelection();
dataGridView1.Rows[rowHit].Selected = true;

这是我的代码,但是当我单击鼠标右键时它会选择该行,但记录选择器箭头不会更改为当前选定的行。仅当我单击鼠标左键时,记录选择器箭头才会更改。我希望当我单击右键或左键时,选择器会发生变化。我该如何解决这个问题?

标签: c#datagridviewmouseevent

解决方案


目前尚不清楚发布的代码在哪里执行。我猜在网格MouseDown事件中?

当您“左键”单击网格中的一个单元格时,它会变为“选中”,并且您所描述的“记录选择器”会移动到网格中的该行。所以调用 gridsHitTest方法来查找单元格的行和列索引,并将行设置Selected为将“记录选择器”移动到该行......是多余的,因为网格会以任何方式执行此操作。

当您“右键”单击一个单元格时,显然这一切都不会发生。

目前尚不清楚您要在这里完成什么,但是,可能有帮助的一件事是了解网格CurrentCell不一定总是网格“选定”单元格。无论网格CurrentCell是什么行……都是将显示“记录选择器”的行。

因此,在发布的代码中,您可以将以下几行添加到发布的代码中,它应该更改“记录选择器”下“鼠标右键”单击的行。

int colHit = hit.ColumnIndex;
dataGridView1.CurrentCell = dataGridView1.Rows[rowHit].Cells[colHit];

这应该可行,但如前所述,当用户“左”单击网格时,这是多余的。此外,HitTest如果您订阅了 gridsCellMouseClick事件,则似乎没有必要使用网格。在这种情况下,我们将知道单击了哪个单元格,我们可以简单地检查一下“哪个”鼠标按钮被单击了。在这种情况下,我们会寻找“右键”鼠标单击,然后CurrentCell使用上面的代码简单地将网格更改为该单元格。像……</p>

private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
  if (e.Button == MouseButtons.Right) {
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
  }
}

我希望这是有道理的。


推荐阅读