回答編集履歴

1

改良版に変更(以前の回答は質問文に移動済み)

2018/02/08 10:37

投稿

teretail
teretail

スコア22

test CHANGED
@@ -1,104 +1,176 @@
1
+ 関数にControlを渡してコンテンツを追加する方法から、
2
+
1
- 想定通りの動きはできました。
3
+ コンテンツを追加したControlを返す方法に変えました。
2
-
4
+
3
- ただし1行1テーブルで構成されるので・・・
5
+ これにより葉の部分はテーブルにまとめられるようになりましたので、若干軽量化できたと思
4
6
 
5
7
 
6
8
 
7
9
  ```vbnet
8
10
 
9
- Private Sub SetContents(ByVal control As ControlCollection, ByVal header As DataRow, ByVal content As DataTable)
11
+ Private Function CreateAccordion(ByVal header As DataRow, ByVal content As DataRow()) As Control
12
+
13
+
14
+
10
-
15
+ CreateAccordion = Nothing
16
+
17
+
18
+
11
-
19
+ Dim contentDT As DataTable = Nothing
12
-
20
+
13
- Dim accordion As AjaxControlToolkit.Accordion
21
+ Dim accordion As AjaxControlToolkit.Accordion
14
-
22
+
15
- Dim accordionPane As AjaxControlToolkit.AccordionPane
23
+ Dim accordionPane As AjaxControlToolkit.AccordionPane
16
-
17
-
18
-
24
+
19
- Dim table As Table
25
+ Dim table As Table = Nothing
20
-
26
+
21
- Dim tableRow As TableRow
27
+ Dim headerRow As TableRow
28
+
22
-
29
+ Dim children As DataRow() = Nothing
30
+
23
-
31
+ Dim pattern As String
24
-
32
+
33
+
34
+
25
- Try
35
+ Try
26
-
27
-
28
-
36
+
37
+
38
+
29
- ' Accordion Header
39
+ ' Accordion Header
40
+
41
+ headerRow = CreateRow(header) ' TableRowを生成する関数(省略)
42
+
43
+
44
+
45
+ If ((Not content Is Nothing) AndAlso (content.Length > 0)) Then
46
+
47
+ ' Get Children
48
+
49
+ contentDT = content.CopyToDataTable
50
+
51
+ pattern = "xxxx" ' patternは抽出条件(省略)
52
+
53
+ children = contentDT.Select(pattern)
54
+
55
+ End If
56
+
57
+
58
+
59
+ If ((Not children Is Nothing) AndAlso (children.Length > 0)) Then
60
+
61
+ ' Have children
62
+
63
+
64
+
65
+ accordion = New AjaxControlToolkit.Accordion
66
+
67
+ accordion.ID = "accordion_" + header("xxx")
68
+
69
+ accordion.ContentCssClass = "accordionContent"
70
+
71
+ accordion.HeaderCssClass = "accordionHeader"
72
+
73
+ accordion.RequireOpenedPane = False
74
+
75
+ accordionPane = New AjaxControlToolkit.AccordionPane
76
+
77
+ accordionPane.ID = "accordionPane_" + header("xxx")
78
+
79
+
80
+
81
+ ' Add Header
30
82
 
31
83
  table = New Table
32
84
 
33
- tableRow = CreateRow(header) ' TableRowを生成する関数(省略)
34
-
35
- table.Controls.Add(tableRow)
36
-
37
-
38
-
39
- contentRows = content.Select(pattern) ' patternは抽出条件(省略)
40
-
41
-
42
-
43
- If (contentRows.Length = 0) Then
44
-
45
- ' コンテンツなし
46
-
47
- control.Add(table)
48
-
49
-
50
-
51
- Else
52
-
53
- ' コンテンツあり
54
-
55
-
56
-
57
- accordion = New AjaxControlToolkit.Accordion
58
-
59
- accordion.ID = "accordion_" + header("xxx")
60
-
61
- accordion.ContentCssClass = "accordionContent"
62
-
63
- accordion.HeaderCssClass = "accordionHeader"
64
-
65
- accordion.RequireOpenedPane = False
66
-
67
- accordionPane = New AjaxControlToolkit.AccordionPane
68
-
69
- accordionPane.ID = "accordionPane_" + header("xxx")
70
-
71
-
72
-
73
- ' ヘッダー追加
74
-
75
- accordionPane.HeaderContainer.Controls.Add(table)
76
-
77
-
78
-
79
- ' コンテンツの追加は、再帰呼出しによって行う
80
-
81
- For Each row As DataRow In contentRows
82
-
83
-
84
-
85
- SetContents(accordionPane.ContentContainer.Controls, row, content)
86
-
87
-
88
-
89
- Next
90
-
91
-
92
-
93
- ' ペインの追加
94
-
95
- accordion.Panes.Add(accordionPane)
96
-
97
-
98
-
99
- ' 作成したアコーディオンを追加する
100
-
101
- control.Add(accordion)
85
+ table.ID = "table_" + header("xxx")
86
+
87
+ table.Controls.Add(headerRow)
88
+
89
+ accordionPane.HeaderContainer.Controls.Add(table)
90
+
91
+
92
+
93
+ table = Nothing
94
+
95
+
96
+
97
+ For Each row As DataRow In children
98
+
99
+
100
+
101
+ pattern = "xxxx" ' patternは抽出条件(省略)
102
+
103
+ Dim control As Control = CreateAccordion(row, contentDT.Select(pattern))
104
+
105
+
106
+
107
+ If (TypeOf control Is TableRow) Then
108
+
109
+ ' Child-Node is TableRow
110
+
111
+
112
+
113
+ If (table Is Nothing) Then
114
+
115
+ ' Table is not created yet
116
+
117
+
118
+
119
+ table = New Table
120
+
121
+
122
+
123
+ End If
124
+
125
+
126
+
127
+ ' Add Child-Node
128
+
129
+ table.Controls.Add(control)
130
+
131
+
132
+
133
+ Else
134
+
135
+ ' Child-Node is Accordion
136
+
137
+
138
+
139
+ If (Not table Is Nothing) Then
140
+
141
+ ' table is created -> add first
142
+
143
+
144
+
145
+ accordionPane.ContentContainer.Controls.Add(table)
146
+
147
+ table = Nothing
148
+
149
+
150
+
151
+ End If
152
+
153
+
154
+
155
+ ' Add Child-Node
156
+
157
+ accordionPane.ContentContainer.Controls.Add(control)
158
+
159
+
160
+
161
+ End If
162
+
163
+
164
+
165
+ Next
166
+
167
+
168
+
169
+ If (Not table Is Nothing) Then
170
+
171
+ ' table still remain
172
+
173
+ accordionPane.ContentContainer.Controls.Add(table)
102
174
 
103
175
 
104
176
 
@@ -106,16 +178,38 @@
106
178
 
107
179
 
108
180
 
181
+ accordion.Panes.Add(accordionPane)
182
+
183
+ CreateAccordion = accordion
184
+
185
+
186
+
187
+ Else
188
+
189
+ ' Have no children
190
+
191
+
192
+
193
+ CreateAccordion = headerRow
194
+
195
+
196
+
197
+ End If
198
+
199
+
200
+
109
- Catch ex As Exception
201
+ Catch ex As Exception
110
-
202
+
111
- Throw
203
+ Throw
112
-
204
+
113
- End Try
205
+ End Try
114
-
115
-
116
-
206
+
207
+
208
+
117
- End Sub
209
+ End Function
118
-
119
-
120
210
 
121
211
  ```
212
+
213
+ これで締めさせていただきます。
214
+
215
+ ありがとうございました。