在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行。
答案 0 :(得分:1)
您检查的最后一个复选框似乎没有被DataGridView提交,因为您在检查后没有将焦点移动到另一个单元格。在运行迭代代码之前尝试这个:
If dgvEmployees.IsCurrentCellDirty Then
dgvEmployees.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If