Rambler's Top100
Главная
Новости
Статьи
Форумы
Книги
Коды
Сообщество
Блоги
О нас
 

Логин

Email:
  Пароль:

Войти
Зарегистрироваться
Забыл пароль

Поиск

 Искать :
 
Вперед

Книги по теме

Искать:
в:
Порядок:

Исходник

Автор:

Max Pro

 
Название:

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 из списка; по умолчанию &#8213; процедура.</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 
Вернуться к списку исходников в категории Создание элементов управления
 
Наш Киев

Apartments for Rent

Rambler's Top100
Рейтинг@Mail.ru
Идея: Dimon aka Manowar Программирование: Dimon aka Manowar Дизайн: Dan Lebedev
Хостинг от компании Parking.ru
Карта сайта