Vb.net 循环通过复选框列对选定单元格进行计数

Vb.net 循环通过复选框列对选定单元格进行计数,vb.net,datagridview,datagridviewcheckboxcell,Vb.net,Datagridview,Datagridviewcheckboxcell,我在datagrid视图中有一个复选框列,我想限制用户只选中7个复选框,不多也不少。另外,我希望每次单击复选框时都会发生一些事情。如下所示(仅限伪代码): 我已经尝试了好几层和不同的FOR_NEXT循环安排来让它工作,但我就是不能让它工作!这是我的密码: Private Sub dgvPaidComms_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArg

我在datagrid视图中有一个复选框列,我想限制用户只选中7个复选框,不多也不少。另外,我希望每次单击复选框时都会发生一些事情。如下所示(仅限伪代码):

我已经尝试了好几层和不同的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(“您只能选择7个名称”)
。 我还尝试过使用一个普通的FOR-NEXT循环(我的意思是,普通的计数器,比如
FOR counter As Integer=0到7…NEXT
东西),并将每一行的
作为dgvPaidComms.Rows中的DataGridViewRow…
放在其中,反之亦然,结果令人失望

我迷路了。我真的很困惑。我认为它与
DataGridView1.Rows(e.RowIndex).Cells(0.Value)有关,因为我认为它只捕获一个CellClick事件(我的意思是,一个选中的复选框)。因为当我尝试运行代码时,我选中一个复选框,我得到
MsgBox(“您只能选择7个名称”)
弹出,因为它确实在所有行中运行,当我使用normal FOR_NEXT(如上所述)时,它变成了一个无限循环。)


有人能帮我澄清这一困惑吗?

假设带有列的DGV名为“colCheck”:

您可能希望在他们检查某个内容时重新考虑将整个复制行复制到某个位置,因为他们也可以改变主意,取消选中某个内容。这意味着您必须找到之前复制的数据并将其删除。相反,只需等待它们达到7个检查,然后立即复制所有7行(它们仍将被检查)。可能只有在
ChkCount
=7时才启用“做点什么”或“完成”按钮


当你完成了当他们达到7时发生的任何事情时,你的代码应该将
ChkCount
重置为0,并清除检查他们是否可以再次执行或重做它。

哦,所以如果语句。。。现在可以了。顺便说一下,我使用了“长格式”,因为当我为IF部分尝试“CType”时,它会返回错误,但当我使用“长格式”时,它工作得很好。谢谢!:)我想我在最后加上这句话只是为了尽量避免在一条长线上出现HScroll(修复,谢谢)。这不仅仅是IF语句。您的代码在每次单击的所有行中循环,而不仅仅是处理此单击。如果你在每次检查时都复制这些东西,那么目的地就会有大量的副本。我现在明白了。我按照你的建议做了(在所有的检查/取消检查之后复制数据,这样我得到的就是我需要的,或者类似的东西,但我是这样理解的,我希望我能理解你希望我如何理解它。)谢谢。我知道这个问题已经11天没提了,但我还有一个关于这个主题的问题,我不想问新问题,因为它可能会导致冗余。因此,check uncheck(勾选-取消勾选)功能已经运行了一段时间,直到我注意到,每当我取消勾选某些行(随机,不按顺序)时,其值本应为空的字段(标签)都是空的,因此,如果我勾选了行1-5和未勾选的3和2,复制值的表单在字段2和3中都有间隙,这是丑陋和错误的。我该怎么做才能把它们整理好?(我想看到的是1-2-3而不是1----4-5)这听起来确实像是一个新问题-这个新问题与上面的代码在选择了7之后做了什么有关,我不知道如何/如何将数据从一个复制到另一个。所以我要问一个新问题,包括代码。
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
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