1

我有 12 个复选框(总共 32 个,但现在只担心前 12 个),它们被命名为 checkbox1、checkbox 2...checkbox 12。我想要一个 for 循环遍历它们并查看它们是否被选中。如果它们被选中,它会更改 Excel 工作表,如果没有,它会继续。我有电子表格编辑的逻辑和 for 循环的基本结构,但不知道是否有一种方法可以使用 for 循环中的计数器来引用控件。

例如:

 for i as integer = 1 to 12
   if ("Checkbox" & i).checked = True Then
       <--Spreadsheet things happen-->
   End if
 then

我有一些人提出了一些建议,即使用带有复选框名称的数组,然后执行 checkboxes(i).checked 但这会导致很多问题。其他人建议使用 controls.containskey 和 CType ,但虽然这不会产生任何编译或运行时错误,但电子表格中的任何内容实际上都没有改变,我不知道我所做的任何事情意味着什么。

有谁知道这样做的简单方法?

4

5 回答 5

3

您可以使用 Controls 集合访问复选框。但是,您需要从 Control 分配(或转换)到 Checkbox 以访问 Checked 属性,如下所示:

Dim ctl As Control
Dim chk As CheckBox

For Each ctl In Controls
  If TypeOf ctl Is CheckBox Then
    chk = ctl
    If chk.Checked Then MsgBox(chk.Name & "is checked")
    End If
  Next ctl
于 2013-06-03T17:43:29.537 回答
3

使用 Controls.Find() 方法:

    Dim matches() As Control
    For i As Integer = 1 To 12
        matches = Me.Controls.Find("CheckBox" & i, True)
        If matches.Length > 0 AndAlso TypeOf matches(0) Is CheckBox Then
            Dim cb As CheckBox = DirectCast(matches(0), CheckBox)
            If cb.Checked Then

            End If
        End If
    Next
于 2013-06-03T18:42:24.480 回答
1

像这样的东西应该工作:

    For Each cb As CheckBox In Me.Controls.OfType(Of CheckBox)()
        If cb.Name.Contains("checkbox") AndAlso cb.Checked Then
            Select Case cb.Name
                Case "checkbox1"
                    'do stuff
                Case "checkbox2"
                    'do stuff
                Case "checkbox3"
                    'do stuff
                    'and so on ...
            End Select
        End If
    Next

如果您更改复选框的命名系统以包含分隔符(checkbox-1),并使其他复选框名称唯一不同(chckbox13),您可以通过这种方式缩短代码:

    For Each cb As CheckBox In Me.Controls.OfType(Of CheckBox)()
        If cb.Name.Contains("checkbox") AndAlso cb.Checked Then
            edit(cell(2, Integer.Parse(cb.Name.Split("-")(1)) + 7))
        End If
    Next
于 2013-06-03T19:09:05.400 回答
0

您是在代码中还是在设计器中创建复选框?如果在代码中,请在创建复选框时将它们添加到 aList中。如果您使用的是设计器,请将所有复选框添加到List构造函数中的 a 中。

  Private myCheckboxes As New List(Of CheckBox)

  Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    myCheckboxes.Add(checkbox1)
    myCheckboxes.Add(checkbox2)
    '''etc

  End Sub
于 2013-06-03T17:34:38.957 回答
0

尝试这样的事情

Dim CtrlNm = "MyControlName"
Dim HeresMyControl As Label = CType(Controls.Find(CtrlNm, True)(0), Label)

在我看来,这是最有意义的。

于 2021-10-20T15:34:24.857 回答