0

データグリッド ビューにチェックボックス列があり、ユーザーが 7 つのボックスのみをチェックするように制限したいと考えています。また、チェックボックスをクリックするたびに何かをしたいです。このように (疑似コードのみ):

 While counter is not equal to 7 {
   Check if the user clicked a checkbox (say, some random checkbox 1) {
      (when I say random, I mean not in order, or in no particular order)
      copy row data from where the user clicked the checkbox onto another form (data 1)
      increment counter to 1
      display msgbox saying that the user clicked '1 out of 7'}
   Check if the user clicked another random checkbox (2) {
      copy row data from where the user clicked the checkbox onto another form (data 2)
      increment counter to 2
      display msgbox saying that the user clicked '2 out of 7'}
   .
   .
   .
   Check if the user clicked another random checkbox (7) {
      copy row data from where the user clicked the checkbox onto another form (data 7)
      increment counter to 7
      display msgbox saying that the user clicked '7 out of 7'}
   If counter is more than 7, exit sub and display msgbox('You can only select 7 names')

これを機能させるために、いくつかのレイヤーと FOR_NEXT ループのさまざまな配置を試しましたが、機能させることはできません! これが私のコードです:

Private Sub dgvPaidComms_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvPaidComms.CellContentClick
        Dim counter As Integer = 0
        For Each row As DataGridViewRow In dgvPaidComms.Rows
            Dim selected As Boolean = DataGridView1.Rows(e.RowIndex).Cells(0).Value
            If selected = True Then
                counter += 1
            End If
        Next
        If counter > 7 Then
            MsgBox("You can only select 7 names.")
            Exit Sub
        End If
    End Sub

しかし、DGV (50 行以上) のすべての行をループ処理するため、MsgBox("You can only select 7 names."). また、通常の FOR-NEXT ループ (つまり、通常のカウンターのようFor counter As Integer = 0 to 7 ... Nextなもの) を使用して、そのFor Each row As DataGridViewRow In dgvPaidComms.Rows...内部に配置しようとしましたが、その逆も同様で、がっかりしました。

迷っています。私は本当に混乱しています。私はそれがDataGridView1.Rows(e.RowIndex).Cells(0).Value1つのCellClickイベント(つまり、1つのチェックボックスがオンになっていることを意味します。コードを実行しようとすると何が起こるかというと、1つのチェックボックスをオンにすると、MsgBox("You can only select 7 names.")ポップアウトするためです。実際にはすべての行を実行し、通常の FOR_NEXT (上記で説明) を使用すると、無限ループになります)。

誰かがこの混乱を解消するのを手伝ってくれますか?

4

1 に答える 1

1

列を持つ DGV の名前が「colCheck」であるとします。

Private ChkCount As Integer = 0
Private Sub dgv_CellContentClick(sender As Object, 
        e As DataGridViewCellEventArgs) Handles dgv.CellContentClick

    ' check if this is from the check column
    If dgv.Columns(e.ColumnIndex).Name = "colCheck" Then 

        ' yes. so, is it checked or unchecked (user can do either)
        If CType(dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value, 
                  Boolean) = True Then

            ChkCount += 1          ' increment counter

            ' the "do something" goes here

            If ChkCount = 7 Then
                DoProcedureSeven()      ' do what happens when they hit 7
            End If
        Else
            ChkCount -= 1          ' if they uncheck, decrement counter

            ' be sure to UNDO something here
        End If
    End If
End Sub

気が変わってチェックを外すこともできるため、何かをチェックするときにコピー行全体をどこかに再考することをお勧めします。これは、以前にコピーされたデータを見つけて削除する必要があることを意味します。代わりに、7 つのチェックにヒットするまで待ってから、7 行すべてを一度にコピーします (引き続きチェックされます)。ChkCountおそらく、 = 7の場合にのみ「何かを実行」または「ファイナライズ」ボタンを有効にすることで可能になります。

7 にヒットしたときに何が起こるかを実行し終わったら、コードChkCountを 0 にリセットし、もう一度実行またはやり直すことができるかどうかのチェックをクリアする必要があります。

于 2014-05-17T16:46:30.703 に答える