0

在 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

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

万一这很重要,DataGridView 的 SelectionMode 需要设置为 CellSelect。

更新

正在填充 datagridview 的表中有694条记录。

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

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

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

我还添加了

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

就在如果检查选中复选框之前,并且选中了第一行、第三行和第五行(索引 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 index: 4 行之后应该有一个“this should be...”输出。

4

1 回答 1

1

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

If dgvEmployees.IsCurrentCellDirty Then
    dgvEmployees.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If 
于 2014-11-20T19:14:35.733 回答