1

我有 20 个复选框。

这是复选框 nº1 的事件:

Public Sub C1CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles C1CheckBox1.CheckedChanged
    If C1CheckBox1.Checked = True Then My.Settings.box1_selected = "Y" Else My.Settings.box1_selected = "N"
    Dim checkedpath1 = C1CheckBox1.Text
End Sub

我知道我可以在“句柄”中添加所有复选框,但是我的复选框数量未确定,这就是我想要做的:

(伪代码)

Public Sub ALL_THE_CHECKBOXES_CheckedChanged(sender As Object, e As EventArgs) Handles ALL_THE_CHECKBOXES.CheckedChanged
    If ANY_CHECKBOX.Checked = True
        My.Settings.boxNUMBER_OF_THIS_SELECTED_CHECKBOX_selected = "Y"
    Else 
        My.Settings.boxNUMBER_OF_THIS_SELECTED_CHECKBOX_selected = "N"
    End If
    Dim checkedpathNUMBER_OF_THIS_SELECTED_CHECKBOX = C1CheckBoxNUMBER_OF_THIS_SELECTED_CHECKBOX.Text
End Sub

我需要生成一个处理不确定数量的复选框的事件,如果选择了任何复选框,我需要执行相同的操作,但仅在该选定的复选框中。

基本上我想在设置中记住哪些复选框被选中,哪些没有......

更新

在表单加载时,我使用以下代码创建所有表单复选框:

Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim List As Integer = 0
    Dim posy As Integer = 10

    filesystem = CreateObject("Scripting.FileSystemObject")
    ThisDir = filesystem.GetFolder(My.Settings.folderpath)

    For Each folder In ThisDir.Subfolders
        List = List + 1
        posy = posy + 20

        Dim newCheckBox As New CheckBox()
        Panel1.Controls.Add(newCheckBox)
        newCheckBox.Name = "checkbox" & List.ToString()
        newCheckBox.Text = folder.name
        newCheckBox.Location = New Point(10, posy)
    Next
End Sub

这会创建一个名为“checkbox1”、“checkbox2”、“checkbox3”等的复选框...

4

1 回答 1

2

所有复选框都在另一个控件内。可能是表格,面板什么的。因此,您可以循环浏览这些复选框并为您找到的每个复选框手动分配事件处理程序

修改后的示例代码:

您需要一个名为MyCBs的 StringCollection 类型的设置- 或者您可以使用您喜欢的任何名称,只需对代码进行必要的更改。

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    My.Settings.Save()
End Sub

Private Sub AnyCB_CheckedChanged(sender As Object, e As EventArgs)

    Dim cb = DirectCast(sender, CheckBox)
    If cb.Checked AndAlso Not My.Settings.MyCBs.Contains(cb.Name) Then
        My.Settings.MyCBs.Add(cb.Name)
    ElseIf Not cb.Checked AndAlso My.Settings.MyCBs.Contains(cb.Name) Then
        My.Settings.MyCBs.Remove(cb.Name)
    End If

End Sub

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown

    If My.Settings.MyCBs Is Nothing Then My.Settings.MyCBs = New Collections.Specialized.StringCollection

    For Each s In My.Settings.MyCBs
        DirectCast(Me.Controls(s), CheckBox).Checked = True
    Next

    For Each cb In Me.Controls.OfType(Of CheckBox)()
        AddHandler cb.CheckedChanged, AddressOf AnyCB_CheckedChanged
    Next

End Sub

此示例将 my.settings 中复选框的选中状态保存在 StringCollection 中。如果一个 CB 被选中,它的名字被添加到集合中,如果它未被选中,它的名字被删除。这意味着在启动时您可以简单地检查集合中的哪个 CB 名称并将其检查的统计信息设置为 true。最后,您使用 AddHandler 为您的表单中包含的任何 CB 执行代码。请注意,代码内部没有错误处理,这意味着这是你的一部分......

于 2012-11-19T07:41:00.110 回答