|
|
|
 |
 |
Исходник |
 |
|
 |
 |
|
Автор:
|
|
|
Название:
|
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-имени пользователя номера закрытых веток ― 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-имени пользователя номера закрытых веток ― 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 Загружается ли этот элемент управления повторно как постбэк или же нет ― по первому разу ― свойство для внутреннего употребления.
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 'загружается ли этот элемент управления повторно как постбэк или же нет ― по первому разу.
324 ViewState("iTrunkParent") = 0 'номер корня, с которого начинаеются стволы.
325 ViewState("sConnectionString") = "" 'строка соединения с SQL-сервером.
326 ViewState("sStoredProcedure") = "" 'хранимая процедура, выдающая таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String). Ствол должен равняться 0 или Null.
327 ViewState("sTableClose") = "dbo.tabChTrConnIdClose" 'имя таблицы, хранящей по ip-адресу и dns-имени пользователя номера закрытых веток ― 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 из списка; по умолчанию ― процедура.</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 | | | |