我想计算datagridview上的选中复选框,单击复选框而不是单击按钮

时间:2012-08-21 17:11:39

标签: vb.net datagridview checkbox

我想计算单击复选框时在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中调用了上述过程,但它没有正确计算。

1 个答案:

答案 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单元格。这几乎不是最好的方法。相反,每列都有一个可以在索引器中使用的名称。