Хотите создать лучшую сетку для редактирования данных? Ниже приведены инструкции по созданию пользовательского интерфейса для редактирования полей поиска. Внутри DBGrid. В частности, мы рассмотрим, как поместить DBLookupComboBox в ячейку DBGrid.
Что это будет делать, так это запрашивать информацию из источника данных, которая будет использоваться для заполнения раскрывающегося списка.
Чтобы показать DBLookupComboBox внутри ячейки DBGridсначала нужно сделать его доступным во время выполнения ...
Создать поиск с помощью DBLookupComboBox
Выберите страницу «Элементы управления данными» на палитре компонентов и выберите DBLookupComboBox. Удалите один в любом месте формы и оставьте имя по умолчанию «DBLookupComboBox1». Неважно, куда вы положите его, потому что большую часть времени он будет невидимым или плавающим по сетке.
Добавьте еще один компонент DataSource и DataSet, чтобы «заполнить» поле со списком значениями. Удалите TDataSource (с именем DataSource2) и TAdoQuery (назовите его AdoQuery1) в любом месте формы.
Для правильной работы DBLookupComboBox необходимо установить еще несколько свойств; они являются ключом к поисковому соединению:
- Источник данных и Поле данных определить основное соединение. DataField - это поле, в которое мы вставляем искомые значения.
- ListSource является источником набора данных поиска.
- KeyField идентифицирует поле в ListSource который должен соответствовать значению Поле данных поле.
-
ListFields это поле (я) набора данных поиска, которые фактически отображаются в комбинированном списке. ListField может показывать более одного поля, но кратные должны быть разделены точками с запятой.
Вы должны установить достаточно большое значение для DropDownWidth (из ComboBox), чтобы действительно увидеть несколько столбцов данных.
Вот как установить все важные свойства из кода (в форме Событие OnCreate обработчик):
процедура TForm1.FormCreate (Отправитель: TObject);
начинать с DBLookupComboBox1 dobegin
DataSource: = DataSource1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // из AdoTable1 - отображается в DBGrid
KeyField: = 'Электронная почта';
ListFields: = 'Имя; Эл. адрес';
Видимый: = Ложь;
конец;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'ВЫБРАТЬ имя, электронная почта от авторов';
AdoQuery1.Open;
конец;
Замечания: Если вы хотите отобразить более одного поля в DBLookupComboBox, как в приведенном выше примере, вы должны убедиться, что все столбцы видны. Это делается путем установки свойства DropDownWidth.
Тем не менее, вы увидите, что изначально вы должны установить это значение на очень большое, в результате чего выпадающий список будет слишком широким (в большинстве случаев). Одним из обходных путей является установка DisplayWidth определенного поля, отображаемого в раскрывающийся список.
Этот код, помещенный в событие OnCreate для формы, гарантирует, что и имя автора, и его адрес электронной почты будут отображаться в раскрывающемся списке:
AdoQuery1.FieldByName ( 'E-mail') DisplayWidth:. = 10;
AdoQuery1.FieldByName ( 'Имя') DisplayWidth:. = 10;
AdoQuery1.DropDownWidth: = 150;
Нам остается только сделать поле со списком над ячейкой (в режиме редактирования), отображая поле AuthorEmail. Во-первых, нам нужно убедиться, что DBLookupComboBox1 перемещен и измерен по ячейке, в которой отображается поле AuthorEmail.
процедура TForm1.DBGrid1DrawColumnCell
(Отправитель: TObject;
const Rect: TRect;
DataCol: Integer;
Колонка: TColumn;
Состояние: TGridDrawState);
beginif (gdFocused в Состояние) thenbeginif (Колонок. Поле. FieldName = DBLookupComboBox1.DataField) thenwith DBLookupComboBox1 делать
начать
Слева: = Rect. Слева + DBGrid1.Left + 2;
Верхняя часть: = Rect. Top + DBGrid1.Top + 2;
Ширина: = Rect. Справа - прям. Осталось;
Ширина: = Rect. Справа - прям. Осталось;
Высота: = Rect. Внизу - Rect. Верхний;
Видимый: = Истина;
конец;
конец
конец;
Далее, когда мы покидаем ячейку, мы должны скрыть поле со списком:
процедура TForm1.DBGrid1ColExit (Отправитель: TObject);
beginif DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField тогда
DBLookupComboBox1.Visible: = False
конец;
Обратите внимание, что в режиме редактирования все нажатия клавиш поступают в ячейку DBGrid, но мы должны убедиться, что они отправлены в DBLookupComboBox. В случае DBLookupComboBox нас в первую очередь интересует клавиша [Tab]; он должен переместить фокус ввода на следующую ячейку.
процедура TForm1.DBGrid1KeyPress (Отправитель: TObject; ключ Var: Char);
beginif (ключ = Chr (9)) тогда Выход;
если (DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField) thenbegin
DBLookupComboBox1.SetFocus;
SendMessage (DBLookupComboBox1.Handle, WM_Char, word (Key), 0);
конец
конец;
Когда вы выбираете элемент («строку») из DBLookupComboBox, значение или соответствующий KeyField поле хранится как значение Поле данных поле.