ถ้าคุณสร้างพาเนลบนแบบฟอร์มและตั้งค่าเป็น Dock = Top แล้วปล่อยพาเนลอื่นแล้วตั้งค่า Dock = Fill มันอาจเติมทั้งฟอร์มโดยไม่สนใจพาเนลแรก การเปลี่ยนลำดับแท็บไม่ทำอะไรเลย
ถ้าคุณสร้างพาเนลบนแบบฟอร์มและตั้งค่าเป็น Dock = Top แล้วปล่อยพาเนลอื่นแล้วตั้งค่า Dock = Fill มันอาจเติมทั้งฟอร์มโดยไม่สนใจพาเนลแรก การเปลี่ยนลำดับแท็บไม่ทำอะไรเลย
คำตอบ:
เลย์เอาต์เค้าโครงขึ้นอยู่กับลำดับของการควบคุมพี่น้อง การควบคุมที่มีการเชื่อมต่อปุ่ม "ขึ้น" เพื่อให้การควบคุมที่ผ่านมาในคอลเลกชันที่เชื่อมต่อครั้งแรก การควบคุมที่เชื่อมต่อจะคำนึงถึงเค้าโครงของพี่น้องที่เชื่อมต่อก่อนหน้านี้เท่านั้น ดังนั้นการควบคุมด้วย Dock = Fill ควรเป็นอันดับแรก (บนสุด) ในลำดับพี่น้องถ้าคุณต้องการให้มันใช้การควบคุมแบบเชื่อมต่ออื่น ๆ เข้าบัญชี หากไม่ใช่ตัวควบคุมแรกตัวควบคุมก่อนหน้านี้จะทับซ้อนกัน
สิ่งนี้อาจทำให้เกิดความสับสนเนื่องจากลำดับพี่น้องไม่จำเป็นต้องเหมือนกันกับลำดับภาพและลำดับพี่น้องไม่ชัดเจนเสมอจากมุมมองการออกแบบ
เอกสารร่างหน้าต่าง (ดู -> อื่น ๆ ของ Windows -> เอกสารร่าง) ให้มีประโยชน์ต้นไม้มุมมองมากกว่าลำดับชั้นของการควบคุมและการสั่งซื้อและช่วยให้คุณสามารถเปลี่ยนลำดับพี่น้องของการควบคุม
นอกจากนี้คุณยังสามารถเปลี่ยนลำดับพี่น้องโดยตรงในผู้ออกแบบโดยเมนูบริบท -> นำมาด้านหน้า / ส่งกลับซึ่งย้ายการควบคุมไปเป็นพี่น้องคนแรกหรือคนสุดท้าย เลเบลเมนูเหล่านี้อาจค่อนข้างสับสนเนื่องจากเอฟเฟกต์จริงขึ้นอยู่กับโมเดลเลย์เอาต์
ด้วยการควบคุมตำแหน่งคงที่ตำแหน่ง 2D จะเป็นอิสระจากลำดับพี่น้อง แต่เมื่อตัวควบคุมซ้อนทับกันตัวควบคุมที่เร็วที่สุดในลำดับจะเป็น "ด้านบน" ซึ่งซ่อนส่วนหนึ่งของพี่น้องในลำดับถัดไป ในบริบทนี้นำมาไว้ข้างหน้า / ส่งไปกลับทำให้รู้สึก
ภายในแผงควบคุมโฟลว์หรือเลย์เอาต์ลำดับการสร้างจะกำหนดลำดับภาพของตัวควบคุม ไม่มีการควบคุมที่ทับซ้อนกัน ดังนั้นนำมาไว้ข้างหน้า / ส่งไปด้านหลังจริงๆหมายถึงทำครั้งแรกหรือครั้งสุดท้ายในลำดับของการควบคุม
เมื่อวางเลย์เอาต์เอาไว้ด้านหน้า / ส่งไปด้านหลังอาจทำให้สับสนมากขึ้นเนื่องจากมันเป็นตัวกำหนดว่าจะคำนวณลำดับการเทียบท่าอย่างไรดังนั้น "นำมาไว้ข้างหน้า" บนตัวควบคุมที่เติมช่องจะวางตัวควบคุมไว้ตรงกลางของพาเรนต์ โดยคำนึงถึงการควบคุมที่เทียบชิดขอบทั้งหมด
คลิกขวาที่แผงควบคุมพร้อม Dock = Fill แล้วคลิก 'นำมาไว้ด้านหน้า'
สิ่งนี้ทำให้การควบคุมนี้ถูกสร้างขึ้นล่าสุดซึ่งคำนึงถึงการตั้งค่า Dock ในส่วนควบคุมอื่น ๆ
ตัวเลือกอื่นที่อาจสะอาดกว่าคือการใช้การควบคุม TableLayout ตั้งค่าความสูงที่ต้องการหนึ่งแถวสำหรับแท่นด้านบนของคุณและอีกแถวหนึ่งเพื่อเติมเต็ม 100% สำหรับด้านล่างของคุณ ตั้งค่าพาเนลทั้งสองเป็น Fill และคุณก็ทำเสร็จแล้ว
(TableLayout ใช้เวลาทำความคุ้นเคย)
ฉันมีปัญหาเดียวกันและฉันจัดการเพื่อแก้ไขมัน
หากคุณมีตู้คอนเทนเนอร์กับ 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.
หากคุณไม่ต้องการเปลี่ยนลำดับขององค์ประกอบภายในรหัสคุณสามารถใช้เมธอด 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;
JacquesB มีความคิดกับเค้าโครงเอกสาร แต่ลำดับชั้นไม่สามารถแก้ปัญหาของฉันได้ การควบคุมของฉันไม่ได้อยู่ในรูปแบบลำดับชั้นพวกเขาเพิ่งจะถูกแสดงพร้อมกับพาเรนต์เดียวกัน
ฉันเรียนรู้ว่าถ้าคุณเปลี่ยนลำดับมันจะแก้ไขวิธีที่คุณต้องการให้มันดู
ตัวควบคุมที่ด้านล่างของรายการจะทับซ้อนตัวควบคุมที่ด้านบนของมันในหน้าต่างเค้าร่างเอกสาร ในกรณีของคุณคุณจะต้องแน่ใจว่าแผงแรกอยู่ใต้แผงที่สองเป็นต้น
นี่คือเคล็ดลับที่เหมาะกับฉัน ..
วางไอเท็มยอดนิยมและวางไว้ด้านบน
วางตัวแยกสัญญาณและวางไว้ด้านบนจากนั้นตั้งค่าตัวปิดการใช้งาน (เว้นแต่คุณต้องการปรับขนาดด้านบน)
จากนั้นวางวัตถุเติมแล้วตั้งค่าเชื่อมต่อเป็นเติม วัตถุจะอยู่ด้านล่างตัวแยกสัญญาณ
ฉันพบปัญหาเดียวกัน ของฉันเคยมีการเพิ่มการควบคุมใหม่ / กำหนดเองด้านล่างแถบเมนูในช่วงเวลาทำงาน ปัญหาคือการควบคุมเมื่อเทียบท่าตัดสินใจที่จะเทียบท่าจากด้านบนของแบบฟอร์มและละเว้นแถบเมนูอย่างสิ้นเชิงโดยสิ้นเชิงน่ารำคาญมากถ้าคุณถามฉัน เนื่องจากจะต้องทำแบบไดนามิกด้วยรหัสและไม่ได้อยู่ในโหมดการออกแบบสิ่งนี้กลายเป็นที่น่าผิดหวังอย่างมาก วิธีที่ง่ายที่สุดที่ฉันพบคือการสร้างพาเนลระหว่างโหมดการออกแบบและเชื่อมต่อใต้แถบเมนู จากตรงนั้นคุณสามารถเพิ่ม / ลบการควบคุมไปยังพาเนลและคุณสามารถเชื่อมต่อได้ในช่วงเวลาทำงาน ไม่จำเป็นต้องยุ่งกับการควบคุมทั้งหมดของคุณในแบบฟอร์มของคุณที่ไม่จำเป็นต้องเปลี่ยนแปลงจริงๆทำงานมากเกินไปขึ้นอยู่กับสิ่งที่คุณต้องทำจริงๆ
object.dock = Fill
Panel.Controls.Add(object)
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันค้นพบสิ่งที่มีประโยชน์ หากต้องการปรับลำดับการควบคุมพี่น้องโดยทางโปรแกรมสำหรับการควบคุมที่สร้างขึ้นแบบไดนามิกคุณสามารถทำสิ่งต่อไปนี้
parentForm.Controls.SetChildIndex (myPanel, 0)
ในกรณีของฉันฉันทำสิ่งนี้เพื่อย้ายแผงควบคุม Dock / Fill เพื่อเป็นตัวควบคุมแรกในแบบฟอร์มของฉันเพื่อที่จะไม่ทับซ้อนกับชุดควบคุมเชื่อมต่ออื่นที่ตั้งไว้ที่ Dock / Top (แถบเมนู)