在 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...”输出。