|  | ■No95469 (北松 さん) に返信
> VisualStudio2008で開発中です。
> フォームに50音分(50個)のチェックボックス(Apperance:Button)を配置し、ア行・カ行・サ行・・・それぞれにTagプロパティを設定しグループ分けをしようとしています。
> (あ・い・う・え・おチェックボックスにはそれぞれTagプロパティ“RowA”を、か・き・く・け・こチェックボックスにはそれぞれ“RowKA”を、といった感じです。)
> 
> Form_Loadイベントで、ア段(あかさたな・・・)チェックボックスのみをvisible=true、イ段以降はvisible=falseにして、
> ア段のチェックボックスを選択したとき、その選択した行に対応するイ段以降のチェックボックスを表示させたいです。
> (“か”チェックボックスをChecked=trueしたとき、“き”“く”“け”“こ”チェックボックスをvisible=true。また、その状態で“さ”を選択した場合、きくけこは非表示にし、しすせそを表示。)
> 
> 
> どのように記述すればよいでしょうか?
CheckedChangedイベントの中で納めてしまうとしたらこうでしょうか?
50音分のチェックボックスをすべてココで処理する前提です
Tagの使い方で先頭列判断とかDictionary使わないでもうちょっと簡単に出来そうな気がしますが
あと、Visible=Falseの時もチェックボックスは外してません
Private Sub KanaCheckBox_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles KanaCheckBox.CheckedChanged, KanaCheckBox2.CheckedChanged, KanaCheckBox3.CheckedChanged…〜
    Static isChanged As Boolean = False
    If Not isChanged Then
        isChanged = True
        'チェックボックスをあいうえお〜の順番で取り出せるよう配列へ格納(今回はTabIndexを使用)
        Dim controlList As New SortedDictionary(Of Integer, Control)
        For Each control As Control In Me.Controls
            If TypeOf control Is CheckBox Then
                controlList.Add(control.TabIndex, control)
            End If
        Next
        Dim tag As Object = DirectCast(sender, CheckBox).Tag
        Dim tagList As New List(Of Object)
        '先頭のチェック状態を確認
        Dim isChecked As Boolean = False
        Dim isPrimary As Boolean = True
        For i As Integer = 0 To controlList.Count - 1
            If Not tagList.Contains(controlList.Values(i).Tag) Then
                tagList.Add(controlList.Values(i).Tag)
                If DirectCast(controlList.Values(i), CheckBox).Checked Then
                    isChecked = True
                End If
            Else
                If controlList.Values(i).Equals(sender) Then
                    isPrimary = False
                End If
            End If
        Next
        If isPrimary Then
            'ア列をクリックした時、自分以外のチェックは外す
            tagList = New List(Of Object)
            For i As Integer = 0 To controlList.Count - 1
                If Not tagList.Contains(controlList.Values(i).Tag) Then
                    tagList.Add(controlList.Values(i).Tag)
                    If Not controlList.Values(i).Equals(sender) Then
                        DirectCast(controlList.Values(i), CheckBox).Checked = False
                    End If
                End If
            Next
        End If
        tagList = New List(Of Object)
        If Not isPrimary Then
            'イ列以降は何もしない
        ElseIf Not isChecked Then
            '先頭がすべて非チェックだったら先頭以外はVisible=False
            For i As Integer = 0 To controlList.Count - 1
                If Not tagList.Contains(controlList.Values(i).Tag) Then
                    tagList.Add(controlList.Values(i).Tag)
                    controlList.Values(i).Visible = True
                Else
                    controlList.Values(i).Visible = False
                End If
            Next
        Else
            '同じTagの内容のチェックボックスはVisible=True、違う時先頭以外はVisible=False
            For i As Integer = 0 To controlList.Count - 1
                If controlList.Values(i).Tag.Equals(tag) AndAlso DirectCast(sender, CheckBox).Checked Then
                    controlList.Values(i).Visible = True
                Else
                    If Not tagList.Contains(controlList.Values(i).Tag) Then
                        tagList.Add(controlList.Values(i).Tag)
                        controlList.Values(i).Visible = True
                    Else
                        controlList.Values(i).Visible = False
                    End If
                End If
            Next
        End If
        isChanged = False
    End If
End Sub
 |