|
|
|
 |
 |
Исходник |
 |
|
 |
 |
|
Автор:
|
|
|
Название:
|
WebCustomPanelTrCh - исправил ошибки, возникающие, когда большое дерево и sql-сервер уже не справляется. |
|
Дата:
|
15 May 2007 |
|
Описание: |
Бывает, что sql-сервер плохо считывает данные из дерева, когда размер таблицы превышает определённый размер. В принципе это было предсказуемо, но раньше у меня просто руки не доходили. Обсуждение на http://aspnetmania.com/Forums/ForumMessage/188107.html |
| |
Разместить ссылку на этот исходник в форуме вы можете вставив в текст сообщения
следующую строку:
[CODEPOST ID=207]WebCustomPanelTrCh - исправил ошибки, возникающие, когда большое дерево и sql-сервер уже не справляется.[/CODEPOST] |
| Оценка: |
Проголосовало 1 посетителей, средняя оценка 3.00 |
| Оценить: |
|
1 REM Панель с раскрытым деревом чекбоксов, заполняется рекурсивно.
2 Option Compare Text
3 Imports System.ComponentModel
4 Imports System.Web.UI
5 Imports System.Drawing
6 Imports System.Data.SqlClient
7 ''' -----------------------------------------------------------------------------
8 ''' Project : WebControlLibrary2
9 ''' Class : WebCustomPanelTrCh
10 '''
11 ''' -----------------------------------------------------------------------------
12 ''' <summary>
13 ''' Элемент управления, выдающий раскрытое дерево чекбоксов рекурсивно.
14 ''' </summary>
15 ''' <remarks>
16 ''' </remarks>
17 ''' <history>
18 ''' [Max Pro] 15.05.2007 Created
19 ''' </history>
20 ''' -----------------------------------------------------------------------------
21 <DefaultProperty("iArrayIdTrue"), ToolboxData("<{0}:WebCustomPanelTrCh runat=server></{0}:WebCustomPanelTrCh>"), ToolboxBitmap(GetType(Bitmap))> _
22 Public Class WebCustomPanelTrCh
23 Inherits System.Web.UI.WebControls.Panel
24 Implements INamingContainer, IPostBackDataHandler
25 Private _iArrayIdTrue(-1) As Integer 'массив чисел Int32, представляющих отмеченные коды текущих уровней.
26 Private zapConnection As SqlConnection
27 Private zapConnectString As String
28 Private _oArrayConnId(,)
29 Private oErr As Exception
30 ''' -----------------------------------------------------------------------------
31 ''' <summary>
32 ''' Массив чисел Int32, представляющих отмеченные коды текущих уровней. Работает только для чтения.
33 ''' </summary>
34 ''' <value>По умолчанию выдаёт пустой массив.</value>
35 ''' <remarks>
36 ''' </remarks>
37 ''' <history>
38 ''' [Max Pro] 15.05.2007 Created
39 ''' </history>
40 ''' -----------------------------------------------------------------------------
41 <Bindable(True), Category("Data"), DefaultValue(""), Description("Массив чисел Int32, представляющих отмеченные коды текущих уровней. Работает только для чтения.")> _
42 Public ReadOnly Property iArrayIdTrue() As Integer()
43 Get
44 If UBound(_iArrayIdTrue) = -1 Then RaisePostDataChangedEvent()
45 Return _iArrayIdTrue
46 End Get
47 End Property
48 ''' -----------------------------------------------------------------------------
49 ''' <summary>
50 ''' Номер корня, с которого начинаеются стволы.
51 ''' </summary>
52 ''' <value>По умолчанию ноль.</value>
53 ''' <remarks>
54 ''' </remarks>
55 ''' <history>
56 ''' [Max Pro] 15.05.2007 Created
57 ''' </history>
58 ''' -----------------------------------------------------------------------------
59 <Bindable(True), Category("Data"), DefaultValue("0"), Description("Номер корня, с которого начинаеются стволы.")> _
60 Public Property iTrunkParent() As Integer
61 Get
62 Return CType(ViewState("iTrunkParent"), Integer)
63 End Get
64 Set(ByVal Value As Integer)
65 ViewState("iTrunkParent") = Value
66 End Set
67 End Property
68 ''' -----------------------------------------------------------------------------
69 ''' <summary>
70 ''' Строка соединения с базой данных SQL-сервер.
71 ''' </summary>
72 ''' <value>По умолчанию пустая строка.</value>
73 ''' <remarks>
74 ''' </remarks>
75 ''' <history>
76 ''' [Max Pro] 15.05.2007 Created
77 ''' </history>
78 ''' -----------------------------------------------------------------------------
79 <Bindable(True), Category("Data"), DefaultValue(""), Description("Строка соединения с базой данных SQL-сервер.")> _
80 Public Property sConnectionString() As String
81 Get
82 Return CType(ViewState("sConnectionString"), String)
83 End Get
84 Set(ByVal Value As String)
85 ViewState("sConnectionString") = Value
86 End Set
87 End Property
88 ''' -----------------------------------------------------------------------------
89 ''' <summary>
90 ''' Хранимая процедура, выдающая таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String).
91 ''' </summary>
92 ''' <value>По умолчанию пустая строка.</value>
93 ''' <remarks>
94 ''' </remarks>
95 ''' <history>
96 ''' [Max Pro] 15.05.2007 Created
97 ''' </history>
98 ''' -----------------------------------------------------------------------------
99 <Bindable(True), Category("Data"), DefaultValue(""), Description("Хранимая процедура, выдающая таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String).")> _
100 Public Property sStoredProcedure() As String
101 Get
102 Return CType(ViewState("sStoredProcedure"), String)
103 End Get
104 Set(ByVal Value As String)
105 ViewState("sStoredProcedure") = Value
106 End Set
107 End Property
108 ''' -----------------------------------------------------------------------------
109 ''' <summary>
110 ''' URL картинки со стволом.
111 ''' </summary>
112 ''' <value>По умолчанию берётся из Интернета.</value>
113 ''' <remarks>
114 ''' </remarks>
115 ''' <history>
116 ''' [Max Pro] 15.05.2007 Created
117 ''' </history>
118 ''' -----------------------------------------------------------------------------
119 <Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки со стволом.")> _
120 Public Property sUrlTrunk() As String
121 Get
122 Return CType(ViewState("sUrlTrunk"), String)
123 End Get
124 Set(ByVal Value As String)
125 ViewState("sUrlTrunk") = Value
126 End Set
127 End Property
128 ''' -----------------------------------------------------------------------------
129 ''' <summary>
130 ''' URL картинки с открытой веткой.
131 ''' </summary>
132 ''' <value>По умолчанию берётся из Интернета.</value>
133 ''' <remarks>
134 ''' </remarks>
135 ''' <history>
136 ''' [Max Pro] 15.05.2007 Created
137 ''' </history>
138 ''' -----------------------------------------------------------------------------
139 <Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с открытой веткой.")> _
140 Public Property sUrlBranch() As String
141 Get
142 Return CType(ViewState("sUrlBranch"), String)
143 End Get
144 Set(ByVal Value As String)
145 ViewState("sUrlBranch") = Value
146 End Set
147 End Property
148 ''' -----------------------------------------------------------------------------
149 ''' <summary>
150 ''' URL картинки с закрытой веткой.
151 ''' </summary>
152 ''' <value>По умолчанию берётся из Интернета.</value>
153 ''' <remarks>
154 ''' </remarks>
155 ''' <history>
156 ''' [Max Pro] 15.05.2007 Created
157 ''' </history>
158 ''' -----------------------------------------------------------------------------
159 <Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с закрытой веткой.")> _
160 Public Property sUrlBranchClose() As String
161 Get
162 Return CType(ViewState("sUrlBranchClose"), String)
163 End Get
164 Set(ByVal Value As String)
165 ViewState("sUrlBranchClose") = Value
166 End Set
167 End Property
168 ''' -----------------------------------------------------------------------------
169 ''' <summary>
170 ''' URL картинки с листом.
171 ''' </summary>
172 ''' <value>По умолчанию берётся из Интернета.</value>
173 ''' <remarks>
174 ''' </remarks>
175 ''' <history>
176 ''' [Max Pro] 15.05.2007 Created
177 ''' </history>
178 ''' -----------------------------------------------------------------------------
179 <Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с листом.")> _
180 Public Property sUrlLeaf() As String
181 Get
182 Return CType(ViewState("sUrlLeaf"), String)
183 End Get
184 Set(ByVal Value As String)
185 ViewState("sUrlLeaf") = Value
186 End Set
187 End Property
188 ''' -----------------------------------------------------------------------------
189 ''' <summary>
190 ''' URL картинки с ошибкой.
191 ''' </summary>
192 ''' <value>По умолчанию берётся из Интернета.</value>
193 ''' <remarks>
194 ''' </remarks>
195 ''' <history>
196 ''' [Max Pro] 15.05.2007 Created
197 ''' </history>
198 ''' -----------------------------------------------------------------------------
199 <Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с ошибкой.")> _
200 Public Property sUrlError() As String
201 Get
202 Return CType(ViewState("sUrlError"), String)
203 End Get
204 Set(ByVal Value As String)
205 ViewState("sUrlError") = Value
206 End Set
207 End Property
208 REM Свойство для внутреннего употребления
209 Private ReadOnly Property oArrayConnId() As Object(,)
210 Get
211 If IsNothing(_oArrayConnId) Then If iZap0(ViewState("sStoredProcedure"), oErr, _oArrayConnId) = 0 Then oErr = New Exception("Нет ни одного элемента.")
212 Return _oArrayConnId
213 End Get
214 End Property
215 REM Конструктор
216 Public Sub New()
217 Dim iArray(-1) As Integer
218 ViewState("iArrayIdTrue") = iArray 'массив чисел Int32, представляющих отмеченные Id.
219 ViewState("iTrunkParent") = 0 'номер корня, с которого начинаеются стволы.
220 ViewState("sConnectionString") = "" 'строка соединения с SQL-сервером.
221 ViewState("sStoredProcedure") = "" 'хранимая процедура, выдающая таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String). Ствол должен равняться 0 или Null.
222 ViewState("sUrlTrunk") = "" 'URL картинки со стволом.
223 ViewState("sUrlBranch") = "" 'URL картинки с открытой веткой.
224 ViewState("sUrlBranchClose") = "" 'URL картинки с закрытой веткой.
225 ViewState("sUrlLeaf") = "" 'URL картинки с листом.
226 ViewState("sUrlError") = "" 'URL картинки с ошибкой.
227 End Sub
228 REM Добавление дочерних элементов управления
229 Protected Overrides Sub CreateChildControls()
230 'var
231 Dim b As Boolean 'есть ли хоть один чекбокс: если false, то есть, ну а ежели true, то нету.
232 Dim i As Integer
233 Dim iMax As Integer 'число чекбоксов -1
234 Dim sUrlOpen As String
235 Dim oNode(3, -1) 'возвращаемый по ссылке массив(x,y), содержащий информацию о дереве. x0=число пробелов перед названием уровня (0 или больше), x1=url картинки, x2=код текущего уровня, x3=наименование уровня.
236 Dim oLiteralControl As New LiteralControl
237 'end var
238 If ViewState("sUrlBranch") = "" Then
239 sUrlOpen = "http://okno.mos.ru/images/gif/Image-014.gif"
240 Else
241 sUrlOpen = ViewState("sUrlBranch") 'картинка открытой ветки
242 End If
243 If IsNothing(Page.Session("oNode")) Then
244 If IsNothing(oArrayConnId) Then
245 b = True
246 oLiteralControl.Text = oErr.Message
247 Else
248 b = bInTree(oNode, ViewState("iTrunkParent"), -1, "")
249 End If
250 Page.Session("oNode") = oNode
251 Else
252 oNode = Page.Session("oNode")
253 End If
254 If b = False Then
255 iMax = UBound(oNode, 2)
256 For i = 0 To iMax
257 'var
258 Dim i2 As Integer
259 Dim oImageNull(oNode(0, i)) As WebControls.Image
260 Dim oImage As New WebControls.Image
261 Dim oCheckBox As New WebControls.CheckBox
262 'end var
263 Controls.Add(New LiteralControl("<div id=""" & oNode(2, i) & """>"))
264 For i2 = 1 To oNode(0, i)
265 oImageNull(i2) = New WebControls.Image
266 oImageNull(i2).ImageUrl = "http://okno.mos.ru/images/gif/Image-081.gif" 'пустая картинка 16х16
267 Controls.Add(oImageNull(i2))
268 Next i2
269 oImage.ImageUrl = oNode(1, i)
270 oImage.ID = "oImg" & oNode(2, i)
271 If oNode(1, i) = sUrlOpen Then
272 oImage.Attributes.Add("onclick", "fInLevel(this)")
273 oImage.Attributes.Add("title", "Нажмите для закрытия")
274 oImage.Attributes.Add("style", "cursor:pointer")
275 End If
276 Controls.Add(oImage)
277 'если попали не на лист, то делаем чекбокс пассивным
278 'If Not (oNode(1, i) = ViewState("sUrlLeaf") And ViewState("sUrlLeaf") <> "" Or oNode(1, i) = "http://okno.mos.ru/images/gif/Image-011.gif" And ViewState("sUrlLeaf") = "") Then
279 ' oCheckBox.Enabled = False
280 'End If
281 oCheckBox.ID = "oChBox" & oNode(2, i)
282 oCheckBox.Text = oNode(3, i)
283 Controls.Add(oCheckBox)
284 Controls.Add(New LiteralControl("</div>"))
285 Next i
286 Else
287 Controls.Add(oLiteralControl)
288 End If
289 End Sub
290 ''' -----------------------------------------------------------------------------
291 ''' <summary>
292 ''' Функция заполнения дерева (вызывает саму себя) = true если нет внутренней структуры.
293 ''' </summary>
294 ''' <param name="oNode">Возвращаемый по ссылке массив(x,y), содержащий информацию о дереве. x0=число пробелов перед названием уровня (0 или больше), x1=url картинки, x2=код текущего уровня, x3=наименование уровня.</param>
295 ''' <param name="iNum">Код предыдущего уровня. Для начального уровня рекомендуется задавать 0, а в хранимой процедуре ставить проверку не только на 0, но и на null.</param>
296 ''' <param name="iSpace">Число отступов перед текущим уровнем. Для начального уровня рекомендуется задавать -1, так как при вызове функции сразу идёт увеличение на единицу.</param>
297 ''' <param name="sNum">Коды предыдущих уровней через знак подчёркивания. Знаки подчёркивания лежат между кодами уровней. Для начального уровня ожидается пустая строка.</param>
298 ''' <returns>true если нет внутренней структуры и запрос на выборку ничего не вернул.</returns>
299 ''' <remarks>
300 ''' </remarks>
301 ''' <history>
302 ''' [Max Pro] 15.05.2007 Created
303 ''' </history>
304 ''' -----------------------------------------------------------------------------
305 Private Function bInTree(ByRef oNode(,) As Object, ByVal iNum As Integer, ByVal iSpace As Integer, ByVal sNum As String) As Boolean
306 'var
307 Dim b As Boolean
308 Dim i As Integer
309 Dim iMax As Integer
310 Dim sErr As String
311 Dim oZap
312 'end var
313 iNum = iZapConnId(iNum, oZap)
314 If iNum = 0 Then
315 bInTree = True
316 Exit Function
317 End If
318 iSpace += 1
319 If iNum < 0 Then
320 'var
321 Dim iCount = UBound(oNode, 2) + 1
322 'end var
323 ReDim Preserve oNode(3, iCount) 'увеличение на 1
324 oNode(0, iCount) = iSpace 'число отступов
325 If ViewState("sUrlError") = "" Then
326 oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-080.gif"
327 Else
328 oNode(1, iCount) = ViewState("sUrlError") 'картинка ошибки
329 End If
330 If sNum = "" Then oNode(2, iCount) = 0 Else oNode(2, iCount) = sNum & "_0" 'код
331 oNode(3, iCount) = "Ошибка: " & sErr 'наименование
332 Exit Function
333 End If
334 iMax = iNum - 1
335 For i = 0 To iMax
336 'var
337 Dim iCount = UBound(oNode, 2) + 1
338 'end var
339 ReDim Preserve oNode(3, iCount) 'увеличение на 1
340 oNode(0, iCount) = iSpace 'число отступов
341 If sNum = "" Then oNode(2, iCount) = oZap(0, i) Else oNode(2, iCount) = sNum & "_" & oZap(0, i) 'код
342 oNode(3, iCount) = oZap(2, i) 'наименование
343 'картинка зависит от наличия внутренней структуры, поэтому сначала вызываем функцию-саму себя
344 b = bInTree(oNode, oZap(0, i), iSpace, oNode(2, iCount))
345 If iSpace = 0 Then
346 If ViewState("sUrlTrunk") = "" Then
347 oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-012.gif"
348 Else
349 oNode(1, iCount) = ViewState("sUrlTrunk") 'картинка ствола
350 End If
351 ElseIf b = False Then
352 If ViewState("sUrlBranch") = "" Then
353 oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-014.gif"
354 Else
355 oNode(1, iCount) = ViewState("sUrlBranch") 'картинка ветки
356 End If
357 Else
358 If ViewState("sUrlLeaf") = "" Then
359 oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-011.gif"
360 Else
361 oNode(1, iCount) = ViewState("sUrlLeaf") 'картинка листа
362 End If
363 End If
364 Next i
365 End Function
366 REM Выдаёт число строк и таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String), принимая код предыдущего уровня.
367 Private Function iZapConnId(ByVal iNum As Integer, ByRef oZap(,) As Object) As Integer
368 'var
369 Dim i As Integer
370 Dim iMax As Integer
371 Dim iSum As Integer = -1
372 'end var
373 'ini
374 ReDim oZap(2, -1)
375 'end ini
376 iMax = UBound(oArrayConnId, 2)
377 For i = 0 To iMax
378 If oArrayConnId(1, i) = iNum Then
379 iSum += 1
380 iZapConnId = iSum + 1
381 ReDim Preserve oZap(2, iSum)
382 oZap(0, iSum) = oArrayConnId(0, i)
383 oZap(1, iSum) = oArrayConnId(1, i)
384 oZap(2, iSum) = oArrayConnId(2, i)
385 End If
386 Next i
387 End Function
388 ''' -----------------------------------------------------------------------------
389 ''' <summary>
390 ''' Функция взятия запроса как хранимой процедуры (по умолчанию или текст t/sql) без параметров; рекордсет возвращается в виде oZap(,).
391 ''' </summary>
392 ''' <param name="sProcedure">Название хранимой процедуры (по умолчанию или текст t/sql).</param>
393 ''' <param name="oErr">Необязательная ошибка.</param>
394 ''' <param name="oZap">Необязательный двумерный массив, содержащий рекордсет - 1-ю таблицу датасета.</param>
395 ''' <param name="eCommandType">Необязательный тип t/sql из списка; по умолчанию ― процедура.</param>
396 ''' <param name="iTimeout">Необязательное число секунд таймаута запроса.</param>
397 ''' <returns>Число затронутых строк в таблице БД; если ноль, то нормально ещё, а если -1, то запрос не прошёл, если -2, то соединение не установилось.</returns>
398 ''' <remarks>
399 ''' </remarks>
400 ''' <history>
401 ''' [Max Pro] 15.05.2007 Created
402 ''' </history>
403 ''' -----------------------------------------------------------------------------
404 Public Function iZap0(ByVal sProcedure As String, Optional ByRef oErr As Exception = Nothing, Optional ByRef oZap(,) As Object = Nothing, Optional ByVal eCommandType As CommandType = CommandType.StoredProcedure, Optional ByVal iTimeout As Integer = -1) As Integer
405 'var
406 Dim oConnection As New SqlConnection
407 Dim oCommand As New SqlCommand
408 Dim sConnectString As String = ViewState("sConnectionString")
409 Dim bConnect As Boolean
410 Dim oReader As SqlDataReader
411 Dim iX As Integer
412 Dim lY As Long
413 Dim i As Integer
414 'end var
415 iZap0 = -2
416 oErr = New Exception
417 oConnection.ConnectionString = sConnectString
418 Try
419 oConnection.Open()
420 bConnect = oConnection.State
421 If bConnect Then iZap0 = -1
422 If iTimeout >= 0 Then oCommand.CommandTimeout = iTimeout
423 oCommand.CommandType = eCommandType
424 oCommand.Connection = oConnection
425 oCommand.CommandText = sProcedure
426 oReader = oCommand.ExecuteReader()
427 iZap0 = 0
428 iX = oReader.FieldCount - 1
429 lY = -1
430 While oReader.Read()
431 lY += 1
432 If lY <= Integer.MaxValue Then '2 147 483 647
433 iZap0 = lY + 1
434 ReDim Preserve oZap(iX, lY)
435 For i = 0 To iX
436 If IsDBNull(oReader(i)) Then oZap(i, lY) = Nothing Else oZap(i, lY) = oReader(i)
437 Next i
438 End If
439 End While
440 oReader.Close()
441 oReader = Nothing
442 oCommand = Nothing
443 If lY > Integer.MaxValue Then
444 oErr = New Exception(lY.ToString("# ##0") & " строк >" & Integer.MaxValue & " (Integer.MaxValue), но массив заполнен до предела Int32.")
445 End If
446 Catch oError As Exception
447 oErr = oError
448 Finally
449 If IsNothing(oConnection) = False Then
450 oConnection.Close()
451 oConnection = Nothing
452 End If
453 End Try
454 End Function
455 ''' -----------------------------------------------------------------------------
456 ''' <summary>
457 ''' Функция поиска кода по Id чекбокса.
458 ''' </summary>
459 ''' <param name="sId">Строковый Id чекбокса.</param>
460 ''' <returns>Код уровня. Если ничего не найдено, то ноль.</returns>
461 ''' <remarks>
462 ''' </remarks>
463 ''' <history>
464 ''' [Max Pro] 15.05.2007 Created
465 ''' </history>
466 ''' -----------------------------------------------------------------------------
467 Private Function iCodeFromId(ByVal sId As String) As Integer
468 'var
469 Dim i As Integer
470 Dim iMax As Integer = Len(sId)
471 'end var
472 For i = iMax To 1 Step -1
473 If IsNumeric(Mid(sId, i)) Then iCodeFromId = Mid(sId, i) Else i = 1
474 Next i
475 End Function
476 REM Здесь можно считывать данные из HTML
477 Public Function LoadPostData(ByVal postDataKey As String, ByVal postCollection As System.Collections.Specialized.NameValueCollection) As Boolean Implements System.Web.UI.IPostBackDataHandler.LoadPostData
478 REM Функция не используется, но её наличия требует компилятор.
479 End Function
480 REM Отлов отмеченных кодов текущих уровней
481 Public Sub RaisePostDataChangedEvent() Implements System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent
482 'var
483 Dim i As Integer
484 Dim iMax As Integer = Controls.Count - 1
485 Dim iEnd As Integer 'увеличенный на один последний номер элемента массива
486 Dim sId As String
487 'end var
488 For i = 0 To iMax
489 If IsNothing(Controls(i).ID) Then sId = "" Else sId = Controls(i).ID
490 If Left(sId, 6) = "oChBox" Then
491 If CType(Controls(i), WebControls.CheckBox).Checked Then
492 iEnd = UBound(_iArrayIdTrue) + 1
493 ReDim Preserve _iArrayIdTrue(iEnd) 'увеличение на единицу
494 _iArrayIdTrue(iEnd) = iCodeFromId(Controls(i).ID)
495 End If
496 End If
497 Next i
498 End Sub
499 REM Добавление JavaScript-а
500 Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
501 'var
502 Dim sJavaScript As String
503 Dim sEnter As String = Chr(13) & Chr(10)
504 Dim sUrlOpen As String
505 Dim sUrlClose As String
506 'end var
507 'выполнение операций по умолчанию
508 MyBase.OnPreRender(e)
509 'выполняем работу по добавлению яваскрипта
510 If ViewState("sUrlBranch") = "" Then
511 sUrlOpen = "http://okno.mos.ru/images/gif/Image-014.gif"
512 Else
513 sUrlOpen = ViewState("sUrlBranch") 'картинка открытой ветки
514 End If
515 If ViewState("sUrlBranchClose") = "" Then
516 sUrlClose = "http://okno.mos.ru/images/gif/Image-013.gif"
517 Else
518 sUrlClose = ViewState("sUrlBranchClose") 'картинка закрытой ветки
519 End If
520 sJavaScript = "<script language=""javascript"" type=""text/javascript"">" & sEnter
521 sJavaScript += " // Функция скрытия или показа вложенных уровней." & sEnter
522 sJavaScript += " function fInLevel(oWhat)" & sEnter
523 sJavaScript += " {" & sEnter
524 sJavaScript += " var i,oDiv,oImg,iDivMax,iImgMax,oSearch;" & sEnter
525 sJavaScript += " oDiv=document.getElementsByTagName('div');" & sEnter
526 sJavaScript += " oImg=document.getElementsByTagName('img');" & sEnter
527 sJavaScript += " iDivMax=oDiv.length-1;" & sEnter
528 sJavaScript += " iImgMax=oImg.length-1;" & sEnter
529 sJavaScript += " oSearch=oWhat.id.substring(oWhat.id.indexOf('oImg')+4)+'_';" & sEnter
530 sJavaScript += " if(oWhat.src=='" & sUrlOpen & "')" & sEnter
531 sJavaScript += " {" & sEnter
532 sJavaScript += " oWhat.src='" & sUrlClose & "';" & sEnter
533 sJavaScript += " oWhat.title='Нажмите для открытия';" & sEnter
534 sJavaScript += " for(i=0;i<=iDivMax;i++)" & sEnter
535 sJavaScript += " {" & sEnter
536 sJavaScript += " if(oDiv[i].id.indexOf(oSearch)!=-1)" & sEnter
537 sJavaScript += " {" & sEnter
538 sJavaScript += " oDiv[i].style.display='none';" & sEnter
539 sJavaScript += " }" & sEnter
540 sJavaScript += " }" & sEnter
541 sJavaScript += " }" & sEnter
542 sJavaScript += " else" & sEnter
543 sJavaScript += " {" & sEnter
544 sJavaScript += " oWhat.src='" & sUrlOpen & "';" & sEnter
545 sJavaScript += " oWhat.title='Нажмите для закрытия';" & sEnter
546 sJavaScript += " for(i=0;i<=iDivMax;i++)" & sEnter
547 sJavaScript += " {" & sEnter
548 sJavaScript += " if(oDiv[i].id.indexOf(oSearch)!=-1)" & sEnter
549 sJavaScript += " {" & sEnter
550 sJavaScript += " oDiv[i].style.display='';" & sEnter
551 sJavaScript += " }" & sEnter
552 sJavaScript += " }" & sEnter
553 sJavaScript += " for(i=0;i<=iImgMax;i++)" & sEnter
554 sJavaScript += " {" & sEnter
555 sJavaScript += " if(oImg[i].id.indexOf(oSearch)!=-1 && oImg[i].src=='" & sUrlClose & "')" & sEnter
556 sJavaScript += " {" & sEnter
557 sJavaScript += " oImg[i].src='" & sUrlOpen & "';" & sEnter
558 sJavaScript += " oImg[i].title='Нажмите для закрытия';" & sEnter
559 sJavaScript += " }" & sEnter
560 sJavaScript += " }" & sEnter
561 sJavaScript += " }" & sEnter
562 sJavaScript += " }" & sEnter
563 sJavaScript += "</script>"
564 If Page.IsClientScriptBlockRegistered("WebCustomPanelTrCh") = False Then Page.RegisterClientScriptBlock("WebCustomPanelTrCh", sJavaScript)
565 End Sub
566 End Class
567 |
| Вернуться к списку исходников в категории Создание элементов управления |
|
|
 |
 |
 |
 |
|
|