Vill du göra det bästa dataredigeringsnätet någonsin? Nedan följer instruktioner för att bygga ett användargränssnitt för redigering av uppslagningsfält i en DBGrid. Vi tittar specifikt på hur man placerar en DBLookupComboBox i en cell i en DBGrid.
Vad detta kommer att göra är att kräva information från en datakälla som kommer att användas för att fylla en listruta.
För att visa en DBLookupComboBox inuti en cell i en DBGrid måste du först göra en tillgänglig vid körning ...
Välj sidan "Datakontroller" på komponentpaletten och välj en DBLookupComboBox. Släpp en var som helst på formuläret och lämna standardnamnet "DBLookupComboBox1." Det spelar ingen roll var du placerar det eftersom det mesta kommer att vara osynligt eller flyta över nätet.
Lägg till ytterligare en DataSource- och DataSet-komponent för att "fylla" kombinationsrutan med värden. Släpp en TDataSource (med namnet DataSource2) och TAdoQuery (namn det AdoQuery1) var som helst på formuläret.
För att en DBLookupComboBox ska fungera ordentligt måste flera fler egenskaper ställas in. de är nyckeln till sökuppkopplingen:
procedur TForm1.FormCreate (avsändare: TObject);
börja med DBLookupComboBox1 dobegin
DataSource: = DataSource1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // från AdoTable1 - visas i DBGrid
KeyField: = 'E-post';
ListFields: = 'Namn; E-post';
Synlig: = Falsk;
slutet;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'VÄLJ Namn, e-post från författare';
AdoQuery1.Open;
slutet;
Notera: När du vill visa mer än ett fält i en DBLookupComboBox, som i exemplet ovan, måste du se till att alla kolumner är synliga. Detta görs genom att ställa in egenskapen DropDownWidth.
Men du kommer att se att till en början måste du ställa in detta till ett mycket stort värde som resulterar i att den tappade listan är för bred (i de flesta fall). En lösning är att ställa in DisplayWidth för ett visst fält som visas i en listruta.
Den här koden, placerad i OnCreate-händelsen för formuläret, säkerställer att både författarnamnet och dess e-postadress visas i listrutan:
AdoQuery1.FieldByName ( 'E') DisplayWidth:. = 10;
AdoQuery1.FieldByName ( 'Namn') DisplayWidth:. = 10;
AdoQuery1.DropDownWidth: = 150;
Det som återstår att göra är att faktiskt göra en kombinationsruta över en cell (i redigeringsläge) med fältet AuthorEmail. Först måste vi se till att DBLookupComboBox1 flyttas och dimensioneras över cellen där fältet AuthorEmail visas..
procedur TForm1.DBGrid1DrawColumnCell
(Avsändare: TObject;
const Rect: TRect;
DataCol: heltal;
Kolumn: TColumn;
Tillstånd: TGridDrawState);
beginif (gdFocused i Stat) thenbeginif (Column.Field.FieldName = DBLookupComboBox1.DataField) thenwith DBLookupComboBox1 do
Börja
Vänster: = Rect.Left + DBGrid1.Left + 2;
Överst: = Rect.Top + DBGrid1.Top + 2;
Bredd: = Rect.Right - Rect.Left;
Bredd: = Rect.Right - Rect.Left;
Höjd: = Rect.Bottom - Rect.Top;
Synlig: = Sann;
slutet;
slutet
slutet;
Nästa, när vi lämnar cellen, måste vi dölja kombinationsrutan:
procedur TForm1.DBGrid1ColExit (avsändare: TObject);
beginif DBGrid1.SelectedField.FieldName = DBLookupComboBox1.DataField sedan
DBLookupComboBox1.Visible: = Falskt
slutet;