如何获取DataGridView的当前rowindex?

时间:2016-04-20 14:17:17

标签: c# winforms datagridview

我想要DataGridView中的当前行。不是通过鼠标点击,而是按下输入...

我知道这个:

datagridview.CurrentCell.RowIndex

datagridview.CurrentRow.Index

datagridview.SelectedRows[0].Index

...

我的问题是,除非我到达最后一行,否则通常这样可以正常工作。因为它总是得到第二行的索引。

知道怎么会发生这种情况?我经常搜索,并且找不到有同样问题的人!

2 个答案:

答案 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.RowIndexCurrentRow.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;
        }
    }
}