Panel.Dock Diğer Panel.Dock ayarlarını yok sayarak doldurun


154

Bir form üzerinde bir panel oluşturup Dock = Üst olarak ayarlayıp başka bir paneli bırakıp Dock = Dolgu ayarını yaparsanız, ilk paneli yok sayarak tüm formu doldurabilir. Sekme sırasını değiştirmek hiçbir şey yapmaz.

Yanıtlar:


335

Yerleştirme düzeni , kardeş kontrollerinin sırasına bağlıdır . Kontroller "düğme yukarı" kenetlenir, böylece koleksiyondaki son kontrol önce kenetlenir . Yerleşik bir denetim yalnızca önceden yerleştirilmiş kardeşlerin düzenini dikkate alır. Bu nedenle, diğer sabitlenmiş denetimleri dikkate almasını istiyorsanız, Dock = Dolgu ile denetim, kardeş sırayla ilk (üstte) olmalıdır. İlk kontrol değilse, önceki kontroller üst üste binecektir.

Bu, kafa karıştırıcı olabilir, çünkü kardeş sırası görsel siparişle aynı değildir ve kardeş sırası her zaman tasarım görünümünden anlaşılamaz.

Belge anahat penceresi (Görünüm -> Diğer Pencereler -> Belge anahat) kontrol hiyerarşisi ve düzeni üzerinde yararlı bir ağaç görünümü verir ve kontrollerin kardeş sırasını değiştirmek için izin verir.

Aynı zamanda bağlam menüsünü kullanarak doğrudan tasarımda kardeş sırasını değiştirebilirsiniz -> Öne getir / Arkaya gönder, bu da kontrolü kardeşlerin ilk ya da sonuncusu olacak şekilde hareket ettirir. Gerçek menü mizanpaj modeline bağlı olduğundan bu menü etiketleri biraz kafa karıştırıcı olabilir.

Sabit konumlu kontrollerde, 2B konum kardeş sırasından bağımsızdır, ancak kontroller çakıştığında, siparişteki en erken kontrol "üstte" olur ve kardeşlerin bir kısmını daha sonra sırayla gizler. Bu bağlamda öne getir / Arkaya gönder mantıklı.

Akış veya tablo düzeni panellerinin içinde, oluşturma sırası denetimlerin görsel sırasını belirler. Çakışan kontrol yok. Yani öne getir / arkaya gönder gerçekten kontroller sırasında ilk veya son yapmak anlamına gelir.

O kadar kontrolü yerleştirecektir bir dolgu-demirledi kumanda üzerindeki "öne getir", yerleştirme hesaplandığı sipariş belirler beri demirledi düzende, önden arkaya doğru getirmek / gönderme daha kafa karıştırıcı olabilir ortasında ebeveynin , kenara yerleştirilmiş tüm kontrolleri dikkate alarak.


1
bir formda bir panel, durum şeridi ve menü şeridi var ve menü şeridini üste yerleştirdiğimde, durum şeridini aşağıya yerleştirip paneli doldurduğumda, panelin arasındaki boşluğu doldurmadığı anlaşılıyor. ilk kardeş olmadıkça iki şerit (iki şeridin üzerindeki Belge Anahattı penceresinin üstünde). Paneli aşağı ("son" doğru) hareket ettirmek şeritlerin üzerini örter. Peki Dock = Dolgu kontrolü aslında siparişteki ilk kardeş olmalı mı? Bunu yanlış mı okuyorum? 3.5 (2008) kullanıyorum. Bu değişti mi?
jrsconfitto

53
tl; dr; Dock = Fill ile panele sağ tıklayın ve 'Öne Getir'e tıklayın.
kristianp

20
Anahat penceresi için +1. Bunun var olduğunu hiç bilmiyordum, ama çok kullanışlı.
gligoran

2
Bunu programlı olarak nasıl yapabilirim? Demek istediğim, kontrolleri dinamik olarak ekliyorum, böylece bunu yapmak için tasarımcıyı kullanamıyorum.
Camilo Martin

2
@Camilo: Kontrolleri dinamik olarak eklerseniz, bunları istediğiniz sırayla eklemelisiniz.
JacquesB

110

Dock = Fill ile panele sağ tıklayın ve 'Öne Getir'e tıklayın.

Bu, bu denetimin en son oluşturulmasını sağlar; bu, aynı kaptaki diğer denetimlerdeki Dock ayarlarını dikkate alır.


1
Basit, Godsend, bu gerçekten beni sinirlendiriyordu
smirkingman

Bir kez düşündüğünüzde mantıklı.
Gary Kindel

7

Bir başka, potansiyel olarak daha temiz seçenek TableLayout kontrolünü kullanmaktır. Üst rıhtımınız için istenen yükseklikte bir satır ve altınız için% 100'ü dolduracak başka bir satır ayarlayın. İçindeki her iki paneli de Doldur olarak ayarlayın, işiniz bitti.

(TableLayout alışmaya biraz zaman ayırıyor.)


1
TableLayout, özellikle TableLayout kullanan iç içe kullanıcı denetimleriniz varsa, düzen performansı için conterolleri yerleştirmekten daha yavaştır. Ancak, emin olmak için güzel bir düzen verir.
Nick

1
Bu performans, ortalama bir kullanıcının yukarıda açıklanan iki panelden oluşan basit bir durumda göreceği bir şeye mi çarpıyor? Yoksa hepsi düzene sahip düzinelerce UC'ye sahip olduklarında fark ettikleri bir şey mi? (İronik olarak, şu anda üzerinde çalıştığım uygulama böyle ve performans iyi görünüyor ...)
John Rudy

TableLayout oldukça hafiftir. Sadece birkaç kontrol düzenlerseniz performans sorunlarını görmezsiniz.
Tim

7

Aynı sorunu yaşadım ve çözmeyi başardım. Diğerleri
ile bir konteyner DockStyle.Fillvarsa DockStyle ama Top ya da ne istersen olmalı.
Önemli olan, DockStyle.Fillönce Control'lerde, sonra diğerlerinde denetimi eklemek .

Misal:

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);

ama önce cb koyarsak

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.

2

Kod içindeki öğelerin sırasını değiştirmek istemiyorsanız, Container.Controls.SetChildIndex () yöntemini kullanarak örneğin Form, Panel vb.

Misal:

     //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;

1

JacquesB'in fikri belge taslağı ile ilgili vardı ama hiyerarşi sorunumu çözmedi. Denetimlerim hiyerarşik bir tarzda değildi ve aynı ebeveynle listelendiler.

Siparişi değiştirirseniz, görünmesini istediğiniz şekilde düzeltileceğini öğrendim.

Listenin altındaki denetimler, Belge Anahatları penceresindeki üstündeki denetimlerle çakışacaktır. Sizin durumunuzda, ilk panelin ikinci panelin altında olduğundan emin olursunuz.


0

İşte benim için işe yarayan bir numara ...

Üst öğeyi yerleştirin ve üste yerleştirin.

Bir Bölücü yerleştirin ve üstüne yerleştirin, ardından devre dışı bırakın (üstünü yeniden boyutlandırmak istemiyorsanız).

Ardından Fill nesnesini yerleştirin ve Docking'i Dolgu olarak ayarlayın. Nesne ayırıcının altında kalacaktır.


0

Ben de aynı sorunla karşılaştım. Mine, çalışma süresi boyunca menü şeridinin altına yeni / özel kontroller ekleyerek oldu. Sorun kenetlendiğinde, formun üstünden kenetlenmeye karar verdi ve menü şeridini tamamen görmezden geldi, bana sorarsanız çok sinir bozucu kontroller oldu. Bu, tasarım modunda değil, kodla dinamik olarak yapılması gerektiğinden, bu son derece sinir bozucu oldu. Bulduğum en basit yol, tasarım modu sırasında bir panel oluşturmak ve menü şeridinin altına yerleştirmektir. Oradan kontrolleri panele ekleyebilir / çıkarabilir ve çalışma süresi boyunca yerleştirebilirsiniz. Formunuzda gerçekten değişmesi gerekmeyen tüm kontrollerinizle uğraşmanıza gerek yok, gerçekten ne yapmanız gerektiğine bağlı olarak çok fazla çalışma.

object.dock = Fill
Panel.Controls.Add(object)

0

Bunun eski bir yazı olduğunu biliyorum ama yararlı bir şey keşfettim. Dinamik olarak oluşturulan kontrol (ler) için kardeş kontrol sırasını programlı olarak ayarlamak için aşağıdakileri yapabilirsiniz:

parentForm.Controls.SetChildIndex (myPanel, 0) 

Benim durumumda, bunu bir Dock / Fill panelini formumdaki ilk kontrol olarak taşımak için yaptım, böylece Dock / Top (bir menü şeridi) olarak ayarlanmış başka bir yerleştirilmiş kontrol ile çakışmayacaktı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.