Vytvorenie rozbaľovacieho zoznamu v DBGrid

Chcete urobiť najlepšiu mriežku na úpravu údajov vôbec? Nižšie sú uvedené pokyny na vytvorenie používateľského rozhrania na úpravu vyhľadávacích polí Vo vnútri DBGrid. Konkrétne sa pozrieme na to, ako umiestniť DBLookupComboBox do bunky DBGrid.

Urobíte to tak, že využijete informácie zo zdroja údajov, ktoré sa použijú na naplnenie rozbaľovacej ponuky.

Na zobrazenie DBLookupComboBox vo vnútri bunky a DBGrid, musíte najprv sprístupniť jeden v čase spustenia ...

Vytvorte vyhľadávanie pomocou DBLookupComboBox

Vyberte stránku „Ovládanie údajov“ na palete komponentov a vyberte DBLookupComboBox. Zrušte ho kdekoľvek vo formulári a ponechajte predvolený názov „DBLookupComboBox1“. Nezáleží na tom, kam ste ju umiestnili, pretože po väčšinu času bude neviditeľná alebo sa vznáša nad mriežkou.

Pridajte ďalšie komponenty DataSource a DataSet, aby ste vyplnili pole so zoznamom hodnotami. Zrušte TDataSource (s názvom DataSource2) a TAdoQuery (pomenujte ho AdoQuery1) kdekoľvek vo formulári.

Aby DBLookupComboBox fungoval správne, musíte nastaviť niekoľko ďalších vlastností; sú kľúčom k vyhľadávaniu pripojenia:

instagram viewer

  • Dátový zdroj a DataField určiť hlavné pripojenie. DataField je pole, do ktorého vkladáme vyhľadávané hodnoty.
  • ListSource je zdrojom súboru údajov vyhľadávania.
  • KeyField identifikuje pole v ListSource ktoré sa musia zhodovať s hodnotou DataField lúka.
  • ListFields je pole (-a) vyhľadávacieho súboru údajov, ktoré sa skutočne zobrazujú v kombo. ListField môže zobrazovať viac ako jedno pole, ale násobky by mali byť oddelené bodkočiarkami.
    Musíte nastaviť dostatočne veľkú hodnotu pre DropDownWidth (ComboBox), aby ste skutočne videli viac stĺpcov údajov.
    Tu je návod, ako nastaviť všetky dôležité vlastnosti z kódu (vo formulári) Udalosť OnCreate handler):
procedúra TForm1.FormCreate (Sender: TObject);
začať s DBLookupComboBox1 dobegin
Zdroj údajov: = Zdroj údajov1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // z AdoTable1 - zobrazené v DBGrid
KeyField: = 'E-mail';
ListFields: = 'Meno; E-mail ";
Viditeľné: = Nepravdivé;
koniec;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'VYBRAŤ meno, e-mail od autorov';
AdoQuery1.Open;
koniec;

Poznámka: Ak chcete zobraziť viac ako jedno pole v DBLookupComboBox, ako v príklade vyššie, musíte sa uistiť, že sú viditeľné všetky stĺpce. To sa vykonáva nastavením vlastnosti DropDownWidth.

Uvidíte však, že to musíte spočiatku nastaviť na veľmi veľkú hodnotu, čo má za následok, že rozbalený zoznam je príliš široký (vo väčšine prípadov). Jedným riešením je nastavenie DisplayWidth konkrétneho poľa zobrazeného v a rozbaľovací zoznam.

Tento kód umiestnený vo vnútri udalosti OnCreate vo formulári zabezpečuje, aby sa v rozbaľovacom zozname zobrazovalo meno autora aj e-mail:

AdoQuery1.FieldByName ( 'E') DisplayWidth:. = 10;
AdoQuery1.FieldByName ( 'názov') DisplayWidth:. = 10;
AdoQuery1.DropDownWidth: = 150;

Zostáva nám to, aby sa rozbaľovacie pole skutočne nachádzalo nad bunkou (v režime úprav) a zobrazovalo pole AuthorEmail. Najprv sa musíme presvedčiť, či je DBLookupComboBox1 presunutý a veľkosť nad bunkou, v ktorej je zobrazené pole AuthorEmail.

procedúra TForm1.DBGrid1DrawColumnCell
(Odosielateľ: TObject;
const Rect: TRect;
DataCol: Celé číslo;
Stĺpec: TColumn;
Štát: TGridDrawState);
beginif (gdFocused v Štát) thenbeginif (Stĺpec. Lúka. FieldName = DBLookupComboBox1.DataField) thenwith DBLookupComboBox1 robiť
začať
Vľavo: = pravý. Doľava + DBGrid1.Left + 2;
Hore: = Rect. Top + DBGrid1.Top + 2;
Šírka: = Rect. Pravý - pravý. vľavo;
Šírka: = Rect. Pravý - pravý. vľavo;
Výška: = Rect. Spodok - rekt. Najlepším hráčom;
Viditeľné: = Pravda;
koniec;
koniec
koniec;

Ďalej, keď opustíme bunku, musíme skryť rozbaľovacie pole:

procedúra TForm1.DBGrid1ColExit (Sender: TObject);
beginif DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField potom
DBLookupComboBox1.Visible: = False
koniec;

Všimnite si, že keď v editovacom režime idú všetky stlačenia klávesov do bunky DBGrid, musíme sa uistiť, že sú odoslané do DBLookupComboBox. V prípade DBLookupComboBox nás zaujíma predovšetkým kláves [Tab]; malo by presunúť zameranie vstupu do ďalšej bunky.

procedúra TForm1.DBGrid1KeyPress (Odosielateľ: TObject; Var key: Char);
beginif (kľúč = Chr (9)) potom Východ;
ak (DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField) thenbegin
DBLookupComboBox1.SetFocus;
SendMessage (DBLookupComboBox1.Handle, WM_Char, slovo (Key), 0);
koniec
koniec;

Ak vyberiete položku („riadok“) z DBLookupComboBox, hodnotu alebo zodpovedajúcu hodnotu KeyField pole sa uloží ako hodnota DataField lúka.