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

このサンプルでは、​​チェックボックスのチェック状態を StringCollection 内の my.settings に保存します。CB がチェックされている場合はその名前がコレクションに追加され、チェックされていない場合はその名前が削除されます。これは、起動時にコレクション内にある CB 名を簡単に確認し、そのチェック済み統計を true に設定できることを意味します。最後に、AddHandler を使用して、フォームに含まれる任意の CB のコードを実行します。コード内にエラー処理がないことに注意してください。つまり、これはあなたの部分です...

于 2012-11-19T07:41:00.110 に答える