Hur man lägger en listrutan i en DBgrid

Så här lägger du en rullgardinsmeny till en DBGrid. Skapa visuellt mer attraktiva användargränssnitt för att redigera sökfält i en DBGrid - med hjälp av egenskapen PickList i en DBGrid-kolumn.

Nu när du vet vad som är uppslagningsfält och vilka alternativ för att visa ett uppslagningsfält i Delphis DBGrid är det dags att se hur man använder egenskapen PickList i en DGBrid-kolumn för att göra det möjligt för en användare att välja ett värde för ett uppslagningsfält från en listruta.

En snabb information om DBGrid-kolumnernas egendom

En DBGrid-kontroll har en kolumnegenskap - en samling TColumnobjekt som representerar alla kolumnerna i ett rutnätkontroll. Kolumner kan ställas in vid designtid genom kolumnredigeraren eller programmatiskt vid körning. Du lägger vanligtvis till kolumner i en DBGird när du vill definiera hur en kolumn ska visas, hur informationen i kolumnen visas och för att få åtkomst till egenskaperna, händelserna och metoderna för TDBGridColumns under körning. Med ett anpassat rutnät kan du konfigurera flera kolumner för att visa olika vyer av samma datasats (olika kolumnorder, olika fältval och olika kolumnfärger och teckensnitt, till exempel).

Nu är varje kolumn i ett rutnät "länkat" till ett fält från ett dataset som visas i rutnätet. Dessutom har varje kolumn en PickList-egenskap. Egenskapen PickList visar värden som användaren kan välja för kolumnens länkade fältvärde.

Fylla PickList

Vad du kommer att lära dig här är hur du fyller den stränglistan med värden från ett annat datasæt vid körning.
Kom ihåg att vi redigerar artikeltabellen och att ett ämnesfält bara kan acceptera värden från tabellen Ämnen: den ideala situationen för PickList!

Så här ställer du in egenskapen PickList. Först lägger vi till ett samtal till SetupGridPickList-proceduren i formulärets OnCreate-händelsehanterare.

procedur TForm1.FormCreate (avsändare: TObject);
Börja
SetupGridPickList ('Ämne', 'VÄLJ Namn från ämnen');
slutet;

Det enklaste sättet att skapa SetupGridPickList-förfarandet är att gå till den privata delen av formulärdeklarationen, lägga till deklarationen där och slå CTRL + SHIFT + C-tangentkombinationen - Delphis kodavslutning gör resten:

...
typ
TForm1 = klass (TForm)
...
privateprocedure SetupGridPickList (
const Fält namn : sträng;
const kvm: sträng);
offentlig
...

Obs: SetupGridPickList-proceduren tar två parametrar. Den första parametern, Fältnamn, är namnet på det fält vi vill agera som ett uppslagningsfält; den andra parametern, SQL, är SQL-uttrycket vi använder för att fylla PickList med möjliga värden - i allmänhet ska SQL-uttrycket returnera ett datasats med bara ett fält.

Så här ser SetupGridPickList ut:

procedur TForm1.SetupGridPickList (const Fältnamn, sql: sträng);
var
slPickList: TStringList;
Fråga: TADOQuery;
i: heltal;
Börja
slPickList: = TStringList.Create;
Fråga: = TADOQuery.Create (själv);
Prova
Query.Connection: = ADOConnection1;
Fråga.SQL.Text: = sql;
Query.Open;
// Fyll stränglistanmedan inte Query.EOF dobegin
slPickList.Add (Query.Fields [0] .AsString);
Query.Next;
slutet; //medan
// placera listan i rätt kolumnför i: = 0 till DBGrid1.Columns.Count-1 do
om DBGrid1.Columner [i]. Fältnamn = Fältnamn thenbegin
DBGrid1.Columns [i] .PickList: = slPickList;
Ha sönder;
slutet;
till sist
slPickList.Free;
Query.Free;
slutet;
slutet; (* SetupGridPickList *)

Det är allt. När du klickar på ämneskolumnen (för att gå in i redigeringsläge).

Obs 1: som standard visar rullgardinsmenyn 7 värden. Du kan ändra längden på listan genom att ställa in egenskapen DropDownRows.

Obs 2: ingenting hindrar dig från att fylla i PickList från en lista över värden som inte kommer från en databastabell. Om du till exempel har ett fält som bara accepterar namnen på vardagar ('måndag', ..., 'söndag') kan du bygga en "hårdkodad" PickList.

"Öh, jag måste klicka på PickList 4 gånger ..."

Observera att när du vill redigera fältet som visar en listruta måste du klicka på cellen fyra gånger för att faktiskt välja ett värde från en lista. Nästa kodavsnitt, som läggs till i DBGrids OnCellClick-händelsehanterare, efterliknar en hit till F2-tangenten följt av Alt + DownArrow.

procedur TForm1.DBGrid1CellClick (kolumn: TColumn);
Börja// Att göra rullgardinsmenyn snabbare visasom Column.PickList.Count> 0 thenbegin
keybd_event (VK_F2,0,0,0);
keybd_event (VK_F2,0, KEYEVENTF_KEYUP, 0);
keybd_event (VK_MENU, 0,0,0);
keybd_event (VK_DOWN, 0,0,0);
keybd_event (VK_DOWN, 0, KEYEVENTF_KEYUP, 0);
keybd_event (VK_MENU, 0, KEYEVENTF_KEYUP, 0);
slutet;
slutet;