|
■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
|