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

Логин

Email:
  Пароль:

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

Поиск

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

Книги по теме

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

Исходник

Автор:

Max Pro

 
Название:

WebCustomPanelTrCh - панель с раскрытым деревом чекбоксов, заполняется рекурсивно.

Дата: 10 March 2006
Описание: В примере показано как надо использовать интерфейс IPostBackDataHandler. Обсуждение, снимок экрана и готовая dll по адресу http://aspnetmania.com/Forums/ForumMessage/188107.html 
  Разместить ссылку на этот исходник в форуме вы можете вставив в текст сообщения следующую строку: [CODEPOST ID=185]WebCustomPanelTrCh - панель с раскрытым деревом чекбоксов, заполняется рекурсивно.[/CODEPOST]
Оценка: Проголосовало 1 посетителей, средняя оценка 4.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 ''' <summary>
  8 ''' Элемент управления, выдающий раскрытое дерево чекбоксов рекурсивно.
  9 ''' ''' </summary>
 10 <DefaultProperty("iArrayIdTrue"), ToolboxData("<{0}:WebCustomPanelTrCh runat=server></{0}:WebCustomPanelTrCh>"), ToolboxBitmap(GetType(Bitmap))> _
 11 Public Class WebCustomPanelTrCh
 12     Inherits System.Web.UI.WebControls.Panel
 13     Implements INamingContainer, IPostBackDataHandler
 14     Private _iArrayIdTrue(-1) As Integer 'массив чисел Int32, представляющих отмеченные коды текущих уровней.
 15     Private zapConnection As SqlConnection
 16     Private zapConnectString As String
 17     ''' <summary>
 18     ''' Массив чисел Int32, представляющих отмеченные коды текущих уровней. Работает только для чтения.
 19     ''' </summary>
 20     '''     ''' <returns>По умолчанию выдаёт пустой массив.</returns>
 21     <Bindable(True), Category("Data"), DefaultValue(""), Description("Массив чисел Int32, представляющих отмеченные коды текущих уровней. Работает только для чтения.")> _
 22     Public ReadOnly Property [iArrayIdTrue]() As Integer()
 23         Get
 24             If UBound(_iArrayIdTrue) = -1 Then RaisePostDataChangedEvent()
 25             Return _iArrayIdTrue
 26         End Get
 27     End Property
 28     ''' <summary>
 29     ''' Строка соединения с базой данных SQL-сервер.
 30     ''' </summary>
 31     '''     ''' <returns></returns>
 32     <Bindable(True), Category("Data"), DefaultValue(""), Description("Строка соединения с базой данных SQL-сервер.")> _
 33     Public Property [sConnectionString]() As String
 34         Get
 35             Return CType(ViewState("sConnectionString"), String)
 36         End Get
 37         Set(ByVal Value As String)
 38             ViewState("sConnectionString") = Value
 39         End Set
 40     End Property
 41     ''' <summary>
 42     ''' Хранимая процедура, выдающая таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String). Стволы должны равняться 0 или null. Процедура принимает один параметр - начальный код предыдущего уровня - код ствола. Ожидается параметр @iTrunk как число Int32, по умолчанию равное null.
 43     ''' </summary>
 44     '''     ''' <returns></returns>
 45     <Bindable(True), Category("Data"), DefaultValue(""), Description("Хранимая процедура, выдающая таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String). Стволы должны равняться 0 или null. Процедура принимает один параметр - начальный код предыдущего уровня - код ствола. Ожидается параметр @iTrunk как число Int32, по умолчанию равное null.")> _
 46     Public Property [sStoredProcedure]() As String
 47         Get
 48             Return CType(ViewState("sStoredProcedure"), String)
 49         End Get
 50         Set(ByVal Value As String)
 51             ViewState("sStoredProcedure") = Value
 52         End Set
 53     End Property
 54     ''' <summary>
 55     ''' URL картинки со стволом.
 56     ''' </summary>
 57     '''     ''' <returns>По умолчанию берётся из Интернета.</returns>
 58     <Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки со стволом.")> _
 59     Public Property [sUrlTrunk]() As String
 60         Get
 61             Return CType(ViewState("sUrlTrunk"), String)
 62         End Get
 63         Set(ByVal Value As String)
 64             ViewState("sUrlTrunk") = Value
 65         End Set
 66     End Property
 67     ''' <summary>
 68     ''' URL картинки с веткой.
 69     ''' </summary>
 70     '''     ''' <returns>По умолчанию берётся из Интернета.</returns>
 71     <Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с веткой.")> _
 72     Public Property [sUrlBranch]() As String
 73         Get
 74             Return CType(ViewState("sUrlBranch"), String)
 75         End Get
 76         Set(ByVal Value As String)
 77             ViewState("sUrlBranch") = Value
 78         End Set
 79     End Property
 80     ''' <summary>
 81     ''' URL картинки с листом.
 82     ''' </summary>
 83     '''     ''' <returns>По умолчанию берётся из Интернета.</returns>
 84     <Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с листом.")> _
 85     Public Property [sUrlLeaf]() As String
 86         Get
 87             Return CType(ViewState("sUrlLeaf"), String)
 88         End Get
 89         Set(ByVal Value As String)
 90             ViewState("sUrlLeaf") = Value
 91         End Set
 92     End Property
 93     ''' <summary>
 94     ''' URL картинки с ошибкой.
 95     ''' </summary>
 96     '''     ''' <returns>По умолчанию берётся из Интернета.</returns>
 97     <Bindable(True), Category("Data"), DefaultValue(""), Description("URL картинки с ошибкой.")> _
 98     Public Property [sUrlError]() As String
 99         Get
100             Return CType(ViewState("sUrlError"), String)
101         End Get
102         Set(ByVal Value As String)
103             ViewState("sUrlError") = Value
104         End Set
105     End Property
106     REM Конструктор
107     Public Sub New()
108         Dim iArray(-1) As Integer
109         ViewState("iArrayIdTrue") = iArray 'массив чисел Int32, представляющих отмеченные Id.
110         ViewState("sConnectionString") = "" 'строка соединения с SQL-сервером
111         ViewState("sStoredProcedure") = "" 'хранимая процедура, выдающая таблицу из трёх колонок - номер листа (Int32), номер ветки (Int32) и наименование (String). Ствол должен равняться 0 или Null.
112         ViewState("sUrlTrunk") = "" 'URL картинки со стволом.
113         ViewState("sUrlBranch") = "" 'URL картинки с веткой.
114         ViewState("sUrlLeaf") = "" 'URL картинки с листом.
115         ViewState("sUrlError") = "" 'URL картинки с ошибкой.
116     End Sub
117     REM Добавление дочерних элементов управления
118     Protected Overrides Sub CreateChildControls()
119         'var
120         Dim b As Boolean 'есть ли хоть один чекбокс
121         Dim i As Integer
122         Dim iMax As Integer 'число чекбоксов -1
123         Dim oNode(3, -1) 'возвращаемый по ссылке массив(x,y), содержащий информацию о дереве. x0=число пробелов перед названием уровня (0 или больше), x1=url картинки, x2=код текущего уровня, x3=наименование уровня.
124         Dim oLiteralControl As New LiteralControl
125         'end var
126         If IsNothing(Page.Session("oNode")) Then
127             zapConnection = New SqlConnection
128             zapConnectString = ViewState("sConnectionString")
129             zapConnection.ConnectionString = zapConnectString
130             Try
131                 zapConnection.Open()
132                 b = bInTree(oNode, 0, -1)
133             Catch ex As Exception
134                 b = True
135                 oLiteralControl.Text = "Ошибка открытия соединения с SQL-сервером: " & ex.Message
136             Finally
137                 If Not (IsNothing(zapConnection)) Then
138                     zapConnection.Close()
139                     zapConnection = Nothing
140                 End If
141             End Try
142             Page.Session("oNode") = oNode
143         Else
144             oNode = Page.Session("oNode")
145         End If
146         If b = False Then
147             iMax = UBound(oNode, 2)
148             For i = 0 To iMax
149                 'var
150                 Dim i2 As Integer
151                 Dim oImageNull(oNode(0, i)) As WebControls.Image
152                 Dim oImage As New WebControls.Image
153                 Dim oCheckBox As New WebControls.CheckBox
154                 'end var
155                 For i2 = 1 To oNode(0, i)
156                     oImageNull(i2) = New WebControls.Image
157                     oImageNull(i2).ImageUrl = "http://okno.mos.ru/images/gif/Image-081.gif" 'пустая картинка 16х16
158                     Controls.Add(oImageNull(i2))
159                 Next i2
160                 oImage.ImageUrl = oNode(1, i)
161                 Controls.Add(oImage)
162                 'если попали не на лист, то делаем чекбокс пассивным
163                 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
164                     oCheckBox.Enabled = False
165                 End If
166                 oCheckBox.ID = "oChBox" & oNode(2, i)
167                 oCheckBox.Text = oNode(3, i)
168                 Controls.Add(oCheckBox)
169                 If i < iMax Then Controls.Add(New LiteralControl("<br>"))
170             Next i
171         Else
172             If oLiteralControl.Text = "" Then oLiteralControl.Text = "Нет ни одного элемента."
173             Controls.Add(oLiteralControl)
174         End If
175     End Sub
176     ''' <summary>
177     ''' Функция заполнения дерева (вызывает саму себя) = true если нет внутренней структуры.
178     ''' </summary>
179     ''' <param name="oNode">Возвращаемый по ссылке массив(x,y), содержащий информацию о дереве. x0=число пробелов перед названием уровня (0 или больше), x1=url картинки, x2=код текущего уровня, x3=наименование уровня.</param>
180     ''' <param name="iNum">Код предыдущего уровня. Для начального уровня рекомендуется задавать 0, а в хранимой процедуре ставить проверку не только на 0, но и на null.</param>
181     ''' <param name="iSpace">Число отступов перед текущим уровнем. Для начального уровня рекомендуется задавать -1, так как при вызове функции сразу идёт увеличение на единицу.</param>
182     ''' <returns>true если нет внутренней структуры и запрос на выборку ничего не вернул.</returns>
183     Private Function bInTree(ByRef oNode(,) As Object, ByVal iNum As Integer, ByVal iSpace As Integer) As Boolean
184         'var
185         Dim b As Boolean
186         Dim i As Integer
187         Dim iMax As Integer
188         Dim sErr As String
189         Dim oZap
190         'end var
191         iNum = iZap(ViewState("sStoredProcedure"), iNum, sErr, oZap)
192         If iNum = 0 Then
193             bInTree = True
194             Exit Function
195         End If
196         iSpace += 1
197         If iNum < 0 Then
198             'var
199             Dim iCount = UBound(oNode, 2) + 1
200             'end var
201             ReDim Preserve oNode(3, iCount) 'увеличение на 1
202             oNode(0, iCount) = iSpace 'число отступов
203             If ViewState("sUrlError") = "" Then
204                 oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-080.gif"
205             Else
206                 oNode(1, iCount) = ViewState("sUrlError") 'картинка ошибки
207             End If
208             oNode(2, iCount) = 0 'код
209             oNode(3, iCount) = "Ошибка: " & sErr 'наименование
210             Exit Function
211         End If
212         iMax = iNum - 1
213         For i = 0 To iMax
214             'var
215             Dim iCount = UBound(oNode, 2) + 1
216             'end var
217             ReDim Preserve oNode(3, iCount) 'увеличение на 1
218             oNode(0, iCount) = iSpace 'число отступов
219             b = bInTree(oNode, oZap(0, i), iSpace)
220             If iSpace = 0 Then
221                 If ViewState("sUrlTrunk") = "" Then
222                     oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-012.gif"
223                 Else
224                     oNode(1, iCount) = ViewState("sUrlTrunk") 'картинка ствола
225                 End If
226             ElseIf b = False Then
227                 If ViewState("sUrlBranch") = "" Then
228                     oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-014.gif"
229                 Else
230                     oNode(1, iCount) = ViewState("sUrlBranch") 'картинка ветки
231                 End If
232             Else
233                 If ViewState("sUrlLeaf") = "" Then
234                     oNode(1, iCount) = "http://okno.mos.ru/images/gif/Image-011.gif"
235                 Else
236                     oNode(1, iCount) = ViewState("sUrlLeaf") 'картинка листа
237                 End If
238             End If
239             oNode(2, iCount) = oZap(0, i) 'код
240             oNode(3, iCount) = oZap(2, i) 'наименование
241         Next i
242     End Function
243     ''' <summary>
244     ''' Функция взятия запроса как хранимой процедуры с одним параметром, представляющим код предыдущего уровня. Ожидается @iTrunk как число Int32, по умолчанию равное null.
245     ''' </summary>
246     ''' <param name="sConnectString">Строка подключения к SQL-серверу.</param>
247     ''' <param name="sSql">Название хранимой процедуры.</param>
248     ''' <param name="iNum">Параметр для хранимой процедуры, представляющий код предыдущего уровня. Ожидается @iTrunk как число Int32, по умолчанию равное null.</param>
249     ''' <param name="sErr">Сообщение об ошибке выполнения хранимой процедуры.</param>
250     ''' <param name="oZap">Двумерный массив, содержащий таблицу - результат запроса (x,y).</param>
251     ''' <returns>Число возвращаемых записей. Если 0, то ноль, если меньше нуля, то ошибка.</returns>
252     Public Overloads Function iZap(ByVal sSql As String, ByVal iNum As Integer, ByRef sErr As String, ByRef oZap(,) As Object) As Integer
253         'var
254         Dim zapBconnect As Boolean
255         Dim zapCommand As SqlCommand
256         Dim zapReader As SqlDataReader
257         Dim zapX As Long
258         Dim zapY As Long
259         Dim i1 As Integer
260         'end var
261         zapCommand = New SqlCommand
262         zapBconnect = False
263         iZap = -2
264         Try
265             zapBconnect = zapConnection.State
266             If zapBconnect Then iZap = -1
267             'zapCommand.CommandTimeout = 10
268             zapCommand.CommandType = CommandType.StoredProcedure
269             zapCommand.Parameters.Add("@iTrunk", iNum)
270             zapCommand.Connection = zapConnection
271             zapCommand.CommandText = sSql
272             zapReader = zapCommand.ExecuteReader()
273             iZap = 0
274             zapX = zapReader.FieldCount
275             If zapX < 0 Then zapX = 0
276             If zapX > 0 Then zapX = zapX - 1
277             zapY = -1
278             ReDim oZap(zapX, 0)
279             While zapReader.Read()
280                 zapY += 1
281                 If zapY < 2147483647 Then
282                     iZap = zapY + 1
283                     ReDim Preserve oZap(zapX, zapY)
284                     For i1 = 0 To zapX
285                         If IsNothing(zapReader(i1)) Or IsDBNull(zapReader(i1)) Then oZap(i1, zapY) = 0 Else oZap(i1, zapY) = zapReader(i1)
286                     Next
287                 Else : sErr = zapY & " строк (>=2 147 483 647)"
288                 End If
289             End While
290             zapReader.Close()
291             zapReader = Nothing
292             zapCommand = Nothing
293         Catch err As Exception
294             sErr = err.Message
295         End Try
296     End Function
297     REM Здесь можно считывать данные из HTML
298     Public Function LoadPostData(ByVal postDataKey As String, ByVal postCollection As System.Collections.Specialized.NameValueCollection) As Boolean Implements System.Web.UI.IPostBackDataHandler.LoadPostData
299         REM Функция не используется, но её наличия требует компилятор.
300     End Function
301     REM Отлов отмеченных кодов текущих уровней
302     Public Sub RaisePostDataChangedEvent() Implements System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent
303         'var
304         Dim i As Integer
305         Dim iMax As Integer = Controls.Count - 1
306         Dim iEnd As Integer 'увеличенный на один последний номер элемента массива
307         Dim sId As String
308         'end var
309         For i = 0 To iMax
310             If IsNothing(Controls(i).ID) Then sId = "" Else sId = Controls(i).ID
311             If Left(sId, 6) = "oChBox" Then
312                 If CType(Controls(i), WebControls.CheckBox).Checked Then
313                     iEnd = UBound(_iArrayIdTrue) + 1
314                     ReDim Preserve _iArrayIdTrue(iEnd) 'увеличение на единицу
315                     _iArrayIdTrue(iEnd) = Mid(Controls(i).ID, 7)
316                 End If
317             End If
318         Next i
319     End Sub
320 End Class
321 
Вернуться к списку исходников в категории Создание элементов управления
 
Наш Киев

Apartments for Rent

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