在迭代DataGridView行时没有获得所有行

时间:2014-11-20 17:35:20

标签: vb.net winforms datagridview datagridviewrow

在VB.NET WinForms应用程序中,我有一个DataGridView,其复选框是第一列中的非绑定列。我需要添加每行复选的行集合。

我正在使用以下代码遍历行并找到带有复选框的行:

For Each row As DataGridViewRow In dgvEmployees.Rows

    Dim chkCell As DataGridViewCheckBoxCell = DirectCast(row.Cells(0), DataGridViewCheckBoxCell)
    If Convert.ToBoolean(chkCell.Value) = True Then
        Console.WriteLine("This should be the Emp No of the checked row: " & row.Cells(1).Value.ToString())
    End If

Next

但它缺少最后一行,带有复选框。即如果我检查三个复选框,在控制台输出中我看到前两个选中行的“Emp No”。

认为它表现得像零索引的问题,我也尝试过使用计数器的迭代:

For rowNum As Integer = 0 To dgvEmployees.Rows.Count - 1
    Dim currentRow As DataGridViewRow = dgvEmployees.Rows(rowNum)
    Dim chkCell As DataGridViewCheckBoxCell = DirectCast(currentRow.Cells(0), DataGridViewCheckBoxCell)

    If Convert.ToBoolean(chkCell.Value) = True Then
        Console.WriteLine("This should be the emp no of the checked row: " & currentRow.Cells(1).Value.ToString())
    End If

Next

但是我对该代码有相同的行为。我尝试改变整数= 0和Rows.Count - 1等,但这也无济于事。

如果重要,需要将DataGridView的SelectionMode设置为CellSelect。

更新

表格中有 694 记录正在填充数据网格视图。

我添加了一个控制台输出来获取rows.count值:

Console.WriteLine("Num rows: " & dgvEmployees.Rows.Count)

并得到 695 ,这是有道理的,因为datagridview中的最后一行是允许输入新行。 (但我认为第二次迭代方法中的Count-1会解释这一点。)

我还添加了

Console.WriteLine("Row index: " & chkcell.RowIndex)

在If检查复选框之前,并检查第一,第三和第五行(索引0,2,4),这是输出的内容:

Num rows: 695
Row index: 0
this should be the emp no of the checked row: ACS175
Row index: 1
Row index: 2
this should be the emp no of the checked row: AJAW03
Row index: 3
Row index: 4
Row index: 5
Row index: 6

在Row索引之后应该有一个“this should be ...”输出:4行。

1 个答案:

答案 0 :(得分:1)

您检查的最后一个复选框似乎没有被DataGridView提交,因为您在检查后没有将焦点移动到另一个单元格。在运行迭代代码之前尝试这个:

If dgvEmployees.IsCurrentCellDirty Then
    dgvEmployees.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If