复选框计数与您的预期不同有两个可能的原因。最有可能的是,由于 datagridview 编辑控件在失去焦点时如何提交其值,因此复选框列的值滞后于复选框状态。
解决方法是按照MSDN 上的描述处理 CurrentCellDirtyStateChanged 事件。
所以你的代码会变成这样:
Sub dataGridView1_CurrentCellDirtyStateChanged( _
ByVal sender As Object, ByVal e As EventArgs) _
Handles dataGridView1.CurrentCellDirtyStateChanged
If dataGridView1.IsCurrentCellDirty Then
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
然后您 CellValueChangedHander 更改为:
Public Sub dataGridView1_CellValueChanged(ByVal sender As Object, _
ByVal e As DataGridViewCellEventArgs) _
Handles dataGridView1.CellValueChanged
If dataGridView1.Columns(e.ColumnIndex).Name = "CheckBoxes" Then
Dim count1 As Integer = 0
For Each row As DataGridViewRow In dgvAtt.Rows
If row.Cells("CheckBoxes").Value IsNot Nothing And row.Cells("CheckBoxes").Value = True Then
count1 += 1
End If
Next
txtCnton.Text = count1
End If
End Sub
在上面的代码中,我还解决了计数不正确的第二个可能原因。在您的代码中,您通过单元格数组中的索引引用 datagridview 单元格。这几乎从来都不是最好的方法。相反,每一列都有一个可以在索引器中使用的名称。