Использование связанного с данными элемента управления
List
Элемент управления List связан с определенным столбцом RecordSet и используется как поисковая таблица. Он может использоваться как таблица просмотра для упрощения передвижения по RecordSet (рис. 17.21).
Рис. 17.21. Приложение DBList: элемент управления List используется для просмотра
Этот список содержит имена всех товаров в списке
Products базы данных NWIND, загруженных во время запуска программы. Каждый раз, когда выбирается новый элемент, программа обновляет связанные с данными элементы управления, размещенные на форме, чтобы отобразить поля выбранной записи.
Элемент управления List отличается от элементов управления, связанных с данными, которые были рассмотрены ранее: его можно подсоединить к двум элементам управления Data. Он имеет стандартные свойства DataSource/DataField, которые используются как любой другой элемент управления, связанный с данными, и свойства RowSource и List Field, которые определяют, как заполняется элемент управления.
• RowSource задает источник (RecordSet или элемент управления Data) для начальной загрузки списка.
• ListFieId задает поле, которое используется для заполнения списка.
VB6 в действии: проект DBList
Приложение DBList демонстрирует использование связанного с данными элемента управления List в качестве инструмента перемещения. Форма, показанная на рис. 17.21, содержит ряд полей из таблицы Products базы данных NWIND. Создайте ее, связывая различные текстовые поля с соответствующими полями таблицы элементом управления Data, будто вы собираетесь перемещаться по списку товаров с помощью кнопок перемещения, размещенных на элементе управления Data.
Проблема с элементом управления Data состоит в том, что невозможно реально использовать его для перемещения по RecordSet, даже если он проиндексирован, потому что в каждый момент видима только одна запись. Если бы было можно помещать ключевые значения в элемент управления ListBox и использовать его как инструмент перемещения, то пользовательский интерфейс стал бы удобнее.
ComboBox
Элемент управления ComboBox используется как поисковая таблица (см. приложение Data Entry, рассмотренное ранее в этой главе). Чтобы заполнить список элемента управления ComboBox, необходимо установить свойство RowSource на элемент управления Data, соединенный с базой данных и таблицей, из которой выбираются данные.
Приложение Data Entry (папка DEntry на компакт-диске) содержит скрытый элемент управления Data (называемый Data2), который соединен с таблицей Publishers базы данных BIBLIO. Свойство ListField элемента управления ComboBox — это имя поля, использующееся для заполнения списка. В приложении Data Entry это свойство установлено на поле Name таблицы Publishers. При запуске программы элемент управления ComboBox автоматически заполняется именами издателей из базы данных (рис. 17.22).
Рис. 17.22. Элемент управления ComboBox на форме приложения Data Entry содержит имена всех издателей из базы данных
Элемент управления ComboBox имеет обычные свойства DataSource и Data Field, как и другие элементы управления, связанные с данными. Необходимо, чтобы в приложении Data Entry элемент управления ComboBox функционировал следующим образом.
1. При запуске программы элемент управления заполняется именами всех издателей.
2. При перемещении по таблице Titles элемент управления ComboBox извлекает идентификаторы издателей из таблицы Titles, ищет это значение в таблице Publishers и отображает значение поля Name соответствующей записи в окне редактирования.
3. При добавлении новой записи пользователь определяет издателя книги, выбирая имя в элементе управления ComboBox, а элемент управления сообщает соответствующий идентификатор первому элементу управления Data.
Это выглядит сложно, но все это встроено в элемент управления ComboBox. Уже известно, как реализовать первый пункт с помощью свойств RowSource и ListField. Два других пункта типичны для элементов управления, связанных с данными. Необходимо использовать окно редактирования элемента управления ComboBox как обычное текстовое поле, связанное с полем PubID таблицы Titles. Для этого выполните следующие действия.
Grid
Элемент управления Grid - один из наиболее гибких и мощных элементов управления Visual Basic. Пользователи Microsoft Access знакомы с этим элементом управления. Связываемый с данными элемент управления Grid похож на элемент управления MSFlexGrid (см. гл.9), но имеет два отличия:
• заполняется автоматически из RecordSet,
• имеет встроенные механизмы ввода данных, с помощью которых можно редактировать RecordSet (если он может модифицироваться).
Все, что нужно сделать для заполнения элемента Grid из RecordSet — это установить его свойство DataSource на элемент управления Data. Сетка будет заполнена строками из RecordSet. Ввиду двумерного расположения данных в элементе управления Grid можно увидеть реальную структуру и содержание всего RecordSet. Этот элемент управления использовался для отображения RecordSet на некоторых рисунках в начале главы. Также он использовался для отображения результатов SQL-операторов в приложении SQLExec (которое мы сейчас рассмотрим).
VB6 в действии: проект SQLExec
Ранее в этой главе для экспериментов с SQL-операторами использовалось приложение SQLExec. Создадим это приложение. Для этого выполните следующие действия.
1. Откройте новый Standard EXE проект.
2. Чтобы добавить связанный с данными элемент управления Grid на панель Toolbox, выполните щелчок правой кнопкой мыши на Toolbox и выберите команду Components.
3. В диалоговом окне Components установите переключатель Microsoft Data Bound Grid Control. В этом проекте используется элемент управления Common Dialogs, поэтому установите переключатель Microsoft Common Dialogs Control 5.0 и щелкните на кнопке Close.
4. Создайте элементы управления (рис. 17.23). Кроме видимых элементов управления, на форме расположен элемент управления Common Dialogs (невидимый во время выполнения) и элемент управления Datal, у которого свойство Visible установлено в False
Рис. 17.23. Приложение SQLExec запросы к базе данных с помощью SQL-операторов и отображение результатов в элементе управления Grid.
Поместите элемент управления List на форму и установите его свойство RowSource на имя элемента управления Datal, а свойство ListFieId — на имя поля, которое необходимо отобразить в списке. Для приложения DBList - это поле ProductName. Свойства DataSource и DataField элемента управления List пусты.
Если запустить приложение сейчас, то ничего не случится, потому что не определено, как элемент управления List реагирует на событие Click. Обработчик события должен переместить элемент управления Data на строку RecordSet, которая содержит в поле ProductName то, же значение, что и строка элемента управления List, на которой выполнен щелчок. Для этого добавьте следующий код в обработчик события Click элемента управления List.
Private Sub DBListl_Click()
Datal.Recordset.Bookmark = DBList1.SelectedItem
End Sub
Свойство Bookmark определяет строку в RecordSet. Установка значения этого свойства вынуждает элемент управления Data размещаться на определенной строке. Свойство Selectedltem (Выбранный пункт) элемента управления - это не текст, отображаемый в окне редактирования элемента управления, а закладка записи, которой принадлежит выбранное поле. Этот код позиционирует элемент управления Data в RecordSet и обновляет связанные с данными метки на форме. Учитывая размер этого приложения, можно сказать, что оно действительно выполняет очень много.
1. Выберите элемент управления ComboBox и установите его свойство DataSource на Datal (элемент управления Data, связанный с таблицей Titles).
2. Установите свойство DataField на имя поля, которое необходимо обновить в базе данных. Это поле - PubID.
Поле PubID отображается в элементе управления
ComboBox. Но пользователь видит в ComboBox идентификаторы, а не имена.
Связанный с данными элемент управления ComboBox имеет еще одно свойство — BoundColumn, которое является именем поля в его собственном RowSource и связывает поле, отображаемое в списке, с фактическим полем. Значение свойства BoundColumn должно быть индексным полем, чтобы механизм JET мог быстро его найти. Установите свойство BoundColumn на поле PubID и выполните приложение снова На этот раз в ComboBox появится имя издателя текущей книги. Если выбрать в списке имя другого издателя, то в текущей записи сохранится идентификатор нового издателя.
С помощью свойств DataSource, DataField и BoundColumn можно использовать элемент управления ComboBox как поисковую таблицу. Это позволяет выбрать значения содержательных полей и сохранить значения ключей в базе данных. И все это без единой строки кода! Обратите внимание: имена издателей не отсортированы. Связанный с данными элемент управления ComboBox не имеет свойства Sorted для автоматической сортировки элементов. В случае необходимости сортировки нужно создать новый (соответственно, отсортированный) RecordSet и использовать его для заполнения элемента управления ComboBox.
5. Элемент управления TextBox, с помощью которого вводятся SQL-операторы, называется txtSQL. Установите его свойство MultiLine в True, а свойство Scrollbars - в 2-Vertical
6. Запрограммируем кнопки. Код кнопки Open Database открывает стандартное диалоговое окно File Open (напомню, мы используем элемент управления Common Dialogs), в котором можно выбрать базу данных. Имя базы отображается на элементе управления Label рядом с кнопкой Command.
Программа 17.13. Кнопка Open Database
Private Sub DBOpen_Click()
On Error GoTo NoDatabase
CommonDialog1.CancelError = True
CommonDialog1.Filter = "Databases | *.MDB"
CommonDialogI.ShowOpen
Data1.DatabaseName = CommonDialog1.FileName
Data1.Refresh
If Err = 0 Then
Label1.Caption = CommonDialog1.FileName
Else
MsgBox Err.Description
End If
NoDatabase:
On Error GoTo 0
End Sub
7. Кнопка Execute SQL (выполнить запрос) выбирает SQL-оператор из текстового поля txtSQL и присваивает его свойству RecordSource элемента управления Datal.
Private Sub ExecuteSQL_Click()
On Error GoTo SQLError
Data1.RecordSource = txtSQL
Data1.Refresh
Exit Sub
SQLError:
MsgBox Err.Description
End Sub
Оператор ОnЕггог определяет любую ошибку при выполнении SQL-оператора и отображает информацию о ней в окне сообщений. Присваивание нового значения свойству RecordSource элемента управления не модифицирует его содержимое. Чтобы прочитать новые данные из базы данных и принудительно выполнить модификацию, вызывается метод Refresh элемента управления Data.