Tworzenie listy rozwijanej w DBGrid

click fraud protection

Chcesz stworzyć najlepszą siatkę edycji danych? Poniżej znajdują się instrukcje budowania interfejsu użytkownika do edycji pól odnośników Wewnątrz DBGrid. W szczególności przyjrzymy się, jak umieścić DBLookupComboBox w komórce DBGrid.

Spowoduje to wywołanie informacji ze źródła danych, które zostanie wykorzystane do wypełnienia pola rozwijanego.

Aby wyświetlić DBLookupComboBox w komórce DBGrid, musisz najpierw udostępnić jeden w czasie wykonywania ...

Utwórz odnośnik za pomocą DBLookupComboBox

Wybierz stronę „Kontrola danych” na palecie składników i wybierz DBLookupComboBox. Upuść jeden w dowolnym miejscu formularza i pozostaw domyślną nazwę „DBLookupComboBox1”. Nie ma znaczenia, gdzie go umieścisz, ponieważ przez większość czasu będzie niewidoczny lub unosi się nad siatką.

Dodaj jeszcze jeden składnik DataSource i DataSet, aby „wypełnić” pole kombi wartościami. Upuść TDataSource (o nazwie DataSource2) i TAdoQuery (nazwij to AdoQuery1) w dowolnym miejscu formularza.

Aby DBLookupComboBox działał poprawnie, należy ustawić kilka dodatkowych właściwości; są kluczem do połączenia wyszukiwania:

instagram viewer

  • Źródło danych i DataField określić główne połączenie. DataField to pole, do którego wstawiamy wyszukiwane wartości.
  • ListSource jest źródłem zestawu danych odnośnika.
  • KeyField identyfikuje pole w ListSource które muszą być zgodne z wartością DataField pole.
  • ListFields to pole (pola) zestawu danych wyszukiwania, które są faktycznie wyświetlane w zestawie. ListField może pokazywać więcej niż jedno pole, ale wielokrotności powinny być oddzielone średnikami.
    Musisz ustawić wystarczająco dużą wartość dla DropDownWidth (ComboBox), aby naprawdę zobaczyć wiele kolumn danych.
    Oto jak ustawić wszystkie ważne właściwości z kodu (w formularzu Zdarzenie OnCreate treser):
procedura TForm1.FormCreate (Sender: TObject);
zaczynać się DBLookupComboBox1 dobegin
DataSource: = DataSource1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // z AdoTable1 - wyświetlane w DBGrid
KeyField: = 'Email';
ListFields: = 'Nazwa; E-mail';
Widoczny: = Fałsz;
koniec;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'WYBIERZ Imię, E-mail OD Autorów';
AdoQuery1.Open;
koniec;

Uwaga: Jeśli chcesz wyświetlić więcej niż jedno pole w DBLookupComboBox, tak jak w powyższym przykładzie, musisz upewnić się, że wszystkie kolumny są widoczne. Dokonuje się tego poprzez ustawienie właściwości DropDownWidth.

Jednak zobaczysz, że początkowo musisz ustawić na bardzo dużą wartość, co powoduje, że lista rozwijana jest zbyt szeroka (w większości przypadków). Jednym z obejść jest ustawienie DisplayWidth określonego pola pokazanego na Lista rozwijana.

Ten kod umieszczony w zdarzeniu OnCreate formularza zapewnia, że ​​zarówno nazwisko autora, jak i jego e-mail są wyświetlane na liście rozwijanej:

AdoQuery1.FieldByName („E-mail”). DisplayWidth: = 10;
AdoQuery1.FieldByName („Nazwa”) DisplayWidth: = 10;
AdoQuery1.DropDownWidth: = 150;

To, co pozostaje nam do zrobienia, to fakt, że pole kombi unosi się nad komórką (w trybie edycji), wyświetlając pole AuthorEmail. Najpierw musimy się upewnić, że DBLookupComboBox1 jest przenoszony i sortowany w komórce, w której wyświetlane jest pole AuthorEmail.

procedura TForm1.DBGrid1DrawColumnCell
(Nadawca: TObject;
const Rect: TRect;
DataCol: Integer;
Kolumna: TColumn;
State: TGridDrawState);
beginif (gdFocused w Stan) thenbeginif (Kolumna. Pole. FieldName = DBLookupComboBox1.DataField) potem DBLookupComboBox1 robić
zaczynać
Po lewej: = Rect. Lewy + DBGrid1. Lewy + 2;
Top: = Rect. Top + DBGrid1.Top + 2;
Szerokość: = Prostokąt. Z prawej - Rect. Lewo;
Szerokość: = Prostokąt. Z prawej - Rect. Lewo;
Wysokość: = Rect. Dół - Prostownik Top;
Widoczny: = prawda;
koniec;
koniec
koniec;

Następnie, kiedy opuszczamy komórkę, musimy ukryć pole kombi:

procedura TForm1.DBGrid1ColExit (Sender: TObject);
beginif DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField następnie
DBLookupComboBox1.Visible: = False
koniec;

Zauważ, że w trybie edycji wszystkie naciśnięcia klawiszy idą do komórki DBGrid, ale musimy upewnić się, że są one wysyłane do DBLookupComboBox. W przypadku DBLookupComboBox interesuje nas przede wszystkim klawisz [Tab]; powinien przenieść fokus wejściowy do następnej komórki.

procedura TForm1.DBGrid1KeyPress (Sender: TObject; var Key: Char);
beginif (klucz = Chr (9)) następnie Wyjście;
gdyby (DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField) wtedy zacznij
DBLookupComboBox1.SetFocus;
SendMessage (DBLookupComboBox1.Handle, WM_Char, word (Key), 0);
koniec
koniec;

Gdy wybierzesz element („wiersz”) z DBLookupComboBox, wartość lub odpowiedni KeyField pole jest przechowywane jako wartość DataField pole.

instagram story viewer