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

チェック ボックスの数が予想と異なる場合、2 つの原因が考えられます。最も可能性が高いのは、フォーカスを失ったときに 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 

上記のコードでは、誤ったカウントの 2 番目に考えられる原因にも対処しています。コードでは、セル配列内のインデックスで datagridview セルを参照します。これが最善の方法であるということはほとんどありません。代わりに、各列には、インデクサーで使用できる名前があります。

于 2012-08-21T19:17:39.787 に答える