我想要DataGridView
中的当前行。不是通过鼠标点击,而是按下输入...
我知道这个:
datagridview.CurrentCell.RowIndex
和
datagridview.CurrentRow.Index
和
datagridview.SelectedRows[0].Index
...
我的问题是,除非我到达最后一行,否则通常这样可以正常工作。因为它总是得到第二行的索引。
知道怎么会发生这种情况?我经常搜索,并且找不到有同样问题的人!
答案 0 :(得分:3)
在DataGridView
中捕获当前行非常简单,并且您发布了两种方法可以正常工作:
int currentRow = datagridview.CurrentCell.RowIndex;
或:
int currentRow = datagridview.CurrentRow.Index
第三实际上相当有问题,因为SelectionMode
DataGridView
当前行可能不被选中。< / p>
但您的问题来自于尝试抓取索引以响应用户点击 Enter键。
默认情况下,移动当前单元格向下一行,如果有一行。因此行为将在最后一行和其他行之间变化..
如果没有&#39; next&#39;行,当前单元格将保持原样,或者如果AllowUserToAddRows
为真,则DGV将创建一个新的空行并移动到那里。
因此,如果您始终想要在不移动当前单元格的情况下获取当前索引,则需要阻止处理Enter键。
这是一种方法:
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
// don't pass the enter key on to the DGV:
e.Handled = true;
// now store or proecess the index:
Console.WriteLine(dataGridView1.CurrentRow + "");
}
}
用户仍然可以使用光标键移动。
答案 1 :(得分:0)
如果将DataGridView配置为允许添加行,则当前单元格的选择会有些混乱。
假设有一个DataGridView控件,其中包含5个有效数据行,然后用户单击第5行。然后,用户单击第6行,并将新行添加到显示中,并突出显示第6行的单元格。
但是CurrentCell.RowIndex
和CurrentRow.Index
仍然设置为第5行(实际值= 4),即使UI不再在此处显示焦点。
这与鼠标或键盘无关。
我使用以下代码检测到这种情况:
bool lastRowSelected = false;
if (grid.SelectedCells != null)
{
foreach (DataGridViewCell cell in grid.SelectedCells)
{
if (cell.RowIndex >= grid.NewRowIndex)
{
lastRowSelected = true;
break;
}
}
}