Panel.Dock Isi mengabaikan pengaturan Panel.Dock lainnya

154

Jika Anda membuat panel pada formulir dan mengaturnya ke Dock = Top dan drop panel lain dan mengatur Dock = Isi, itu dapat mengisi seluruh formulir, mengabaikan panel pertama. Mengubah urutan tab tidak menghasilkan apa-apa.

Jeff Cuscutis
sumber

Jawaban:

335

Tata letak docking tergantung pada urutan kontrol saudara. Kontrol di-dock "tombol ke atas", jadi kontrol terakhir dalam koleksi di-dock terlebih dahulu . Kontrol berlabuh hanya memperhitungkan tata letak saudara yang sebelumnya berlabuh. Oleh karena itu kontrol dengan Dock = Isi harus menjadi yang pertama (atas) dalam urutan saudara, jika Anda ingin mengambil kontrol merapat lainnya ke akun. Jika ini bukan kontrol pertama, kontrol sebelumnya akan tumpang tindih.

Ini dapat membingungkan karena urutan saudara tidak selalu sama dengan urutan visual, dan urutan saudara tidak selalu terlihat dari tampilan desain.

The Document garis jendela (View -> Lain Windows -> Dokumen garis besar) memberikan berguna pohon-pandangan dari hirarki kontrol dan ketertiban, dan memungkinkan Anda untuk mengubah urutan saudara kontrol.

Anda juga dapat mengubah urutan saudara langsung di desainer dengan menu konteks -> Bawa ke depan / Kirim ke belakang, yang menggerakkan kontrol untuk menjadi saudara kandung pertama atau terakhir. Label menu ini mungkin agak membingungkan karena efek sebenarnya tergantung pada model tata letak.

Dengan kontrol yang diposisikan tetap, posisi 2D tidak tergantung pada urutan saudara, tetapi ketika kontrol tumpang tindih, kontrol yang paling awal dalam urutan akan "di atas", menyembunyikan bagian dari saudara kandung di kemudian dalam urutan. Dalam konteks ini Membawa ke depan / Kirim ke belakang masuk akal.

Di dalam panel tata letak aliran atau tabel, urutan kreasi menentukan urutan visual kontrol. Tidak ada kontrol yang tumpang tindih. Jadi bawa ke depan / kirim ke belakang benar-benar berarti membuat pertama atau terakhir dalam urutan kontrol.

Dengan tata letak berlabuh, bawa ke depan / kirim ke belakang mungkin lebih membingungkan karena menentukan urutan docking yang dihitung, jadi "bawa ke depan" pada kontrol pengisian berlabuh akan menempatkan kontrol di tengah - tengah induk , dengan mempertimbangkan semua kontrol edge-docked.

JacquesB
sumber
1
Saya memiliki panel, strip status, dan strip menu semua pada formulir dan tampaknya ketika saya dock strip menu ke atas, strip status ke bawah, dan mengisi panel, panel tidak mengisi ruang di antara dua strip kecuali itu adalah saudara pertama (di bagian atas jendela Outline Dokumen di atas dua strip). Pindahkan panel ke bawah (ke arah "terakhir") di atas strip. Jadi haruskah Dock = Fill control menjadi saudara pertama dalam urutan? Apakah saya salah membaca ini? Saya menggunakan 3.5 (2008). Apakah ini berubah?
jrsconfitto
53
tl; dr; Klik kanan pada panel dengan Dock = Fill dan klik 'Bring to Front'.
kristianp
20
+1 untuk jendela Outline Dokumen. Tidak pernah tahu ini ada, namun sangat berguna.
gligoran
2
Bagaimana saya bisa melakukan ini secara terprogram? Maksud saya, saya menambahkan kontrol secara dinamis sehingga saya tidak dapat menggunakan perancang untuk melakukan ini.
Camilo Martin
2
@ Camilo: Jika Anda menambahkan kontrol secara dinamis, Anda harus menambahkannya sesuai urutan yang Anda inginkan.
JacquesB
110

Klik kanan pada panel dengan Dock = Fill dan klik 'Bring to Front'.

Ini membuat kontrol ini dibuat terakhir, yang memperhitungkan pengaturan Dock pada kontrol lain dalam wadah yang sama.

Jeff Cuscutis
sumber
1
Sederhana, Godsend, ini benar-benar membuatku
jengkel
Masuk akal begitu Anda memikirkannya.
Gary Kindel
7

Opsi lain yang berpotensi lebih bersih adalah dengan menggunakan kontrol TableLayout. Siapkan satu baris dari ketinggian yang diinginkan untuk dock atas Anda, dan baris lain untuk mengisi 100% untuk bottom Anda. Atur kedua panel di dalam untuk Isi, dan Anda selesai.

(TableLayout memang membutuhkan waktu untuk membiasakan diri.)

John Rudy
sumber
1
TableLayout juga lebih lambat daripada conterol docking untuk kinerja tata letak, terutama jika Anda memiliki kontrol pengguna bersarang yang menggunakan TableLayout. Namun, itu menghasilkan tata letak yang bagus untuk memastikan.
Nick
1
Apakah kinerja ini mencapai sesuatu yang akan dilihat pengguna rata-rata dalam kasus sederhana dua panel, seperti dijelaskan di atas? Atau apakah itu sesuatu yang mereka perhatikan ketika Anda memiliki lusinan UC, semua dengan tata letak, semua dalam satu tata letak? (Ironisnya, aplikasi yang sedang saya kerjakan adalah seperti itu, dan kinerjanya tampak OK ...)
John Rudy
TableLayout cukup ringan. Anda tidak akan melihat masalah kinerja jika Anda hanya meletakkan beberapa kontrol.
Tim
7

Saya memiliki masalah yang sama dan saya berhasil menyelesaikannya.
Jika Anda memiliki wadah dengan DockStyle.Fillyang lain juga harus memiliki DockStyle tetapi Atas atau apa pun yang Anda inginkan.
Yang penting adalah menambahkan kontrol dengan yang DockStyle.Fillpertama di Kontrol kemudian yang lain.

Contoh:

ComboBox cb = new ComboBox();
cb.Dock =  DockStyle.Top;

GridView gv = new GridView();
gv.Dock =  DockStyle.Fill;

Controls.Add(gv); // this is okay
Controls.Add(cb);

tetapi jika kita mengutamakan cb

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.
Pandichie Anton-Valentin
sumber
2

Jika Anda tidak ingin mengubah urutan elemen di dalam kode, Anda dapat menggunakan metode Container.Controls.SetChildIndex () dengan Container menjadi misalnya Formulir, Panel dll. Anda ingin menambahkan kontrol Anda.

Contoh:

     //Container ------------------------------------
     Panel Container = new Panel();

     //Top-Docked Element ---------------------------
     ButtonArea = new FlowLayoutPanel();
     Container.Controls.Add(ButtonArea);
     Container.Controls.SetChildIndex(ButtonArea, 1);
     ButtonArea.Dock = DockStyle.Top;

     //Fill-Docked Element --------------------------
     box = new RichTextBox();
     Container.Controls.Add(box);
     Container.Controls.SetChildIndex(box, 0); //setting this to 0 does the trick
     box.Dock = DockStyle.Fill;
Marcus
sumber
1

JacquesB memiliki ide dengan garis besar dokumen tetapi hierarki tidak menyelesaikan masalah saya. Kontrol saya tidak dalam gaya hierarkis, mereka hanya terdaftar dengan orang tua yang sama.

Saya belajar bahwa jika Anda mengubah urutannya, itu akan memperbaiki tampilan yang Anda inginkan.

Kontrol di bagian bawah daftar akan tumpang tindih kontrol di atasnya di jendela Outline Dokumen. Dalam kasus Anda, Anda akan memastikan bahwa panel pertama di bawah panel kedua dan seterusnya.

RANONO
sumber
0

Ini adalah trik yang bekerja untuk saya ..

Tempatkan item Top dan dok atas.

Tempatkan Splitter, dan juga letakkan di bagian atas, kemudian nonaktifkan (kecuali jika Anda ingin mengubah ukuran atas).

Kemudian Tempatkan objek Isi dan atur Docking ke Isi. Objek akan tetap di bawah splitter.

John Christman
sumber
0

Saya mengalami masalah yang sama. Milik saya adalah dengan menambahkan kontrol baru / kustom di bawah strip menu selama waktu berjalan. Masalahnya adalah kontrol ketika merapat, memutuskan untuk merapat dari atas formulir dan sepenuhnya mengabaikan strip menu sepenuhnya, sangat menjengkelkan jika Anda bertanya kepada saya. Karena ini harus dilakukan secara dinamis dengan kode dan tidak selama mode desain ini menjadi sangat frustasi. Cara paling sederhana yang saya temukan adalah membuat panel selama mode desain dan merapat di bawah strip menu. Dari sana Anda bisa menambahkan / menghapus kontrol ke panel dan Anda dapat merapatnya selama waktu berjalan. Tidak perlu dipusingkan dengan semua kontrol Anda pada formulir Anda yang tidak benar-benar perlu diubah, terlalu banyak pekerjaan tergantung pada apa yang benar-benar perlu Anda lakukan.

object.dock = Fill
Panel.Controls.Add(object)
Robert S.
sumber
0

Saya tahu ini adalah pos lama tetapi saya menemukan sesuatu yang bermanfaat. Untuk menyesuaikan urutan kontrol saudara secara terprogram untuk kontrol yang dibuat secara dinamis, Anda dapat melakukan sesuatu seperti:

parentForm.Controls.SetChildIndex (myPanel, 0) 

Dalam kasus saya, saya melakukan ini untuk memindahkan panel Dock / Fill menjadi kontrol pertama dalam formulir saya sehingga tidak akan tumpang tindih dengan kontrol docked lain yang diatur ke Dock / Top (strip menu).

DrLechter
sumber