ฉันต้องการวิธีแก้ปัญหาสำหรับพฤติกรรมที่ไม่ถูกต้องสำหรับแผงในแบบฟอร์ม Windows ของหุ้นที่สืบทอดมา ฉันมีปุ่มสองสามปุ่มที่ควรยึดไว้ที่มุมขวาล่างของแผง แต่ตำแหน่งของปุ่มเหล่านั้นแตกต่างกันไปในลักษณะที่ฉันไม่สามารถคาดเดาได้จากรูปแบบที่สืบทอดมา ฉันได้ลองใช้คุณสมบัติ Dock และ Anchor ผสมผสานกันหลายอย่าง แต่จนถึงขณะนี้ยังไม่มีสิ่งใดที่ทำให้ปุ่มต่างๆ ปรากฏขึ้นในตำแหน่งที่ควรจะเป็น การควบคุมทั้งหมดถูกทำเครื่องหมายว่าได้รับการป้องกัน
พฤติกรรมนั้นถูกต้องในรูปแบบ ฐาน ลักษณะการทำงานที่ไม่ถูกต้องเกิดขึ้นเฉพาะในแบบฟอร์ม สืบทอด เท่านั้น ปุ่ม ไม่ได้ ยึดกับแผงหลัก
ถ้าฉันยึดปุ่มไว้ที่ด้านซ้ายบน ฉันสามารถปรับขนาดแบบฟอร์มที่สืบทอดมาให้ใหญ่ขึ้นได้ และในที่สุดปุ่มต่างๆ ก็จะถูกเปิดออก ซึ่งอยู่นอกขนาดแบบฟอร์มพื้นฐาน หากฉันยึดปุ่มไว้ที่ด้านล่างขวา ฉันจะไม่สามารถทำให้รูปทรงใหญ่พอที่จะเปิดปุ่มออกได้
ฉันได้ลองสร้างพาเนลแบบกำหนดเองที่สืบทอดพาเนลและ GroupBox แต่สิ่งเหล่านี้ไม่ได้ทำงานแตกต่างออกไป ฉันโชคดีเหมือนกันกับการกดปุ่มบนแบบฟอร์มโดยตรงโดยไม่มีคอนเทนเนอร์
สิ่งที่ฉันต้องการ: แผงที่ด้านล่างของแบบฟอร์มที่ปรับขนาดได้โดยมีปุ่มของฉันอยู่ที่มุมขวาล่าง ส่วนที่เหลือของแบบฟอร์มควรเป็นพื้นที่ที่ปรับขนาดได้สำหรับ DataGridView (ฉันได้แก้ไขปัญหาการสืบทอดและการเทียบท่าแล้วด้วยสิ่งนี้ >:-/) ปุ่มควรอยู่ที่มุมขวาล่างเสมอโดยไม่คำนึงถึงขนาดหน้าต่าง ฉันไม่ต้องการปรับขนาดปุ่ม
ถ้าฉันต้องปรับขนาดส่วนควบคุมด้วยตัวเอง ฉันก็เต็มใจที่จะทำเช่นนั้น แต่ถ้ากรอบการทำงานถูกต้อง และฉันแค่ต้องเรียนรู้วิธีใช้อย่างถูกต้อง ฉันคงอยากได้การศึกษามากกว่า
ฉันพบลิงก์นี้ที่ดูเหมือนจะอธิบายพฤติกรรมที่ไม่เหมาะสมที่คล้ายกัน: วิธีการ ปุ่มหยุดไม่ให้ย้ายในรูปแบบที่สืบทอดมา มันไม่ได้รับคำตอบ
นี่คือโค้ดบางส่วนที่ดึงมาจากโปรแกรมที่ฉันมีปัญหา
รูปแบบพื้นฐาน
//
// refreshButton
//
this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.refreshButton.Location = new System.Drawing.Point(200, 4);
this.refreshButton.Name = "refreshButton";
this.refreshButton.Size = new System.Drawing.Size(75, 23);
this.refreshButton.TabIndex = 5;
this.refreshButton.Text = "&Refresh";
this.refreshButton.UseVisualStyleBackColor = true;
//
// saveButton
//
this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.saveButton.Location = new System.Drawing.Point(281, 5);
this.saveButton.Name = "saveButton";
this.saveButton.Size = new System.Drawing.Size(75, 23);
this.saveButton.TabIndex = 4;
this.saveButton.Text = "&Save";
this.saveButton.UseVisualStyleBackColor = true;
//
// buttonPanel
//
this.buttonPanel.Controls.Add(this.saveButton);
this.buttonPanel.Controls.Add(this.refreshButton);
this.buttonPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
this.buttonPanel.Location = new System.Drawing.Point(0, 231);
this.buttonPanel.Name = "buttonPanel";
this.buttonPanel.Size = new System.Drawing.Size(360, 31);
this.buttonPanel.TabIndex = 6;
แบบฟอร์มที่สืบทอดมา (ปรับขนาดให้พอดีกับเนื้อหาข้อมูลของฉัน)
//
// refreshButton
//
this.refreshButton.Location = new System.Drawing.Point(286, 7);
this.refreshButton.TabIndex = 0;
//
// saveButton
//
this.saveButton.Location = new System.Drawing.Point(367, 7);
this.saveButton.TabIndex = 1;
//
// buttonPanel
//
this.buttonPanel.Location = new System.Drawing.Point(0, 232);
this.buttonPanel.Size = new System.Drawing.Size(445, 33);
แก้ไข: ข้อมูลเพิ่มเติมบางส่วนหลังจากลองใช้เพิ่มเติมแล้ว ดูเหมือนว่าปัญหาจะเกิดจากข้อผิดพลาดในตัวออกแบบ Visual Studio 2005 หรือการโต้ตอบที่แปลกประหลาดระหว่างตัวออกแบบและคอมไพเลอร์ C# เมื่อฉันสร้างแบบฟอร์มที่สืบทอดมา ปุ่มต่างๆ จะถูกย้ายไปยังตำแหน่งที่กำหนดเอง (แต่ไม่ใช่แบบสุ่ม!) นอกขอบของแบบฟอร์ม ปุ่มต่างๆ ยังคงมีอยู่และสามารถเลือกได้โดยใช้เมนูแบบเลื่อนลงควบคุมของหน้าต่างคุณสมบัติ VS
ฉันสามารถเลือกส่วนควบคุมและซ่อมแซมตำแหน่งเพื่อให้แสดงในตำแหน่งที่ถูกต้องบนพื้นผิวการออกแบบและขณะรันไทม์ได้ พวกมันเคลื่อนไหวได้อย่างถูกต้องเมื่อฉันปรับขนาดแบบฟอร์ม อย่างไรก็ตาม หลังจากสร้างแล้ว ผู้ออกแบบจะแก้ไขตำแหน่ง ที่มองเห็นได้ ของปุ่ม รหัสในไฟล์ *.Designer.cs ยังคงถูกต้อง แต่คุณสมบัติของปุ่มมีการเปลี่ยนแปลง ในแบบฟอร์มที่สืบทอดจากด้านบน คุณสมบัติ ตำแหน่งของตัวออกแบบสำหรับ RefreshButton และ SaveButton คือ 371,7 และ 452,7 แม้ว่าแผงที่มีความกว้างเพียง 445 พิกเซลเท่านั้น
อย่างน้อยข้อมูลใหม่นี้ทำให้ฉันมีการแก้ไขบางส่วน แต่ฉันก็ยังไม่รู้ว่าทำไมมันถึงเกิดขึ้น
คำตอบ: ปรากฎว่าปุ่มต่างๆ จริงๆ ทำ จะยึดอยู่กับแผง น่าเสียดายที่ผู้ออกแบบเปลี่ยนตำแหน่งจุดยึดให้อยู่ห่างจากพื้นที่ที่มองเห็นได้ของแบบฟอร์ม ข้อสรุปคือตัวออกแบบ VS2005 ไม่น่าเชื่อถือและไม่สามารถจัดการแบบฟอร์มที่สืบทอดมาได้อย่างถูกต้อง 100%
วิธีแก้ปัญหาที่ฉันอนุมานได้คือการแทนที่วิธี OnResize()
ในรูปแบบพื้นฐานของฉันและแก้ไขตำแหน่งของปุ่มที่นั่น มันเป็นแฮ็คเล็กๆ แต่ตรงตามความต้องการของฉัน
/// <summary>
/// Must handle some layout operations manually because Visual Studio
/// 2005 arbitrarily changes some properties of inherited controls.
/// </summary>
/// <param name="e">Data for event.</param>
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
// Move Refresh and Save buttons to lower right corner of button panel.
saveButton.Top = buttonPanel.Bounds.Height -
(saveButton.Height + saveButton.Padding.Bottom + saveButton.Margin.Bottom);
saveButton.Left = buttonPanel.Bounds.Width -
(saveButton.Width + saveButton.Padding.Right + saveButton.Margin.Right);
refreshButton.Top = saveButton.Top;
refreshButton.Left = saveButton.Left -
(refreshButton.Width + refreshButton.Padding.Right + refreshButton.Margin.Right);
}