Crearea listei derulante într-o DBGrid

Doriți să faceți cea mai bună grilă de editare a datelor vreodată? Mai jos sunt instrucțiuni pentru construirea unei interfețe de utilizator pentru editarea câmpurilor de căutare În interiorul unui DBGrid. Mai exact, vom analiza cum să plasați un DBLookupComboBox într-o celulă a unui DBGrid.

Ceea ce va face acest lucru este să solicitați informații de la o sursă de date care va fi folosită pentru a popula o casetă derulantă.

Pentru a afișa un DBLookupComboBox în interiorul unei celule a DBGrid, mai întâi trebuie să puneți una la dispoziție în timpul rulării ...

Creați o căutare cu un DBLookupComboBox

Selectați pagina „Control de date” din Paleta de componente și alegeți un DBLookupComboBox. Aruncați unul oriunde pe formular și lăsați numele implicit al „DBLookupComboBox1”. Nu contează unde l-ați plasat, deoarece de cele mai multe ori, va fi invizibil sau va pluti peste grilă.

Adăugați încă o componentă DataSource și DataSet pentru a „completa” caseta combo cu valori. Aruncați o TDataSource (cu numele DataSource2) și TAdoQuery (denumiți-o AdoQuery1) oriunde pe formular.

instagram viewer

Pentru ca un DBLookupComboBox să funcționeze corect, trebuie setate mai multe proprietăți; ele sunt cheia conexiunii de căutare:

  • Sursă de date și Câmp de date determinați conexiunea principală DataField este un câmp în care introducem valorile căutate.
  • ListSource este sursa setului de date de căutare.
  • campuri-cheie intr identifică câmpul din ListSource care trebuie să corespundă valorii Câmp de date camp.
  • ListFields este câmpul (câmpurile) setului de date de căutare care sunt de fapt afișate în combo. ListField poate afișa mai mult de un câmp, dar multiplii ar trebui separați prin punct și virgulă.
    Trebuie să setați o valoare suficient de mare pentru DropDownWidth (a unui ComboBox) pentru a vedea într-adevăr mai multe coloane de date.
    Iată cum puteți seta toate proprietățile importante din cod (în formular Eveniment OnCreate handler):
procedură TForm1.FormCreate (Expeditor: TObject);
începe cu DBLookupComboBox1 dobegin
DataSource: = DataSource1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // din AdoTable1 - afișat în DBGrid
KeyField: = 'Email';
ListFields: = 'Nume; E-mail';
Vizibil: = Fals;
Sfârșit;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'SELECTĂ NUMELE, E-mail DE LA Autori';
AdoQuery1.Open;
Sfârșit;

Notă: Când doriți să afișați mai multe câmpuri într-un DBLookupComboBox, ca în exemplul de mai sus, trebuie să vă asigurați că toate coloanele sunt vizibile. Acest lucru se realizează prin setarea proprietății DropDownWidth.

Cu toate acestea, veți vedea că inițial, trebuie să setați aceasta la o valoare foarte mare, ceea ce duce la faptul că lista abandonată este prea largă (în majoritatea cazurilor). O soluție este de a seta lățimea de afișare a unui anumit câmp prezentat în lista verticală.

Acest cod, plasat în cadrul evenimentului OnCreate pentru formular, asigură că atât numele autorului, cât și e-mailul său sunt afișate în lista derulantă:

AdoQuery1.FieldByName ( 'Email') DisplayWidth:. = 10;
AdoQuery1.FieldByName ( 'Name') DisplayWidth:. = 10;
AdoQuery1.DropDownWidth: = 150;

Ceea ce ne mai rămâne de făcut este să facem efectiv o casetă combo peste o celulă (când este în mod de editare), afișând câmpul AuthorEmail. În primul rând, trebuie să ne asigurăm că DBLookupComboBox1 este mutat și dimensionat peste celula în care este afișat câmpul AuthorEmail.

procedură TForm1.DBGrid1DrawColumnCell
(Expeditor: TObject;
const Rect: TRect;
DataCol: Integer;
Coloana: TColumn;
Stat: TGridDrawState);
beginif (gdFocused în Stat) thenbeginif (Coloană. Camp. FieldName = DBLookupComboBox1.DataField) thenwith DBLookupComboBox1 do
începe
Stânga: = Rect. Stânga + DBGrid1.Left + 2;
Sus: = Rect. Top + DBGrid1.Top + 2;
Lățime: = dreptunghi. Corect - Rect. Stânga;
Lățime: = dreptunghi. Corect - Rect. Stânga;
Înălțime: = Rect. Partea de jos - Rect. Top;
Vizibil: = Adevărat;
Sfârșit;
Sfârșit
Sfârșit;

În continuare, când părăsim celula, trebuie să ascundem caseta combo:

procedură TForm1.DBGrid1ColExit (Expeditor: TObject);
beginif DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField apoi
DBLookupComboBox1.Visible: = False
Sfârșit;

Rețineți că, atunci când este în mod de editare, toate apăsările taste vor merge la celula DBGrid, dar trebuie să ne asigurăm că sunt trimise la DBLookupComboBox. În cazul unui DBLookupComboBox, suntem interesați în primul rând de tasta [Tab]; ar trebui să mute focalizarea de intrare în următoarea celulă.

procedură TForm1.DBGrid1KeyPress (Expeditor: TObject; var Cheie: Char);
beginif (cheie = Chr (9)) apoi Ieșire;
dacă (DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField) thenbegin
DBLookupComboBox1.SetFocus;
SendMessage (DBLookupComboBox1.Handle, WM_Char, cuvânt (cheie), 0);
Sfârșit
Sfârșit;

Când alegeți un element („rând”) dintr-un DBLookupComboBox, valoarea sau valoarea corespunzătoare campuri-cheie intr câmpul este stocat ca valoare a Câmp de date camp.

instagram story viewer