Чтение онлайн

на главную - закладки

Жанры

Программирование для карманных компьютеров

Волков Владимир

Шрифт:

7. Написать код процедуры нажатия кнопки Disconnect, который приведен в листинге 6.29. Листинг 6.29

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles Button2.Click

dbc.Close

dbt.Clear

TextBox4.DataBindings.Clear

TextBox5.DataBindings.Clear

TextBox6.DataBindings.Clear

TextBox7.DataBindings.Clear

TextBox8.DataBindings.Clear

TextBox9.DataBindings.Clear

TextBox10.DataBindings.Clear

End Sub

Обратите внимание на необходимость в этом случае «отвязать» контекст, иначе в результате повторного присоединения к данным возникнет ошибка.

8. Обработка событий щелчка на кнопках навигации по набору данных, собранному в таблице, показана в листинге 6.30.

Листинг 6.30

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles Button4.Click

\'Предыдущая запись

Me.BindingContext(dbt). Position – = 1

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles Button3.Click

\'Первая запись

Me.BindingContext(dbt). Position = 0

End Sub

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles Button6.Click

\'Последняя запись

Me.BindingContext(dbt). Position = Me.BindingContext(dbt). Count – 1

End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles Button5.Click

\'Следующая

запись

Me.BindingContext(dbt). Position += 1

End Sub

9. Теперь можно запустить программу и нажать кнопку Connect. Компоненты TextBox будут заполнены информацией из таблицы Customers. Следует убедиться, что переход между записями осуществляется корректно. После нажатия кнопки Disconnect компоненты TextBox должны быть очищены (рис. 6.24).

Рис. 6.24. Работающее приложение.

Таким образом было организовано отображение информации из таблицы базы данных. Теперь неплохо бы было организовать ввод информации.

10. К навигатору нужно добавить еще две кнопки, чтобы он выглядел так, как показано на рис. 6.25.

Рис. 6.25. Улучшенный навигатор.

11. Для кнопки с изображением крестика нужно использовать обработчик, функциональность которого умещается в одну строку.

Me.BindingContext(dbt). CancelCurrentEdit

12. Код обработчика нажатия кнопки с галочкой приведен в листинге 6.31. Листинг 6.31

Dim cmd As SqlServerCe.SqlCeCommand

cmd = New SqlServerCe.SqlCeCommand_

("UPDATE Customers SET Country = " + TextBox8.Text + " WHERE _

CustomerID = " + TextBox4.Text + " ", dbc)

If dbc.State = ConnectionState.Closed Then

dbc.Open

End If

cmd.ExecuteNonQuery

13. Эти две команды показывают, каким образом можно отменить текущие изменения и как производится обновление данных в базе данных. Проект нужно снова запустить, нажать кнопку Connect, отредактировать поле Country у любой записи и нажать кнопку V. Затем следует разорвать соединение щелчком на кнопке Disconnect и снова соединиться с базой данных. Это позволит заметить, что изменения были внесены в таблицу. Но если снова внести изменения в поле Country и нажать кнопку X, то изменения будут отменены.

Впрочем, этот пример показывает лобовой подход, когда текст берется из элементов TextBox и вставляется в строку формируемого выражения SQL. Более красиво и правильно в этом случае воспользоваться параметризированной командой.

14. Необходимо изменить процедуру обработки щелчка на кнопке V при помощи кода, приведенного в листинге 6.32.

Листинг 6.32

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles Button7.Click

Dim cmd As SqlServerCe.SqlCeCommand

cmd = New SqlServerCe.SqlCeCommand("UPDATE Customers SET CompanyName_

=? ContactName =? City =? Country =? Phone=? FAX =? WHERE_

CustomerID =?", dbc)

cmd.Parameters.Add(«@a», SqlDbType.NVarChar, 40)

cmd.Parameters.Add(«@b», SqlDbType.NVarChar, 30)

cmd.Parameters.Add(«@c», SqlDbType.NVarChar, 15)

cmd.Parameters.Add(«@d», SqlDbType.NVarChar, 15)

cmd.Parameters.Add(«@e», SqlDbType.NVarChar, 24)

cmd.Parameters.Add(«@f», SqlDbType.NVarChar, 25)

cmd.Parameters.Add(«@g», SqlDbType.NChar, 5)

cmd.Parameters.Item(«@a»). Value = TextBox5.Text

cmd.Parameters.Item(«@b»). Value = TextBox6.Text

cmd.Parameters.Item(«@c»). Value = TextBox7.Text

cmd.Parameters.Item(«@d»). Value = TextBox8.Text

cmd.Parameters.Item(«@e»). Value = TextBox9.Text

cmd.Parameters.Item(«@f»). Value = TextBox10.Text

cmd.Parameters.Item(«@g»). Value = TextBox4.Text

If dbc.State = ConnectionState.Closed Then

dbc.Open

End If

cmd.ExecuteNonQuery

End Sub

Теперь пользователь может редактировать и обновлять все поля, выведенные на экран. Следует обратить внимание, что SQL Server CE поддерживает параметризированные запросы, но не воспринимает параметры по именам. Значения параметров подставляются в выражение SQL в том порядке, в каком они были добавлены к списку параметров. Связывание данных

В упражнении было видно, что для того, чтобы приложение установило соединение с базой данных, запросило необходимые данные, получило и разместило их, необходимо использовать компоненты из пространства имен System.Data.SqlServerCe. Но когда данные отображаются, используется возможность привязывать источники данных к обычным элементам отбражения. Способность образовывать связи с данными реализуется в этих элементах на уровне методов и свойств, которые рассматриваются в табл. 6.26.

Таблица 6.26. Свойства компонентов, отвечающие за связь с данными

Свойства BindingContext и DataBindings присущи всем видимым элементам, в то время как свойства DataSource, DisplayMember и ValueMember есть только у компонентов ListBox и ComboBox, в которые загружаются коллекции данных. Свойство DataSource также есть у компонента DataGrid.

Отдельно следует упомянуть свойства и методы объекта BindingContext, которые приведены в табл. 6.27 и 6.28.

Таблица 6.27. Полезные свойства объекта BindingContext

Таблица 6.28. Полезные методы объекта BindingContext

Также следует рассмотреть объект DataBindings. Его основные свойства и методы рассматриваются в табл. 6.29 и 6.30. Таблица 6.29. Полезные методы DataBindings

Таблица 6.30. Полезные свойства DataBindings

Методы и свойства объектов BindingContext и DataBindings были использованы в предыдущем упражнении. С одним элементом управления можно связать сколько угодно полей из базы данных. Методы и свойства DataBindings указывают

на то, что компонент может иметь не одну связь, а коллекцию связей. Главное, чтобы тип поля в источнике данных был совместим с типом свойства, с которым связывается это поле.

Следует создать приложение, иллюстрирующее связывание для компонентов ListBox, ComboBox и DataGrid.

Упражнение 6.5

1. Создать новый проект VB.NET для Pocket PC с именем myDB.

2. Расположить на форме компоненты Button, DataGrid, ListBox и ComboBox так, как это показано на рис. 6.26.

Рис. 6.26. Расположение компонентов на форме.

3. Объявить переменные в классе формы, как это показано в листинге 6.33. Листинг 6.33

Dim dbc As SqlServerCe.SqlCeConnection

Dim dbcmq As SqlServerCe.SqlCeCommand = New _ SqlServerCe.SqlCeCommand("SELECT * FROM

Customers")

Dim dba As SqlServerCe.SqlCeDataAdapter

Dim dbt As DataTable

4. Написать обработчики для кнопок согласно коду, приведенному в листинге 6.34. Листинг 6.34

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles Button1.Click

Cursor.Current = Cursors.WaitCursor

dbc = New SqlServerCe.SqlCeConnection

dbc.ConnectionString = «Data Source=\NorthwindDemo.sdf»

dbt = New DataTable(«Customers»)

dbcmq.Connection = dbc

dba = New SqlServerCe.SqlCeDataAdapter(dbcmq)

dba.Fill(dbt)

DataGrid1.Visible = False

DataGrid1.DataSource = dbt

DataGrid1.Visible = True

ListBox1.Visible = False

ListBox1.DataSource = dbt

ListBox1.DisplayMember = «ContactName»

ListBox1.ValueMember = «CustomerID»

ListBox1.Visible = True

ComboBox1.Visible = False

ComboBox1.DataSource = dbt

ComboBox1.DisplayMember = «ContactName»

ComboBox1.ValueMember = «ContactTitle»

ComboBox1.Visible = True

Cursor.Current = Cursors.Default

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles Button2.Click

dbc.Close

dbt.Clear

Me.DataBindings.Clear

End Sub

Теперь нужно запустить приложение и посмотреть как происходит заполнение компонентов данными. Обратите внимание, что все элементы привязаны к одному контексту, поэтому передвижение в любом из них автоматически меняет текущее положение курсора в другом органе управления. Также стоит обратить внимание на первую и последнюю строку первой процедуры. Когда надо сменить на время курсор, например чтобы показать, что приложение находится в процессе ожидания завершения операции, этот эффект будет очень кстати.

Обработка ошибок

На этом этапе бы было неплохо узнать, как в VB.NET обрабатываются ошибки. Для этого нужно изменить код обработчика щелчка на кнопке Connect, специально указав неверный путь к файлу базы данных, как это показано в листинге 6.35.

Листинг 6.35

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles Button1.Click

Cursor.Current = Cursors.WaitCursor

dbc = New SqlServerCe.SqlCeConnection

dbt = New DataTable(«Customers»)

dbcmq.Connection = dbc

dba = New SqlServerCe.SqlCeDataAdapter(dbcmq)

Try

dbc.ConnectionString = «Data Source=\Documents\NorthwindDemo.sdf»

dba.Fill(dbt)

Catch ex As SqlServerCe.SqlCeException

MsgBox(ex.Message)

MsgBox(«файл не найден, пробуем другой путь»)

dbc.ConnectionString = «Data Source=\NorthwindDemo.sdf»

Finally

dba.Fill(dbt)

End Try

DataGrid1.Visible = False

В данном фрагменте кода было использовано выражение Try\Catch\Finally\End Try. В этом выражении ключевое слово Try открывает блок обработки ошибок. После него указываются операции, в которых возможно возникновение исключительной ситуации. Блок Catch осуществляет перехват ошибки. В момент возникновения ошибки создается объект ошибки ex. У этого объекта не так уж много свойств. Свойство Message содержит текстовое сообщение об ошибке, свойство InnerException возвращает ошибку, а метод GetBaseException возвращает более общий класс, к которому принадлежит данная ошибка.

После ключевого слова Finally должны быть расположены строки кода, которые выполняются независимо от того, возникла ошибка или нет. А ключевое слово End Try закрывает блок обработки ошибок.

В общем случае, когда вы указываете наиболее общий тип исключительной ситуации Exception, возвращаются только указанные выше значения. Однако в частных объектах исключения, как в нашем случае, когда тип исключительной ситуации SqlServerCe.SqlCeException, разработчик может извлечь из объекта ошибки и другие параметры. Например, коллекцию ошибок Errors, код возврата HResult, номер ошибки NativeError и Source – имя провайдера, в котором произошла ошибка. Таким образом, каждый раз, когда вы определяете в разделе Catch тип создаваемого объекта ошибки, стоит получить в справочной системе информацию о параметрах, которые он может возвратить. Также следует обратить внимание на то, что раздел Catch может перехватывать не один тип ошибки, а несколько, как это показано в следующем фрагменте кода.

Catch ex As SqlServerCe.SqlCeException

\'Ловим ошибки, относящиеся к SQLCE

Catch ex As Exception

\'Ловим остальные ошибки

Работа с графикой

Графика в. NET CF представлена в весьма урезанном варианте по сравнению с «настольной» версией. Для уменьшения размера системы из графических библиотек было вычищено очень многое. Оставлена только основная функциональность, без которой уж совсем никак было не обойтись. Для работы с графикой. NET CF предлагает основной графический объект, представляющий собой поверхность экземпляра одного из пяти классов, сведенных в табл. 6.31.

Таблица 6.31. Поддержка графики в. NET CF

Чтобы получить доступ к поверхности объекта и нарисовать на ней что-либо, можно использовать непосредственно сам объект поверхности (это происходит в событии OnPaint), или создать новый объект при помощи метода CreateGraphics. Поскольку во втором случае создается объект, который не используется внутри самого элемента управления, на котором происходит отрисовка графики, то после использования его надо уничтожить при помощи вызова Dispose.

Упражнение 6.6

1. Создать новый проект VB.NET для Pocket PC с именем myGraph.

2. Поместить в верхнюю часть формы кнопку и написать для нее обработчик, код которого приведен в листинге 6.36.

Листинг 6.36

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles Button1.Click

Dim br As New Drawing.SolidBrush(Drawing.Color.Red)

Dim g As Graphics = Me.CreateGraphics

g.FillEllipse(br, 10, 30, 200, 200)

MsgBox("")

g.Dispose

br.Dispose

End Sub

Поделиться:
Популярные книги

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Барон Дубов

Карелин Сергей Витальевич
1. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Завод-3: назад в СССР

Гуров Валерий Александрович
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод-3: назад в СССР

Решала

Иванов Дмитрий
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая

Отдельный танковый

Берг Александр Анатольевич
1. Антиблицкриг
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Отдельный танковый

Метатель. Книга 3

Тарасов Ник
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 3

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия