Ingin membuat kisi pengeditan data terbaik? Di bawah ini adalah instruksi untuk membangun antarmuka pengguna untuk mengedit bidang pencarian Di dalam DBGrid. Secara khusus, kita akan melihat cara menempatkan DBLookupComboBox ke dalam sel DBGrid.
Apa yang akan dilakukan adalah memanggil informasi dari sumber data yang akan digunakan untuk mengisi kotak drop-down.
Untuk menampilkan DBLookupComboBox di dalam sel a DBGrid, Anda harus membuatnya terlebih dahulu saat dijalankan ...
Buat Pencarian Dengan DBLookupComboBox
Pilih halaman "Kontrol data" pada Palet Komponen dan pilih DBLookupComboBox. Letakkan satu di mana saja di formulir dan tinggalkan nama default "DBLookupComboBox1." Tidak masalah di mana Anda meletakkannya karena sebagian besar waktu, itu tidak akan terlihat atau mengambang di atas grid.
Tambahkan satu lagi DataSource dan komponen DataSet untuk "mengisi" kotak kombo dengan nilai. Jatuhkan TDataSource (dengan nama DataSource2) dan TAdoQuery (beri nama AdoQuery1) di mana saja pada formulir.
Agar DBLookupComboBox berfungsi dengan baik, beberapa properti lainnya harus disetel; mereka adalah kunci untuk koneksi pencarian:
- Sumber data dan DataField tentukan koneksi utama. DataField adalah bidang tempat kami memasukkan nilai yang dicari.
- ListSource adalah sumber dataset pencarian.
- KeyField mengidentifikasi bidang di ListSource yang harus cocok dengan nilai DataField bidang.
-
ListFields adalah bidang dataset pencarian yang sebenarnya ditampilkan dalam kombo. ListField dapat menampilkan lebih dari satu bidang tetapi beberapa harus dipisahkan dengan titik koma.
Anda harus menetapkan nilai yang cukup besar untuk DropDownWidth (dari ComboBox) untuk benar-benar melihat banyak kolom data.
Berikut cara mengatur semua properti penting dari kode (dalam formulir Acara OnCreate handler):
prosedur TForm1.FormCreate (Pengirim: TObject);
mulai dengan DBLookupComboBox1 dobegin
DataSource: = DataSource1; // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2;
DataField: = 'AuthorEmail'; // dari AdoTable1 - ditampilkan di DBGrid
KeyField: = 'Email';
ListFields: = 'Nama; Surel';
Terlihat: = Salah;
akhir;
DataSource2.DataSet: = AdoQuery1;
AdoQuery1.Connection: = AdoConnection1;
AdoQuery1.SQL.Text: = 'SELECT Name, Email FROM Authors';
AdoQuery1.Open;
akhir;
catatan: Saat Anda ingin menampilkan lebih dari satu bidang dalam DBLookupComboBox, seperti dalam contoh di atas, Anda harus memastikan bahwa semua kolom terlihat. Ini dilakukan dengan mengatur properti DropDownWidth.
Namun, Anda akan melihat bahwa pada awalnya, Anda harus mengatur ini ke nilai yang sangat besar yang mengakibatkan daftar yang dijatuhkan menjadi terlalu lebar (dalam kebanyakan kasus). Salah satu solusinya adalah mengatur DisplayWidth dari bidang tertentu yang ditunjukkan dalam a daftar drop-down.
Kode ini, ditempatkan di dalam acara OnCreate untuk formulir, memastikan bahwa nama penulis dan surelnya ditampilkan di dalam daftar drop-down:
AdoQuery1.FieldByName ('Email'). DisplayWidth: = 10;
AdoQuery1.FieldByName ('Name'). DisplayWidth: = 10;
AdoQuery1.DropDownWidth: = 150;
Apa yang tersisa untuk kita lakukan, adalah untuk benar-benar membuat kotak kombo melayang di atas sel (saat dalam mode edit), menampilkan bidang AuthorEmail. Pertama, kita perlu memastikan DBLookupComboBox1 dipindahkan dan berukuran di atas sel tempat bidang AuthorEmail ditampilkan.
prosedur TForm1.DBGrid1DrawColumnCell
(Pengirim: TObject;
const Rect: TRect;
DataCol: Integer;
Kolom: TColumn;
Negara: TGridDrawState);
mulai jika (gdFocused di Negara) thenbeginif (Kolom. Bidang. FieldName = DBLookupComboBox1.DataField) lalu dengan DBLookupComboBox1 melakukan
mulai
Kiri: = Rect. Kiri + DBGrid1.Left + 2;
Atas: = Persegi Panjang. Top + DBGrid1.Top + 2;
Lebar: = Persegi Panjang. Kanan - Persegi. Kiri;
Lebar: = Persegi Panjang. Kanan - Persegi. Kiri;
Tinggi: = Persegi Panjang. Bawah - Persegi. Teratas;
Terlihat: = Benar;
akhir;
akhir
akhir;
Selanjutnya, ketika kita meninggalkan sel, kita harus menyembunyikan kotak kombo:
prosedur TForm1.DBGrid1ColExit (Pengirim: TObject);
mulai jika DBGrid1 .Pilih Terpilih. FieldName = DBLookupComboBox1.DataField kemudian
DBLookupComboBox1.Visible: = Salah
akhir;
Perhatikan bahwa ketika dalam mode pengeditan, semua penekanan tombol akan masuk ke sel DBGrid tetapi kita harus memastikan semuanya dikirim ke DBLookupComboBox. Dalam kasus DBLookupComboBox, kami terutama tertarik pada kunci [Tab]; harus memindahkan fokus input ke sel berikutnya.
prosedur TForm1.DBGrid1KeyPress (Pengirim: TObject; var Key: Char);
mulai jika (kunci = Chr (9)) kemudian Keluar;
jika (DBGrid1. Pilihan Dipilih. FieldName = DBLookupComboBox1.DataField) maka mulailah
DBLookupComboBox1.SetFocus;
SendMessage (DBLookupComboBox1.Handle, WM_Char, word (Key), 0);
akhir
akhir;
Saat Anda memilih item ("baris") dari DBLookupComboBox, nilainya atau yang sesuai KeyField bidang disimpan sebagai nilai dari DataField bidang.