我想计算单击复选框时在datagridview中检查的复选框的数量。
这是我的代码:
Dim count1 As Integer = 0
For Each row As DataGridViewRow In dgvAtt.Rows
If row.Cells(1).Value = True Then
count1 += 1
End If
Next
txtCnton.Text = count1
我在CellContentClick,CellValueChanged和CellStateChanged中调用了上述过程,但它没有正确计算。
答案 0 :(得分:4)
有两种可能的原因导致复选框的数量与您的预期不同。最有可能的是复选框列的值滞后于复选框状态,这是因为datagridview编辑控件在失去焦点时如何提交它们的值。
对此的修复是按照here on 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
在上面的代码中,我还解决了错误计数的第二个可能原因。在您的代码中,您可以通过cells数组中的索引来引用datagridview单元格。这几乎不是最好的方法。相反,每列都有一个可以在索引器中使用的名称。