Выбрать главу

'в узел "Neighborhood"

'------------------------------------------------------------------

Sub PopulateTreeViewNeighborhoods(ByVal tnAddTo As TreeNode)

 Dim tvControl As TreeView

 tvControl = tnAddTo.TreeView

 tvControl.BeginUpdate()

 'Очистить имеющийся фиктивный узел

 tnAddTo.Nodes.Clear()

 'Объявить четыре узла, которые мы хотим сделать дочерними узлами

 'того узла, который был передан.

 Dim newNeighborhoodNodes() As TreeNode

 ReDim newNeighborhoodNodes(3)

 newNeighborhoodNodes(0) = New TreeNode("Capitol Hill")

 newNeighborhoodNodes(1) = New TreeNode("Chelsea")

 newNeighborhoodNodes(2) = New TreeNode("Downtown")

 newNeighborhoodNodes(3) = New TreeNode("South Bay")

 'Добавить дочерние узлы в элемент управления TreeView

 tnAddTo.Nodes.AddRange(newNeighborhoodNodes)

 tvControl.EndUpdate()

End Sub

Листинг 11.3. Запуск обработчика событий при изменении содержимого элемента TextBox программным путем

Private m_eventTriggerCount As Integer

Private Sub Button1_Click(ByVal sender As System.Object, _

 ByVal e As  System.EventArgs) Handles Buttonl.Click

 'Запускает событие TextChanged так же,

 'как если бы текст был введен пользователем

 TextBox1.Text = "Привет, мир"

End Sub

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) Handles TextBox1.TextChanged

 m_eventTriggerCount = m_eventTriggerCount + 1

 'Обновить надпись для отображения количества событий

 Label1.Text = "Событий: #" + CStr(m_eventTriggerCount)

 'Внести каждое событие в список

 ListBox1.Items.Add(m_eventTriggerCount.ToString() + TextBox1.Text)

End Sub

Листинг 11.4. Использование модели состояний для обновления интерфейса и контроль запуска событий с целью более глубокого изучения процесса обработки событий и управления им

'-----------------------------------------

'Для активизации контроля запуска событий:

' #Const EVENTINSTRUMENTATION = 1

'Для отмены контроля запуска событий:

' #Const EVENTINSTRUMENTATION = 0

'-----------------------------------------

#Const EVENTINSTRUMENTATION = 1

'-----------------------------------------------------------------------

'Флаг, указывающий обработчикам событий, должен ли из них осуществляться

'выход без выполнения каких-либо действий

'-----------------------------------------------------------------------

Private m_userInterfaceUpdateOccuring As Boolean

'Счетчики событий

Private m_radioButton1ChangeEventCount As Integer

Private m_textBox1ChangeEventCount As Integer

'-------------------------------------------------------------------------

'Код, который следует включать лишь в том случае, если приложение

'выполняется в режиме контроля запуска событий. Этот код характеризуется

'относительно высокими накладными расходами, и его следует компилировать и

'выполнять только тогда, когда выполняется диагностика.

'-------------------------------------------------------------------------

#If EVENTINSTRUMENTATION <> 0 Then

Private m_instrumentedEventLog As System.Collections.ArrayList

'----------------------------------------------------------------------

'Заносит записи о возникновении событий в массив, который мы

'можем просмотреть

'Примечание: Не делается никаких попыток ограничить размерность массива

'  регистрационных записей, поэтому, чем дольше выполняется приложение,

'  тем больше становится размер массива

'----------------------------------------------------------------------

Private Sub instrumented_logEventOccurrence(ByVal eventData _

 As String)

 'Создать журнал событий, если он еще не был создан

 If (m_instrumentedEventLog Is Nothing) Then

  m_instrumentedEventLog = _

   New System.Collections.ArrayList

 End If

 'Зарегистрировать событие

 m_instrumentedEventLog.Add(eventData)

End Sub

'----------------------------------------------------------

'Отобразить список возникших событий

'Примечание: Этот вариант реализации довольно груб.

' Целесообразнее отображать список событий

' в отдельном диалоговом окне, которое специально выводится

' для этого на экран.

'----------------------------------------------------------

Private Sub instrumentation_ShowEventLog() Dim listItems As _

 System.Windows.Forms.ListBox.ObjectCollection

 listItems = listBoxEventLog.Items

 'Очистить список элементов

 listItems.Clear()

 'При отсутствии событий - выход

 If (m instrumentedEventLog Is Nothing) Then

  listItems.Add("0 событий")

  Return

 End If

 'Отобразить поверх списка общее количество

 'подсчитанных нами событий

 listItems.Add(m_instrumentedEventLog.Count.ToString() + _

  " событий")

 'Перечислить элементы списка в обратном порядке, чтобы

 'первыми отображались самые последние из них

 Dim logItem As String

 Dim listIdx As Integer

 For listIdx = _

  m_instrumentedEventLog.Count - 1 To 0 Step -1

  logItem = CStr(m_instrumentedEventLog(listIdx))

  listItems.Add(logItem)

 Next

End Sub

#End If

'------------------------------------------------------

'Событие изменения состояния переключателя RadioButton1

'------------------------------------------------------

Private Sub RadioButton1_CheckedChanged(ByVal sender As _