Волков Владимир
Шрифт:
25. Обработчик щелчка на кнопке PictureBox2, который осуществляет переход к следующему дню, приведен в листинге 6.13. Листинг 6.13
Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles PictureBox2.Click
Data_Save(Label1.Text)
D = DateAdd(DateInterval.Day, 1, D)
Label1.Text = D.ToShortDateString
Data_Load(D.ToShortDateString)
End Sub26. Обработчик щелчка на кнопке PictureBox3, который отвечает за добавление очередной записи в текущий день, показан в листинге 6.14. Листинг 6.14
Private Sub PictureBox3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles PictureBox3.Click
Dim lvIt As ListViewItem
\'Создаем диалоговую форму редактирования
Dim MyForm As New Form2
\'Устанавливаем флаг, показывающий, что был щелчок на кнопке 3
MyForm.Send = 3
\'Если ListView не пустой, копируем значения полей текущей записи в
\'переменные так, что время конца в текущей записи станет временем начала
\'в создаваемой записи
If ListView1.Items.Count > 0 Then
categorySt = ListView1.Items.Item_
(ListView1.Items.Count – 1). SubItems(0). Text
startOfSt = ListView1.Items.Item_
(ListView1.Items.Count – 1). SubItems(2). Text
endOfSt = startOfSt
noteSt = ""
Else
categorySt = ""
startOfSt = ""
endOfSt = ""
noteSt = ""
End If
\'Выводим на экран форму редактирования записи
If MyForm.ShowDialog = DialogResult.OK Then
\'И если редактирование завершилось щелчком на кнопке OK, добавляем новую
\'запись в ListView
lvIt = New ListViewItem(categorySt)
ListView1.Items.Add(lvIt)
ListView1.Items.Item.(ListView1.Items.Count – 1). SubItems.Add(startOfSt)
ListView1.Items.Item.(ListView1.Items.Count – 1). SubItems.Add(endOfSt)
ListView1.Items.Item.(ListView1.Items.Count – 1). SubItems.Add(noteSt)
End If
End Sub27. Обработчик щелчка на кнопке PictureBox4, который отвечает за редактирование текущей записи, показан в листинге 6.15. Листинг 6.15
Private Sub PictureBox4_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles PictureBox4.Click
\'Если в ListView есть выделенная строка, тогда редактируем
If ListView1.SelectedIndices.Count > 0 Then
Dim MyForm As New Form2
\'Сообщаем форме редактирования, что был щелчок на кнопке 4
MyForm.Send = 4
\'Копируем значения полей записи в переменные
categorySt = ListView1.Items(ListView1.SelectedIndices_(0)). SubItems(0). Text
startOfSt = ListView1.Items(ListView1.SelectedIndices(0)). SubItems(1). Text
endOfSt = ListView1.Items(ListView1.SelectedIndices(0)). SubItems(2). Text
noteSt = ListView1.Items(ListView1.SelectedIndices(0)). SubItems(3). Text
\'Если редактирование завершилось щелчком на кнопке OK, копируем возвращенные
\'значения переменных в соответствующие поля ListView
If MyForm.ShowDialog = DialogResult.OK Then
ListView1.Items(ListView1.SelectedIndices(0)). SubItems(0). Text = categorySt
ListView1.Items(ListView1.SelectedIndices(0)). SubItems(1). Text = startOfSt
ListView1.Items(ListView1.SelectedIndices(0)). SubItems(2). Text = endOfSt
ListView1.Items(ListView1.SelectedIndices(0)). SubItems(3). Text = noteSt
End If
End If
End Sub28. Код обработчика щелчка на кнопке PictureBox5 (удаление текущей записи) приведен в листинге 6.16. Листинг 6.16
Private Sub PictureBox5_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles PictureBox5.Click
If ListView1.SelectedIndices.Count > 0 Then
ListView1.Items.Remove(ListView1.Items(ListView1.SelectedIndices(0)))
End If
End Sub29. После того как были написаны обработчики для элементов управления основной формы, нужно сделать то же самое для формы редактирования данных. Сначала нужно объявить в этой форме переменную Send, как показано в листинге 6.17. Лиситнг 6.17
Public Class Form2
…
Public Send As Integer30. Теперь можно написать основные обработчики событий компонентов. Обработчик события загрузки формы должен различать, щелчком на котором элементе была загружена форма, и вести себя соответственно. Это поведение задается в коде, который приведен в листинге 6.18. Листинг 6.18
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim myCount As Integer
Dim myStrTime As String
ComboBox2.Items.Clear
ComboBox3.Items.Clear
\'Загружаем содержимое двух компонентов выпадающих списков, которые
\'должны отображать выбор временных интервалов от 00.00 до 23.55 c
\'дискретностью в 5 минут
For myCount = 0 To 287
Dim myTime1 As TimeSpan = TimeSpan.FromMinutes(myCount * 5)
myStrTime = myTime1.ToString
myStrTime = myStrTime.Substring(0, 5)
ComboBox2.Items.Add(myStrTime)
ComboBox3.Items.Add(myStrTime)
Next
\'Читаем список категорий в ComboBox1
Dim myxmlDoc As New Xml.XmlDocument
Dim dirStr As String
dirStr = IO.Path.GetDirectoryName_
(Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase.ToString)
ComboBox1.Items.Clear
myxmlDoc.Load(dirStr + «\Category.xml»)
For myCount = 0 To myxmlDoc.ChildNodes.Item(1). ChildNodes.Count – 1
ComboBox1.Items.Add_ (myxmlDoc.ChildNodes.Item(1). ChildNodes.Item(myCount). Name)
Next
ComboBox1.SelectedIndex = 0
ComboBox2.SelectedIndex = 0
ComboBox3.SelectedIndex = 0
\'Устанавливаем в ComboBox1 категорию, которая задана в последней
\'строке ListView
For myCount = 0 To ComboBox1.Items.Count – 1
If ComboBox1.Items(myCount) = categorySt Then
ComboBox1.SelectedIndex = myCount
Exit For
End If
Next
\'Для второго и третьего ComboBox так же устанавливаем значения
For myCount = 0 To ComboBox2.Items.Count – 1
If ComboBox2.Items(myCount) = startOfSt Then
ComboBox2.SelectedIndex = myCount
Exit For
End If
Next
For myCount = 0 To ComboBox3.Items.Count – 1
If ComboBox3.Items(myCount) = endOfSt Then
ComboBox3.SelectedIndex = myCount
Exit For
End If
Next
TextBox1.Text = noteSt
End Sub31. Обработчик щелчка на кнопке OK формы редактирования показан в листинге 6.19. Листинг 6.19
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
\'Возвращаем в переменные установленные в элементах управления значения
categorySt = Me.ComboBox1.Text
startOfSt = Me.ComboBox2.Text
endOfSt = Me.ComboBox3.Text
noteSt = Me.TextBox1.Text
\'Возвращаем результат работы диалогового окна
DialogResult = DialogResult.OK
\'Закрываем форму
Me.Close
End Sub32. Код обработчика щелчка на кнопке Cancel формы редактирования приведен в листинге 6.20. Листинг 6.20
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button2.Click
DialogResult = DialogResult.Cancel
Me.Close
End Sub33. Осталось задать код еще двух обработчиков, предназначенных для автоматического отображения и скрытия программной панели ввода (виртуальной клавиатуры) при приобретении и потери фокуса текстовым полем TextBox. Код этих обработчиков приведен в листинге 6.21. Листинг 6.21
Private Sub TextBox1_GotFocus(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles TextBox1.GotFocus
InputPanel1.Enabled = True
End Sub
Private Sub TextBox1_LostFocus(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles TextBox1.LostFocus
InputPanel1.Enabled = False
End SubМы, наконец, создали несовершенный, но вполне работающий вариант программы. Проект можно скомпилировать и запустить на выполнение. После запуска приложения можно убедиться, что файлы создаются и читаются, записи добавляются, переход от одной даты к другой осуществляется корректно, а после выключения программы все изменения вносятся в файл 2005.xml.
Использование нестандартных компонентов
Безусловно, если вы попытались уже воспользоваться программой, вы заметили один большой недостаток. Приложение не позволяет перейти к произвольной дате, заставляя пользователя последовательно переходить от одного дня к другому.
Этот недостаток был бы легко устраним, если бы в. NET CF был элемент управления, который в стандартном VB.NET называется DateTime Picker. Поскольку данное неудобство, видимо, было замечено не только нами, инициативные разработчики создали такой элемент управления для. NET CF. Его можно свободно загрузить с сайта Microsoft.
Для этого необходимо войти на сайт www.microsoft.com и набрать в строке поиска строку DateTimePickerDesignTimeSampleSetup.exe. Поиск выдаст ссылку на статью Дж. Вилсона Adding Designer Support to the.NET Compact Framework DateTimePicker Control, внутри которой есть ссылка на необходимый файл. Но можно воспользоваться и прямой ссылкой download.microsoft.com/download/c/0/a/c0a7cea4-e9c1-4e80-9e5a-afed9a664876/DateTimePickerDesignTimeSampleSetup.exe.