Vil du lage det beste dataredigeringsnettet noensinne? Nedenfor er instruksjoner for å bygge et brukergrensesnitt for redigering av oppslagfelt Inne i en DBGrid. Spesielt skal vi se på hvordan du plasserer en DBLookupComboBox i en celle i en DBGrid.
Hva dette vil gjøre er å be om informasjon fra en datakilde som vil bli brukt til å fylle en nedtrekksboks.
For å vise en DBLookupComboBox inne i en celle i en DBGrid, må du først gjøre en tilgjengelig på kjøretid ...
Lag et oppslag med en DBLookupComboBox
Velg siden "Datakontroller" på komponentpaletten og velg en DBLookupComboBox. Slipp en hvor som helst på skjemaet og la standardnavnet til "DBLookupComboBox1." Det har ikke noe å si hvor du legger det siden det meste av tiden vil være usynlig eller flyte over rutenettet.
Legg til en annen DataSource- og DataSet-komponent for å "fylle" kombinasjonsboksen med verdier. Slipp en TDataSource (med navnet DataSource2) og TAdoQuery (name it AdoQuery1) hvor som helst på skjemaet.
For at en DBLookupComboBox skal fungere ordentlig, må flere egenskaper settes; de er nøkkelen til oppslagstilkoblingen:
- Datakilde og datafeltet bestemme hovedforbindelsen. DataField er et felt hvor vi setter inn oppsatte verdier.
- ListSource er kilden til datasettet for oppslag.
- KeyField identifiserer feltet i ListSource som må samsvare med verdien av datafeltet felt.
-
ListFields er feltet (e) for oppslagdatasettet som faktisk vises i kombinasjonsboksen. ListField kan vise mer enn ett felt, men multipler bør skilles med semikolon.
Du må angi stor nok verdi for DropDownWidth (av en ComboBox) for å se flere datakolonner.
Slik setter du inn alle viktige egenskaper fra kode (i skjemaet) OnCreate-arrangement handler):
fremgangsmåte TForm1.FormCreate (avsender: TObject);
starte med DBLookupComboBox1 dobegin
DataSource: = DataSource1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // fra AdoTable1 - vises i DBGrid
KeyField: = 'E-post';
ListFields: = 'Navn; Send e-post ';
Synlig: = Falske;
slutt;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'VELG Navn, e-post fra forfattere';
AdoQuery1.Open;
slutt;
Merk: Når du vil vise mer enn ett felt i en DBLookupComboBox, som i eksemplet ovenfor, må du sørge for at alle kolonnene er synlige. Dette gjøres ved å angi DropDownWidth-egenskapen.
Imidlertid vil du se at du til å begynne med må sette denne til en veldig stor verdi, noe som resulterer i at nedfelt liste er for bred (i de fleste tilfeller). En løsning er å stille inn DisplayWidth for et bestemt felt vist i a nedtrekksliste.
Denne koden, plassert i OnCreate-hendelsen for skjemaet, sikrer at både forfatternavnet og e-postadressen vises i rullegardinlisten:
AdoQuery1.FieldByName ( 'E') DisplayWidth:. = 10;
AdoQuery1.FieldByName ( 'Navn') DisplayWidth:. = 10;
AdoQuery1.DropDownWidth: = 150;
Det som gjenstår for oss å gjøre, er å faktisk lage en kombinasjonsboks svevet over en celle (når du er i redigeringsmodus), og viser AutorEmail-feltet. Først må vi sørge for at DBLookupComboBox1 blir flyttet og dimensjonert over cellen der AuthorEmail-feltet vises.
fremgangsmåte TForm1.DBGrid1DrawColumnCell
(Avsender: TObject;
const Rect: TRect;
DataCol: Heltall;
Kolonne: TColumn;
Oppgi: TGridDrawState);
beginif (gdFocused i Stat) thenbeginif (Kolonne. Felt. Feltnavn = DBLookupComboBox1.DataField) thenwith DBLookupComboBox1 gjøre
begynne
Venstre: = Rekt. Venstre + DBGrid1.Left + 2;
Øverst: = Rekt. Topp + DBGrid1.Topp + 2;
Bredde: = Rekt. Rett - Rekt. Venstre;
Bredde: = Rekt. Rett - Rekt. Venstre;
Høyde: = Rekt. Bunn - Rekt. Topp;
Synlig: = Sann;
slutt;
slutt
slutt;
Neste, når vi forlater cellen, må vi skjule kombinasjonsboksen:
fremgangsmåte TForm1.DBGrid1ColExit (avsender: TObject);
beginif DBGrid1.SelectedField. Feltnavn = DBLookupComboBox1.DataField deretter
DBLookupComboBox1.Visible: = Falske
slutt;
Merk at når du er i redigeringsmodus, vil alle tastetrykk til DBGrid's celle, men vi må sørge for at de blir sendt til DBLookupComboBox. Når det gjelder en DBLookupComboBox, er vi først og fremst interessert i [Tab] -tasten; den skal flytte inngangsfokuset til neste celle.
fremgangsmåte TForm1.DBGrid1KeyPress (Avsender: TObject; var Key: Char);
beginif (tast = Chr (9)) deretter Exit;
hvis (DBGrid1.SelectedField. Feltnavn = DBLookupComboBox1.DataField) thenbegin
DBLookupComboBox1.SetFocus;
SendMessage (DBLookupComboBox1.Handle, WM_Char, word (Key), 0);
slutt
slutt;
Når du velger et element ("rad") fra en DBLookupComboBox, verdien eller tilsvarende KeyField feltet lagres som verdien av datafeltet felt.