Panel.Dock กรอกข้อมูลโดยไม่สนใจการตั้งค่า Panel.Dock อื่น ๆ


154

ถ้าคุณสร้างพาเนลบนแบบฟอร์มและตั้งค่าเป็น Dock = Top แล้วปล่อยพาเนลอื่นแล้วตั้งค่า Dock = Fill มันอาจเติมทั้งฟอร์มโดยไม่สนใจพาเนลแรก การเปลี่ยนลำดับแท็บไม่ทำอะไรเลย

คำตอบ:


335

เลย์เอาต์เค้าโครงขึ้นอยู่กับลำดับของการควบคุมพี่น้อง การควบคุมที่มีการเชื่อมต่อปุ่ม "ขึ้น" เพื่อให้การควบคุมที่ผ่านมาในคอลเลกชันที่เชื่อมต่อครั้งแรก การควบคุมที่เชื่อมต่อจะคำนึงถึงเค้าโครงของพี่น้องที่เชื่อมต่อก่อนหน้านี้เท่านั้น ดังนั้นการควบคุมด้วย Dock = Fill ควรเป็นอันดับแรก (บนสุด) ในลำดับพี่น้องถ้าคุณต้องการให้มันใช้การควบคุมแบบเชื่อมต่ออื่น ๆ เข้าบัญชี หากไม่ใช่ตัวควบคุมแรกตัวควบคุมก่อนหน้านี้จะทับซ้อนกัน

สิ่งนี้อาจทำให้เกิดความสับสนเนื่องจากลำดับพี่น้องไม่จำเป็นต้องเหมือนกันกับลำดับภาพและลำดับพี่น้องไม่ชัดเจนเสมอจากมุมมองการออกแบบ

เอกสารร่างหน้าต่าง (ดู -> อื่น ๆ ของ Windows -> เอกสารร่าง) ให้มีประโยชน์ต้นไม้มุมมองมากกว่าลำดับชั้นของการควบคุมและการสั่งซื้อและช่วยให้คุณสามารถเปลี่ยนลำดับพี่น้องของการควบคุม

นอกจากนี้คุณยังสามารถเปลี่ยนลำดับพี่น้องโดยตรงในผู้ออกแบบโดยเมนูบริบท -> นำมาด้านหน้า / ส่งกลับซึ่งย้ายการควบคุมไปเป็นพี่น้องคนแรกหรือคนสุดท้าย เลเบลเมนูเหล่านี้อาจค่อนข้างสับสนเนื่องจากเอฟเฟกต์จริงขึ้นอยู่กับโมเดลเลย์เอาต์

ด้วยการควบคุมตำแหน่งคงที่ตำแหน่ง 2D จะเป็นอิสระจากลำดับพี่น้อง แต่เมื่อตัวควบคุมซ้อนทับกันตัวควบคุมที่เร็วที่สุดในลำดับจะเป็น "ด้านบน" ซึ่งซ่อนส่วนหนึ่งของพี่น้องในลำดับถัดไป ในบริบทนี้นำมาไว้ข้างหน้า / ส่งไปกลับทำให้รู้สึก

ภายในแผงควบคุมโฟลว์หรือเลย์เอาต์ลำดับการสร้างจะกำหนดลำดับภาพของตัวควบคุม ไม่มีการควบคุมที่ทับซ้อนกัน ดังนั้นนำมาไว้ข้างหน้า / ส่งไปด้านหลังจริงๆหมายถึงทำครั้งแรกหรือครั้งสุดท้ายในลำดับของการควบคุม

เมื่อวางเลย์เอาต์เอาไว้ด้านหน้า / ส่งไปด้านหลังอาจทำให้สับสนมากขึ้นเนื่องจากมันเป็นตัวกำหนดว่าจะคำนวณลำดับการเทียบท่าอย่างไรดังนั้น "นำมาไว้ข้างหน้า" บนตัวควบคุมที่เติมช่องจะวางตัวควบคุมไว้ตรงกลางของพาเรนต์ โดยคำนึงถึงการควบคุมที่เทียบชิดขอบทั้งหมด


1
ฉันมีแผงแถบสถานะและแถบเมนูทั้งหมดในแบบฟอร์มและดูเหมือนว่าเมื่อฉันเชื่อมต่อแถบเมนูไปที่ด้านบนแถบสถานะไปด้านล่างและเติมแผงแผงไม่เติมช่องว่างในระหว่าง สองแถบยกเว้นว่าเป็นพี่น้องคนแรก (ที่ด้านบนของหน้าต่างเอกสารเค้าร่างด้านบนของทั้งสองแถบ) เลื่อนแผงลง (ไปยัง "สุดท้าย") ครอบคลุมเหนือแถบ ดังนั้น Dock = Fill control ควรเป็นพี่น้องคนแรกในการสั่งซื้อหรือไม่ ฉันอ่านผิดหรือเปล่า ฉันใช้ 3.5 (2008) การเปลี่ยนแปลงนี้หรือไม่?
jrsconfitto

53
TL; DR; คลิกขวาที่แผงควบคุมพร้อม Dock = Fill แล้วคลิก 'นำมาไว้ด้านหน้า'
kristianp

20
+1 สำหรับหน้าต่างเค้าร่างเอกสาร ไม่เคยรู้เรื่องนี้มาก่อน แต่มันมีประโยชน์มาก
gligoran

2
ฉันจะทำสิ่งนี้โดยใช้โปรแกรมได้อย่างไร ฉันหมายถึงฉันกำลังเพิ่มการควบคุมแบบไดนามิกดังนั้นฉันไม่สามารถใช้นักออกแบบเพื่อทำสิ่งนี้
Camilo Martin

2
@Camilo: หากคุณเพิ่มการควบคุมแบบไดนามิกคุณควรเพิ่มการควบคุมตามลำดับที่คุณต้องการ
JacquesB

110

คลิกขวาที่แผงควบคุมพร้อม Dock = Fill แล้วคลิก 'นำมาไว้ด้านหน้า'

สิ่งนี้ทำให้การควบคุมนี้ถูกสร้างขึ้นล่าสุดซึ่งคำนึงถึงการตั้งค่า Dock ในส่วนควบคุมอื่น ๆ


1
ง่ายสวรรค์มานี้น่ารำคาญจริง ๆ ฉัน
smirkingman

ทำให้รู้สึกเมื่อคุณคิดเกี่ยวกับมัน
Gary Kindel

7

ตัวเลือกอื่นที่อาจสะอาดกว่าคือการใช้การควบคุม TableLayout ตั้งค่าความสูงที่ต้องการหนึ่งแถวสำหรับแท่นด้านบนของคุณและอีกแถวหนึ่งเพื่อเติมเต็ม 100% สำหรับด้านล่างของคุณ ตั้งค่าพาเนลทั้งสองเป็น Fill และคุณก็ทำเสร็จแล้ว

(TableLayout ใช้เวลาทำความคุ้นเคย)


1
TableLayout ก็ช้ากว่าการเชื่อมต่อ Conterols สำหรับประสิทธิภาพการจัดวางโดยเฉพาะถ้าคุณมี usercontrols ซ้อนกันซึ่งใช้ TableLayout อย่างไรก็ตามมันจะให้รูปแบบที่ดีเพื่อให้แน่ใจ
นิค

1
ประสิทธิภาพนี้กระทบกับสิ่งที่ผู้ใช้ทั่วไปจะเห็นในสองกรณีอย่างง่าย ๆ หรือไม่ตามที่อธิบายไว้ข้างต้น หรือเป็นสิ่งที่พวกเขาสังเกตเห็นเมื่อคุณมี UC หลายสิบแบบด้วยเลย์เอาต์ทั้งหมดในหนึ่งเลย์เอาต์ (แดกดัน app ที่ผมทำงานอยู่ในปัจจุบันเป็นเช่นนั้นและประสิทธิภาพการทำงานดูเหมือนว่าตกลง ... )
จอห์นรูดี้

TableLayout นั้นค่อนข้างเบา คุณจะไม่เห็นปัญหาด้านประสิทธิภาพหากคุณเพิ่งวางแผงควบคุมบางส่วน
ทิม

7

ฉันมีปัญหาเดียวกันและฉันจัดการเพื่อแก้ไขมัน
หากคุณมีตู้คอนเทนเนอร์กับ DockStyle.Fillที่อื่น ๆ ก็ควรมี DockStyle แต่ Top หรืออะไรก็ตามที่คุณต้องการ
สิ่งสำคัญคือการเพิ่มการควบคุมด้วยสิ่ง DockStyle.Fillแรกในการควบคุมแล้วคนอื่น ๆ

ตัวอย่าง:

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

แต่ถ้าเราใส่ cb ก่อน

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

2

หากคุณไม่ต้องการเปลี่ยนลำดับขององค์ประกอบภายในรหัสคุณสามารถใช้เมธอด Container.Controls.SetChildIndex () โดยที่ Container เป็นแบบฟอร์มเช่นพาเนล ฯลฯ ที่คุณต้องการเพิ่มการควบคุมของคุณ

ตัวอย่าง:

     //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 มีความคิดกับเค้าโครงเอกสาร แต่ลำดับชั้นไม่สามารถแก้ปัญหาของฉันได้ การควบคุมของฉันไม่ได้อยู่ในรูปแบบลำดับชั้นพวกเขาเพิ่งจะถูกแสดงพร้อมกับพาเรนต์เดียวกัน

ฉันเรียนรู้ว่าถ้าคุณเปลี่ยนลำดับมันจะแก้ไขวิธีที่คุณต้องการให้มันดู

ตัวควบคุมที่ด้านล่างของรายการจะทับซ้อนตัวควบคุมที่ด้านบนของมันในหน้าต่างเค้าร่างเอกสาร ในกรณีของคุณคุณจะต้องแน่ใจว่าแผงแรกอยู่ใต้แผงที่สองเป็นต้น


0

นี่คือเคล็ดลับที่เหมาะกับฉัน ..

วางไอเท็มยอดนิยมและวางไว้ด้านบน

วางตัวแยกสัญญาณและวางไว้ด้านบนจากนั้นตั้งค่าตัวปิดการใช้งาน (เว้นแต่คุณต้องการปรับขนาดด้านบน)

จากนั้นวางวัตถุเติมแล้วตั้งค่าเชื่อมต่อเป็นเติม วัตถุจะอยู่ด้านล่างตัวแยกสัญญาณ


0

ฉันพบปัญหาเดียวกัน ของฉันเคยมีการเพิ่มการควบคุมใหม่ / กำหนดเองด้านล่างแถบเมนูในช่วงเวลาทำงาน ปัญหาคือการควบคุมเมื่อเทียบท่าตัดสินใจที่จะเทียบท่าจากด้านบนของแบบฟอร์มและละเว้นแถบเมนูอย่างสิ้นเชิงโดยสิ้นเชิงน่ารำคาญมากถ้าคุณถามฉัน เนื่องจากจะต้องทำแบบไดนามิกด้วยรหัสและไม่ได้อยู่ในโหมดการออกแบบสิ่งนี้กลายเป็นที่น่าผิดหวังอย่างมาก วิธีที่ง่ายที่สุดที่ฉันพบคือการสร้างพาเนลระหว่างโหมดการออกแบบและเชื่อมต่อใต้แถบเมนู จากตรงนั้นคุณสามารถเพิ่ม / ลบการควบคุมไปยังพาเนลและคุณสามารถเชื่อมต่อได้ในช่วงเวลาทำงาน ไม่จำเป็นต้องยุ่งกับการควบคุมทั้งหมดของคุณในแบบฟอร์มของคุณที่ไม่จำเป็นต้องเปลี่ยนแปลงจริงๆทำงานมากเกินไปขึ้นอยู่กับสิ่งที่คุณต้องทำจริงๆ

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

0

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันค้นพบสิ่งที่มีประโยชน์ หากต้องการปรับลำดับการควบคุมพี่น้องโดยทางโปรแกรมสำหรับการควบคุมที่สร้างขึ้นแบบไดนามิกคุณสามารถทำสิ่งต่อไปนี้

parentForm.Controls.SetChildIndex (myPanel, 0) 

ในกรณีของฉันฉันทำสิ่งนี้เพื่อย้ายแผงควบคุม Dock / Fill เพื่อเป็นตัวควบคุมแรกในแบบฟอร์มของฉันเพื่อที่จะไม่ทับซ้อนกับชุดควบคุมเชื่อมต่ออื่นที่ตั้งไว้ที่ Dock / Top (แถบเมนู)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.