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

Логин

Email:
  Пароль:

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

Поиск

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

Книги по теме

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

Исходник

Автор:

Max Pro

 
Название:

WebTrChAlt --- альтернативная по отношению к WebCustomPanelTrCh версия дерева чекбоксов. Работает как в сетапах.

Дата: 03 December 2007
Описание: Список отличий от WebCustomPanelTrCh: 1) поведение теперь как в сетапах (примечание: серые галочки снимаются по нажатию на наименовании, а не на самой галочке - ограничение html) 2) может сохраняться состояние свёрнутости папок (свойство sTableClose) 3) за счёт усложнения Яваскрипта галочки проставляются с небольшой задержкой, величина задержки зависит от железа конечного пользователя и от сложности дерева. 
  Разместить ссылку на этот исходник в форуме вы можете вставив в текст сообщения следующую строку: [CODEPOST ID=218]WebTrChAlt --- альтернативная по отношению к WebCustomPanelTrCh версия дерева чекбоксов. Работает как в сетапах.[/CODEPOST]
Оценка: Проголосовало 2 посетителей, средняя оценка 2.50
Оценить:
  1 Разметка html может выглядеть примерно так:
  2 <cc1:WebTrChAlt runat="server" sStoredProcedure="Procedure..." iArrayIdTrue="Массив Int32[]"
  3 						Height="400px" Width="100%" Font-Size="8pt" Font-Names="Arial Unicode MS" ID="WebTrChAlt1"
  4 						sConnectionString="user id=...; password=...; data source=...;initial catalog=..."
  5 						Style="overflow: auto" onscroll="fScroll(this)">
  6 					</cc1:WebTrChAlt>
  7 		// Функция записи позиции вертикального скроллинга в скрытое поле hidScroll
  8 		function fScroll(val)
  9 		{
 10 		   document.getElementById('hidScroll').value = val.scrollTop;
 11 		}
 12 Код VB версии 7.1 и выше
 13 REM Панель с раскрытым деревом чекбоксов, заполняется рекурсивно.
 14 Option Compare Text
 15 Imports System.ComponentModel
 16 Imports System.Web.UI
 17 Imports System.Drawing
 18 Imports System.Data.SqlClient
 19 ''' -----------------------------------------------------------------------------
 20 ''' Project	 : WebControlLibrary2
 21 ''' Class	 : WebTrChAlt
 22 ''' 
 23 ''' -----------------------------------------------------------------------------
 24 ''' <summary>
 25 ''' Элемент управления, выдающий раскрытое дерево чекбоксов рекурсивно. Альтернативное поведение, т.е. как в сетапах.
 26 ''' </summary>
 27 ''' <remarks>
 28 ''' </remarks>
 29 ''' <history>
 30 ''' 	[Max Pro]	15.05.2007	Created WebCustomPanelTrCh
 31 ''' 	[Max Pro]	27.11.2007	Created WebTrChAlt
 32 ''' </history>
 33 ''' -----------------------------------------------------------------------------
 34 <DefaultProperty("iArrayIdTrue"), ToolboxData("<{0}:WebTrChAlt runat=server></{0}:WebTrChAlt>"), ToolboxBitmap(GetType(Bitmap))> _
 35 Public Class WebTrChAlt
 36 	Inherits System.Web.UI.WebControls.Panel
 37 	Implements INamingContainer, IPostBackDataHandler
 38 	Private _iArrayIdTrue(-1) As Integer 'массив чисел Int32, представляющих отмеченные коды конечных уровней.
 39 	Private _iArrayIdBranchTrue(-1) As Integer 'массив чисел Int32, представляющих отмеченные коды неконечных уровней.
 40 	Private _iArrayIdAltTrue(-1) As Integer	'массив чисел Int32, представляющих отмеченные коды по-возможности следующих за отмеченными наименьшими уровнями.
 41 	Private zapConnection As SqlConnection
 42 	Private zapConnectString As String
 43 	Private iArrayImgIdOpen(-1) As Integer 'массив чисел Int32, представляющих коды текущих уровней развёрнутых папок.
 44 	Private sArrayImgIdOpen(-1) As String 'массив строк, представляющих древестные коды текущих уровней развёрнутых папок.
 45 	Private iArrayImgIdClose(-1) As Integer	'массив чисел Int32, представляющих коды текущих уровней свёрнутых папок.
 46 	Private sArrayImgIdClose(-1) As String 'массив строк, представляющих древестные коды текущих уровней свёрнутых папок.
 47 	Private _oArrayConnId(,)
 48 	Private oErr As Exception
 49 	''' -----------------------------------------------------------------------------
 50 	''' <summary>
 51 	''' Массив чисел Int32, представляющих отмеченные коды конечных уровней. Работает только для чтения.
 52 	''' </summary>
 53 	''' <value>По умолчанию выдаёт пустой массив.</value>
 54 	''' <remarks>
 55 	''' </remarks>
 56 	''' <history>
 57 	''' 	[Max Pro]	15.05.2007	Created
 58 	''' </history>
 59 	''' -----------------------------------------------------------------------------
 60 	<Bindable(True), Category("Data"), DefaultValue(""), Description("Массив чисел Int32, представляющих отмеченные коды конечных уровней. Работает только для чтения.")> _
 61  Public ReadOnly Property iArrayIdTrue() As Integer()
 62 		Get
 63 			If UBound(_iArrayIdTrue) = -1 Then RaisePostDataChangedEvent()
 64 			Return _iArrayIdTrue
 65 		End Get
 66 	End Property
 67 	''' -----------------------------------------------------------------------------
 68 	''' <summary>
 69 	''' Массив чисел Int32, представляющих отмеченные коды неконечных уровней. Работает только для чтения.
 70 	''' </summary>
 71 	''' <value>По умолчанию выдаёт пустой массив.</value>
 72 	''' <remarks>
 73 	''' </remarks>
 74 	''' <history>
 75 	''' 	[Max Pro]	30.11.2007	Created
 76 	''' </history>
 77 	''' -----------------------------------------------------------------------------
 78 	<Bindable(True), Category("Data"), DefaultValue(""), Description("Массив чисел Int32, представляющих отмеченные коды неконечных уровней. Работает только для чтения.")> _
 79  Public ReadOnly Property iArrayIdBranchTrue() As Integer()
 80 		Get
 81 			If UBound(_iArrayIdBranchTrue) = -1 Then RaisePostDataChangedEvent()
 82 			Return _iArrayIdBranchTrue
 83 		End Get
 84 	End Property
 85 	''' -----------------------------------------------------------------------------
 86 	''' <summary>
 87 	''' Массив чисел Int32, представляющих отмеченные коды по-возможности следующих за отмеченными наименьшими уровнями. Работает только для чтения.
 88 	''' </summary>
 89 	''' <value>По умолчанию выдаёт пустой массив.</value>
 90 	''' <remarks>
 91 	''' </remarks>
 92 	''' <history>
 93 	''' 	[Max Pro]	30.11.2007	Created
 94 	''' </history>
 95 	''' -----------------------------------------------------------------------------
 96 	<Bindable(True), Category("Data"), DefaultValue(""), Description("Массив чисел Int32, представляющих отмеченные коды по-возможности следующих за отмеченными наименьшими уровнями. Работает только для чтения.")> _
 97  Public ReadOnly Property iArrayIdAltTrue() As Integer()
 98 		Get
 99 			If UBound(_iArrayIdAltTrue) = -1 Then RaisePostDataChangedEvent()
100 			Return _iArrayIdAltTrue
101 		End Get
102 	End Property
103 	''' -----------------------------------------------------------------------------
104 	''' <summary>
105 	''' Номер корня, с которого начинаеются стволы.
106 	''' </summary>
107 	''' <value>По умолчанию ноль.</value>
108 	''' <remarks>
109 	''' </remarks>
110 	''' <history>
111 	''' 	[Max Pro]	15.05.2007	Created
112 	''' </history>
113 	''' -----------------------------------------------------------------------------
114 	<Bindable(True), Category("Data"), DefaultValue(0), Description("Номер корня, с которого начинаеются стволы.")> _
115 	Public Property iTrunkParent() As Integer
116 		Get
117 			Return CType(ViewState("iTrunkParent"), Integer)
118 		End Get
119 		Set(ByVal Value As Integer)
120 			ViewState("iTrunkParent") = Value
121 		End Set
122 	End Property
123 	''' -----------------------------------------------------------------------------
124 	''' <summary>
125 	''' Строка соединения с базой данных SQL-сервер.
126 	''' </summary>
127 	''' <value>По умолчанию пустая строка.</value>
128 	''' <remarks>
129 	''' </remarks>
130 	''' <history>
131 	''' 	[Max Pro]	15.05.2007	Created
132 	''' </history>
133 	''' -----------------------------------------------------------------------------
134 	<Bindable(True), Category("Data"), DefaultValue(""), Description("Строка соединения с базой данных SQL-сервер.")> _
135 	Public Property sConnectionString() As String
136 		Get
137 			Return CType(ViewState("sConnectionString"), String)
138 		End Get
139 		Set(ByVal Value As String)
140 			ViewState("sConnectionString") = Value
141 		End Set
142 	End Property
143 	''' -----------------------------------------------------------------------------
144 	''' <summary>
145 	''' Хранимая процедура, выдающая таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String).
146 	''' </summary>
147 	''' <value>По умолчанию пустая строка.</value>
148 	''' <remarks>
149 	''' </remarks>
150 	''' <history>
151 	''' 	[Max Pro]	15.05.2007	Created
152 	''' </history>
153 	''' -----------------------------------------------------------------------------
154 	<Bindable(True), Category("Data"), DefaultValue(""), Description("Хранимая процедура, выдающая таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String).")> _
155 	Public Property sStoredProcedure() As String
156 		Get
157 			Return CType(ViewState("sStoredProcedure"), String)
158 		End Get
159 		Set(ByVal Value As String)
160 			ViewState("sStoredProcedure") = Value
161 		End Set
162 	End Property
163 	''' -----------------------------------------------------------------------------
164 	''' <summary>
165 	''' Имя таблицы, хранящей по ip-адресу и dns-имени пользователя номера закрытых веток &#8213; CREATE TABLE [Владелец].[Таблица] ([iId] [int] IDENTITY (1, 1) NOT NULL,[sUserHostName] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,[sUserHostAddress] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,[sUserAgent] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,[iUserLang] [int] NULL,[iIdBranchClose] [int] NULL,[sIdBranchClose] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,CONSTRAINT [PK_tabChTrConnIdClose] PRIMARY KEY CLUSTERED([iId]) ON [PRIMARY]) ON [PRIMARY].
166 	''' </summary>
167 	''' <value>По умолчанию dbo.tabChTrConnIdClose.</value>
168 	''' <remarks>
169 	''' </remarks>
170 	''' <history>
171 	''' 	[Max Pro]	02.07.2007	Created
172 	''' </history>
173 	''' -----------------------------------------------------------------------------
174 	<Bindable(True), Category("Data"), DefaultValue("dbo.tabChTrConnIdClose"), Description("Имя таблицы, хранящей по ip-адресу и dns-имени пользователя номера закрытых веток &#8213; CREATE TABLE [Владелец].[Таблица] ([iId] [int] IDENTITY (1, 1) NOT NULL,[sUserHostName] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,[sUserHostAddress] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,[sUserAgent] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,[iUserLang] [int] NULL,[iIdBranchClose] [int] NULL,[sIdBranchClose] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,CONSTRAINT [PK_tabChTrConnIdClose] PRIMARY KEY CLUSTERED([iId]) ON [PRIMARY]) ON [PRIMARY].")> _
175 	Public Property sTableClose() As String
176 		Get
177 			Return CType(ViewState("sTableClose"), String)
178 		End Get
179 		Set(ByVal Value As String)
180 			ViewState("sTableClose") = Value
181 		End Set
182 	End Property
183 	''' -----------------------------------------------------------------------------
184 	''' <summary>
185 	''' URL картинки со стволом.
186 	''' </summary>
187 	''' <value>По умолчанию берётся из Интернета.</value>
188 	''' <remarks>
189 	''' </remarks>
190 	''' <history>
191 	''' 	[Max Pro]	15.05.2007	Created
192 	''' </history>
193 	''' -----------------------------------------------------------------------------
194 	<Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки со стволом.")> _
195 	Public Property sUrlTrunk() As String
196 		Get
197 			Return CType(ViewState("sUrlTrunk"), String)
198 		End Get
199 		Set(ByVal Value As String)
200 			ViewState("sUrlTrunk") = Value
201 		End Set
202 	End Property
203 	''' -----------------------------------------------------------------------------
204 	''' <summary>
205 	''' URL картинки с открытой веткой.
206 	''' </summary>
207 	''' <value>По умолчанию берётся из Интернета.</value>
208 	''' <remarks>
209 	''' </remarks>
210 	''' <history>
211 	''' 	[Max Pro]	15.05.2007	Created
212 	''' </history>
213 	''' -----------------------------------------------------------------------------
214 	<Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с открытой веткой.")> _
215 	Public Property sUrlBranch() As String
216 		Get
217 			Return CType(ViewState("sUrlBranch"), String)
218 		End Get
219 		Set(ByVal Value As String)
220 			ViewState("sUrlBranch") = Value
221 		End Set
222 	End Property
223 	''' -----------------------------------------------------------------------------
224 	''' <summary>
225 	''' URL картинки с закрытой веткой.
226 	''' </summary>
227 	''' <value>По умолчанию берётся из Интернета.</value>
228 	''' <remarks>
229 	''' </remarks>
230 	''' <history>
231 	''' 	[Max Pro]	15.05.2007	Created
232 	''' </history>
233 	''' -----------------------------------------------------------------------------
234 	<Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с закрытой веткой.")> _
235 	Public Property sUrlBranchClose() As String
236 		Get
237 			Return CType(ViewState("sUrlBranchClose"), String)
238 		End Get
239 		Set(ByVal Value As String)
240 			ViewState("sUrlBranchClose") = Value
241 		End Set
242 	End Property
243 	''' -----------------------------------------------------------------------------
244 	''' <summary>
245 	''' URL картинки с листом.
246 	''' </summary>
247 	''' <value>По умолчанию берётся из Интернета.</value>
248 	''' <remarks>
249 	''' </remarks>
250 	''' <history>
251 	''' 	[Max Pro]	15.05.2007	Created
252 	''' </history>
253 	''' -----------------------------------------------------------------------------
254 	<Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с листом.")> _
255 	Public Property sUrlLeaf() As String
256 		Get
257 			Return CType(ViewState("sUrlLeaf"), String)
258 		End Get
259 		Set(ByVal Value As String)
260 			ViewState("sUrlLeaf") = Value
261 		End Set
262 	End Property
263 	''' -----------------------------------------------------------------------------
264 	''' <summary>
265 	''' URL картинки с ошибкой.
266 	''' </summary>
267 	''' <value>По умолчанию берётся из Интернета.</value>
268 	''' <remarks>
269 	''' </remarks>
270 	''' <history>
271 	''' 	[Max Pro]	15.05.2007	Created
272 	''' </history>
273 	''' -----------------------------------------------------------------------------
274 	<Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с ошибкой.")> _
275 	Public Property sUrlError() As String
276 		Get
277 			Return CType(ViewState("sUrlError"), String)
278 		End Get
279 		Set(ByVal Value As String)
280 			ViewState("sUrlError") = Value
281 		End Set
282 	End Property
283 	''' -----------------------------------------------------------------------------
284 	''' <summary>
285 	''' Объектный двумерный массив, содержащий таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String). Ствол должен равняться 0 или Null.
286 	''' </summary>
287 	''' <value>По умолчанию массив не определён (Nothing или null)</value>
288 	''' <remarks>
289 	''' </remarks>
290 	''' <history>
291 	''' 	[Max Pro]	05.07.2007	Created
292 	''' </history>
293 	''' -----------------------------------------------------------------------------
294 	<Bindable(True), Category("Data"), Description("Объектный двумерный массив, содержащий таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String). Ствол должен равняться 0 или Null.")> _
295 	Public Property oArrayConnId() As Object(,)
296 		Get
297 			If IsNothing(_oArrayConnId) Then
298 				If ViewState("sStoredProcedure") > "" Then
299 					If iZap0(ViewState("sStoredProcedure"), oErr, _oArrayConnId) = 0 Then oErr = New Exception("Нет ни одного элемента.")
300 				Else
301 					oErr = New Exception("Ни один элемент не был определён. Свойство oArrayConnId оказалось незаданным, а сформировать его автоматически посредством свойства sStoredProcedure оказалось невозможным, так как свойство sStoredProcedure также оказалось незаданным.")
302 				End If
303 			End If
304 			Return _oArrayConnId
305 		End Get
306 		Set(ByVal Value As Object(,))
307 			_oArrayConnId = Value
308 		End Set
309 	End Property
310 	REM Загружается ли этот элемент управления повторно как постбэк или же нет &#8213; по первому разу &#8213; свойство для внутреннего употребления.
311 	Private ReadOnly Property bIsPostBack() As Boolean
312 		Get
313 			If ViewState("bIsPostBack") = False Then
314 				ViewState("bIsPostBack") = True
315 				Return False
316 			Else
317 				Return True
318 			End If
319 		End Get
320 	End Property
321 	REM Конструктор
322 	Public Sub New()
323 		ViewState("bIsPostBack") = False 'загружается ли этот элемент управления повторно как постбэк или же нет &#8213; по первому разу.
324 		ViewState("iTrunkParent") = 0 'номер корня, с которого начинаеются стволы.
325 		ViewState("sConnectionString") = ""	'строка соединения с SQL-сервером.
326 		ViewState("sStoredProcedure") = "" 'хранимая процедура, выдающая таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String). Ствол должен равняться 0 или Null.
327 		ViewState("sTableClose") = "dbo.tabChTrConnIdClose"	'имя таблицы, хранящей по ip-адресу и dns-имени пользователя номера закрытых веток &#8213; CREATE TABLE [Владелец].[Таблица] ([iId] [int] IDENTITY (1, 1) NOT NULL,[sUserHostName] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,[sUserHostAddress] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,[sUserAgent] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,[iUserLang] [int] NULL,[iIdBranchClose] [int] NULL,[sIdBranchClose] [nvarchar] (4000) COLLATE Cyrillic_General_CI_AS NULL,CONSTRAINT [PK_tabChTrConnIdClose] PRIMARY KEY CLUSTERED([iId]) ON [PRIMARY]) ON [PRIMARY].
328 		ViewState("sUrlTrunk") = ""	'URL картинки со стволом.
329 		ViewState("sUrlBranch") = "" 'URL картинки с открытой веткой.
330 		ViewState("sUrlBranchClose") = "" 'URL картинки с закрытой веткой.
331 		ViewState("sUrlLeaf") = "" 'URL картинки с листом.
332 		ViewState("sUrlError") = ""	'URL картинки с ошибкой.
333 	End Sub
334 	REM Добавление дочерних элементов управления
335 	Protected Overrides Sub CreateChildControls()
336 		'var
337 		Dim b As Boolean 'есть ли хоть один чекбокс: если false, то есть, ну а ежели true, то нету.
338 		Dim i As Integer
339 		Dim iMax As Integer	'число чекбоксов -1
340 		Dim sUrlOpen As String
341 		Dim sUrlLeaf As String
342 		Dim oNode(3, -1) 'возвращаемый по ссылке массив(x,y), содержащий информацию о дереве. x0=число пробелов перед названием уровня (0 или больше), x1=url картинки, x2=код текущего уровня, x3=наименование уровня.
343 		Dim oLiteralControl As New LiteralControl
344 		'end var
345 		If ViewState("sUrlBranch") = "" Then
346 			sUrlOpen = "http://okno.mos.ru/images/gif/Image-014.gif"
347 		Else
348 			sUrlOpen = ViewState("sUrlBranch") 'картинка открытой ветки
349 		End If
350 		If ViewState("sUrlLeaf") = "" Then
351 			sUrlLeaf = "http://okno.mos.ru/images/gif/Image-011.gif"
352 		Else
353 			sUrlLeaf = ViewState("sUrlLeaf") 'картинка листа
354 		End If
355 		If IsNothing(Page.Session("oNode")) Then
356 			If IsNothing(oArrayConnId) Then
357 				b = True
358 				oLiteralControl.Text = oErr.Message
359 			Else
360 				b = bInTree(oNode, ViewState("iTrunkParent"), -1, "")
361 			End If
362 			Page.Session("oNode") = oNode
363 		Else
364 			oNode = Page.Session("oNode")
365 		End If
366 		If b = False Then
367 			iMax = UBound(oNode, 2)
368 			For i = 0 To iMax
369 				'var
370 				Dim i2 As Integer
371 				Dim oPanel As New WebControls.Panel
372 				Dim oPanelCheckBox As New HtmlControls.HtmlAnchor
373 				Dim oImageNull(oNode(0, i)) As WebControls.Image
374 				Dim oImage As New WebControls.Image
375 				Dim oCheckBox As New WebControls.CheckBox
376 				'end var
377 				oPanel.ID = "oPanel" & oNode(2, i)
378 				For i2 = 1 To oNode(0, i)
379 					oImageNull(i2) = New WebControls.Image
380 					oImageNull(i2).ImageUrl = "http://okno.mos.ru/images/gif/Image-081.gif"	'пустая картинка 16х16
381 					oPanel.Controls.Add(oImageNull(i2))
382 				Next i2
383 				oImage.ImageUrl = oNode(1, i)
384 				oImage.ID = "oImg" & oNode(2, i)
385 				If oNode(1, i) = sUrlOpen Then
386 					oImage.Attributes.Add("onclick", "fInLevel(this)")
387 					oImage.Attributes.Add("title", "Нажмите для закрытия")
388 					oImage.Attributes.Add("style", "cursor:pointer")
389 				End If
390 				oPanel.Controls.Add(oImage)
391 				oCheckBox.ID = "oChBox" & oNode(2, i)
392 				oCheckBox.Text = oNode(3, i)
393 				If oNode(1, i) <> sUrlLeaf Then
394 					'если попали не на лист
395 					oPanelCheckBox.Attributes.Add("onclick", "fCheckLevel(document.getElementById('" & ClientID & "_" & oCheckBox.ClientID & "'))")
396 					oPanelCheckBox.Controls.Add(oCheckBox)
397 					oPanel.Controls.Add(oPanelCheckBox)
398 					oCheckBox = New WebControls.CheckBox
399 					oCheckBox.ID = "oChChe" & oNode(2, i)
400 					oCheckBox.Attributes.Add("style", "display:none")
401 					oPanel.Controls.Add(oCheckBox)
402 					oCheckBox = New WebControls.CheckBox
403 					oCheckBox.ID = "oChDis" & oNode(2, i)
404 					oCheckBox.Attributes.Add("style", "display:none")
405 					oPanel.Controls.Add(oCheckBox)
406 				Else
407 					oCheckBox.Attributes.Add("onclick", "fCheckLevel(this)")
408 					oPanel.Controls.Add(oCheckBox)
409 				End If
410 				If oNode(1, i) = sUrlOpen Then
411 					oCheckBox = New WebControls.CheckBox
412 					oCheckBox.ID = "oChImg" & oNode(2, i)
413 					oCheckBox.Attributes.Add("style", "display:none")
414 					oPanel.Controls.Add(oCheckBox)
415 				End If
416 				Controls.Add(oPanel)
417 			Next i
418 		Else
419 			Controls.Add(oLiteralControl)
420 		End If
421 	End Sub
422 	''' -----------------------------------------------------------------------------
423 	''' <summary>
424 	''' Функция заполнения дерева (вызывает саму себя) = true если нет внутренней структуры.
425 	''' </summary>
426 	''' <param name="oNode">Возвращаемый по ссылке массив(x,y), содержащий информацию о дереве. x0=число пробелов перед названием уровня (0 или больше), x1=url картинки, x2=код текущего уровня, x3=наименование уровня.</param>
427 	''' <param name="iNum">Код предыдущего уровня. Для начального уровня рекомендуется задавать 0, а в хранимой процедуре ставить проверку не только на 0, но и на null.</param>
428 	''' <param name="iSpace">Число отступов перед текущим уровнем. Для начального уровня рекомендуется задавать -1, так как при вызове функции сразу идёт увеличение на единицу.</param>
429 	''' <param name="sNum">Коды предыдущих уровней через знак подчёркивания. Знаки подчёркивания лежат между кодами уровней. Для начального уровня ожидается пустая строка.</param>
430 	''' <returns>true если нет внутренней структуры и запрос на выборку ничего не вернул.</returns>
431 	''' <remarks>
432 	''' </remarks>
433 	''' <history>
434 	''' 	[Max Pro]	15.05.2007	Created
435 	''' </history>
436 	''' -----------------------------------------------------------------------------
437 	Private Function bInTree(ByRef oNode(,) As Object, ByVal iNum As Integer, ByVal iSpace As Integer, ByVal sNum As String) As Boolean
438 		'var
439 		Dim b As Boolean
440 		Dim i As Integer
441 		Dim iMax As Integer
442 		Dim oZap
443 		'end var
444 		iNum = iZapConnId(iNum, oZap)
445 		If iNum = 0 Then
446 			bInTree = True
447 			Exit Function
448 		End If
449 		iSpace += 1
450 		iMax = iNum - 1
451 		For i = 0 To iMax
452 			'var
453 			Dim iCount As Integer = UBound(oNode, 2) + 1
454 			'end var
455 			ReDim Preserve oNode(3, iCount)	'увеличение на 1
456 			oNode(0, iCount) = iSpace 'число отступов
457 			If sNum = "" Then oNode(2, iCount) = oZap(0, i) Else oNode(2, iCount) = sNum & "_" & oZap(0, i) 'код
458 			oNode(3, iCount) = oZap(2, i) 'наименование
459 			'картинка зависит от наличия внутренней структуры, поэтому сначала вызываем функцию-саму себя
460 			b = bInTree(oNode, oZap(0, i), iSpace, oNode(2, iCount))
461 			If iSpace = 0 Then
462 				If ViewState("sUrlTrunk") = "" Then
463 					oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-012.gif"
464 				Else
465 					oNode(1, iCount) = ViewState("sUrlTrunk") 'картинка ствола
466 				End If
467 			ElseIf b = False Then
468 				If ViewState("sUrlBranch") = "" Then
469 					oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-014.gif"
470 				Else
471 					oNode(1, iCount) = ViewState("sUrlBranch") 'картинка ветки
472 				End If
473 			Else
474 				If ViewState("sUrlLeaf") = "" Then
475 					oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-011.gif"
476 				Else
477 					oNode(1, iCount) = ViewState("sUrlLeaf") 'картинка листа
478 				End If
479 			End If
480 		Next i
481 	End Function
482 	REM Выдаёт число строк и таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String), принимая код предыдущего уровня.
483 	Private Function iZapConnId(ByVal iNum As Integer, ByRef oZap(,) As Object) As Integer
484 		'var
485 		Dim i As Integer
486 		Dim iMax As Integer
487 		Dim iSum As Integer = -1
488 		'end var
489 		'ini
490 		ReDim oZap(2, -1)
491 		'end ini
492 		iMax = UBound(oArrayConnId, 2)
493 		For i = 0 To iMax
494 			If oArrayConnId(1, i) = iNum Then
495 				iSum += 1
496 				iZapConnId = iSum + 1
497 				ReDim Preserve oZap(2, iSum)
498 				oZap(0, iSum) = oArrayConnId(0, i)
499 				oZap(1, iSum) = oArrayConnId(1, i)
500 				oZap(2, iSum) = oArrayConnId(2, i)
501 			End If
502 		Next i
503 	End Function
504 	''' -----------------------------------------------------------------------------
505 	''' <summary>
506 	''' Функция взятия запроса как хранимой процедуры (по умолчанию или текст t/sql) без параметров; рекордсет возвращается в виде oZap(,).
507 	''' </summary>
508 	''' <param name="sProcedure">Название хранимой процедуры (по умолчанию или текст t/sql).</param>
509 	''' <param name="oErr">Необязательная ошибка.</param>
510 	''' <param name="oZap">Необязательный двумерный массив, содержащий рекордсет - 1-ю таблицу датасета.</param>
511 	''' <param name="eCommandType">Необязательный тип t/sql из списка; по умолчанию &#8213; процедура.</param>
512 	''' <param name="iTimeout">Необязательное число секунд таймаута запроса.</param>
513 	''' <returns>Число затронутых строк в таблице БД; если ноль, то нормально ещё, а если -1, то запрос не прошёл, если -2, то соединение не установилось.</returns>
514 	''' <remarks>
515 	''' </remarks>
516 	''' <history>
517 	''' 	[Max Pro]	15.05.2007	Created
518 	''' </history>
519 	''' -----------------------------------------------------------------------------
520 	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
521 		'var
522 		Dim oConnection As New SqlConnection
523 		Dim oCommand As New SqlCommand
524 		Dim sConnectString As String = ViewState("sConnectionString")
525 		Dim bConnect As Boolean
526 		Dim oReader As SqlDataReader
527 		Dim iX As Integer
528 		Dim lY As Long
529 		Dim i As Integer
530 		'end var
531 		iZap0 = -2
532 		oErr = New Exception
533 		oConnection.ConnectionString = sConnectString
534 		Try
535 			oConnection.Open()
536 			bConnect = oConnection.State
537 			If bConnect Then iZap0 = -1
538 			If iTimeout >= 0 Then oCommand.CommandTimeout = iTimeout
539 			oCommand.CommandType = eCommandType
540 			oCommand.Connection = oConnection
541 			oCommand.CommandText = sProcedure
542 			oReader = oCommand.ExecuteReader()
543 			iZap0 = 0
544 			iX = oReader.FieldCount - 1
545 			lY = -1
546 			While oReader.Read()
547 				lY += 1
548 				If lY <= Integer.MaxValue Then	'2 147 483 647
549 					iZap0 = lY + 1
550 					ReDim Preserve oZap(iX, lY)
551 					For i = 0 To iX
552 						If IsDBNull(oReader(i)) Then oZap(i, lY) = Nothing Else oZap(i, lY) = oReader(i)
553 					Next i
554 				End If
555 			End While
556 			oReader.Close()
557 			oReader = Nothing
558 			oCommand = Nothing
559 			If lY > Integer.MaxValue Then
560 				oErr = New Exception(lY.ToString("# ##0") & " строк >" & Integer.MaxValue & " (Integer.MaxValue), но массив заполнен до предела Int32.")
561 			End If
562 		Catch oError As Exception
563 			oErr = oError
564 		Finally
565 			If IsNothing(oConnection) = False Then
566 				oConnection.Close()
567 				oConnection = Nothing
568 			End If
569 		End Try
570 	End Function
571 	''' -----------------------------------------------------------------------------
572 	''' <summary>
573 	''' Функция взятия запроса как инструкции t/sql; рекордсет не возвращается.
574 	''' </summary>
575 	''' <param name="sSql">Строка t/sql.</param>
576 	''' <param name="oErr">Необязательная ошибка.</param>
577 	''' <param name="iTimeout">Необязательное число секунд таймаута запроса.</param>
578 	''' <returns>Число затронутых строк в таблице БД; если ноль, то нормально ещё, а если -1, то запрос не прошёл, если -2, то соединение не установилось.</returns>
579 	''' <remarks>
580 	''' </remarks>
581 	''' <history>
582 	''' 	[Max Pro]	11.04.2007	Created
583 	''' </history>
584 	''' -----------------------------------------------------------------------------
585 	Public Function iZapExe(ByVal sSql As String, Optional ByRef oErr As Exception = Nothing, Optional ByVal iTimeout As Integer = -1) As Integer
586 		'var
587 		Dim oConnection As New SqlConnection
588 		Dim oCommand As New SqlCommand
589 		Dim bConnect As Boolean
590 		Dim sConnectString As String = ViewState("sConnectionString")
591 		'end var
592 		iZapExe = -2
593 		oErr = New Exception
594 		oConnection.ConnectionString = sConnectString
595 		Try
596 			oConnection.Open()
597 			bConnect = oConnection.State
598 			If bConnect Then iZapExe = -1
599 			If iTimeout >= 0 Then oCommand.CommandTimeout = iTimeout
600 			oCommand.CommandType = CommandType.Text
601 			oCommand.Connection = oConnection
602 			oCommand.CommandText = sSql
603 			iZapExe = oCommand.ExecuteNonQuery()
604 			oCommand = Nothing
605 		Catch oError As Exception
606 			oErr = oError
607 		Finally
608 			If IsNothing(oConnection) = False Then
609 				oConnection.Close()
610 				oConnection = Nothing
611 			End If
612 		End Try
613 	End Function
614 	''' -----------------------------------------------------------------------------
615 	''' <summary>
616 	''' Функция поиска кода по Id чекбокса.
617 	''' </summary>
618 	''' <param name="sId">Строковый Id чекбокса.</param>
619 	''' <returns>Код уровня. Если ничего не найдено, то ноль.&l