1

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

4

1 回答 1

4

复选框计数与您的预期不同有两个可能的原因。最有可能的是,由于 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 单元格。这几乎从来都不是最好的方法。相反,每一列都有一个可以在索引器中使用的名称。

于 2012-08-21T19:17:39.787 回答