如何获取 DataGridView 的当前行索引

本文关键字:索引 DataGridView 何获取 获取 | 更新日期: 2024-10-30 13:27:04

我希望当前行在DataGridView中。不是通过鼠标点击,而是通过按回车键...

我知道这一点:

datagridview.CurrentCell.RowIndex

datagridview.CurrentRow.Index

datagridview.SelectedRows[0].Index

我的问题是,通常这可以正常工作,除非我到达最后一行。因为它总是获取倒数第二行的索引。

知道这是怎么发生的吗?

如何获取 DataGridView 的当前行索引

DataGridView中捕获当前行非常简单,您已经发布了两种工作正常的方法:

int currentRow = datagridview.CurrentCell.RowIndex;

或:

int currentRow = datagridview.CurrentRow.Index

第三个实际上相当有问题,因为根据DataGridViewSelectionMode,可能无法选择当前行。

但是您的问题来自尝试获取索引以响应用户按下 Enter 键

默认情况下,这会将当前单元格向下移动一行(如果有)。因此,最后一行和其他行之间的行为会有所不同。

如果没有"下一行",则当前单元格将保留在原处,或者,如果AllowUserToAddRows为 true,则 DGV 将创建一个新的空行并移动到该行。

因此,如果您始终想在不移动当前单元格的情况下获取当前索引,则需要阻止处理 Enter-key。

这是一种方法:

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 + "");
    }            
}

用户仍然可以使用光标键四处移动。

如果 DataGridView 配置为允许行添加,则当前的单元格选择有点混乱。

假设有一个包含 5 行有效数据的 DataGridView 控件,并且用户单击第 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;
        }
    }
}