พฤติกรรมไม่ถูกต้องของ Panel บนแบบฟอร์ม Windows ที่สืบทอดมาหรือไม่

ฉันต้องการวิธีแก้ปัญหาสำหรับพฤติกรรมที่ไม่ถูกต้องสำหรับแผงในแบบฟอร์ม 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);
}

person Suncat2000    schedule 11.02.2011    source แหล่งที่มา
comment
ปัญหาเกิดขึ้นกับ VS2010 หรือไม่? ลองใช้รุ่นด่วนหากคุณยังไม่มี   -  person Tergiver    schedule 11.02.2011
comment
ขอบคุณ แต่ฉันใช้ VS2005 Professional การอัพเกรดไม่ใช่ตัวเลือกที่เหมาะสม   -  person Suncat2000    schedule 22.02.2011
comment
การทราบว่าเป็นสิ่งที่ได้รับการแก้ไขในเวอร์ชันที่ใหม่กว่าจะมีประโยชน์หรือไม่   -  person Tergiver    schedule 23.02.2011
comment
อาการเดิมๆในV2013 แก้ด้วย สมอซ้ายล่าง แทนขวาล่าง...   -  person kristian mo    schedule 16.08.2016


คำตอบ (4)


เรามาดูโค้ดที่ทำซ้ำพฤติกรรมกัน รหัสนี้ไม่ได้:

using System;
using System.Drawing;
using System.Windows.Forms;

class FormBase : Form
{
    public FormBase()
    {
        Panel panel;
        Controls.Add(panel = new Panel { Dock = DockStyle.Bottom, Height = 120, BackColor = Color.LightGray });
        panel.Controls.Add(new Button { Text = "Button 1", Anchor = AnchorStyles.Bottom | AnchorStyles.Right, Location = new Point(panel.ClientSize.Width - 80, panel.ClientSize.Height - 60) });
        panel.Controls.Add(new Button { Text = "Button 2", Anchor = AnchorStyles.Bottom | AnchorStyles.Right, Location = new Point(panel.ClientSize.Width - 80, panel.ClientSize.Height - 30) });
    }
}

class FormInherited : FormBase
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FormInherited());
    }
}
person Tergiver    schedule 11.02.2011
comment
แก้ไขคำถามเพื่อรวมรหัสที่เกี่ยวข้อง ดูเหมือนแมลงนักออกแบบ - person Suncat2000; 11.02.2011
comment
การสืบทอดรหัสทำงานอย่างถูกต้อง การสืบทอดภาพ (ผู้ออกแบบ) ไม่น่าเชื่อถือ - person Suncat2000; 22.02.2011

ฉันได้ผลลัพธ์ที่ไม่น่าเชื่อถือมากจากการยึดตามแบบฟอร์มที่สืบทอดมา

ฉันพบว่าดูเหมือนว่าจะทำงานได้ดีขึ้นหากคุณเชื่อมต่อส่วนควบคุมเมื่อเป็นไปได้ (แทนที่จะยึด) แม้ว่าจะต้องวางส่วนควบคุมบนแผงควบคุมภายในแผงควบคุมก็ตาม (คุณบอกว่าทำงานใช่ไหม?!)

person Stuart Helwig    schedule 19.08.2011

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

สิ่งนี้ควรใช้ได้กับ Visual Studio เวอร์ชันเก่าด้วย

แก้ไข: สำหรับปุ่มคุณต้องจัดการเหตุการณ์การปรับขนาดตามที่คำตอบอื่น ๆ แนะนำไว้

person josh    schedule 16.12.2014

ฉันมี VS 2012 มันมีแบบฟอร์มที่สืบทอดมาด้วยซ้ำ แต่ฉันมีปัญหาเดียวกัน ไม่ว่าฉันจะสืบทอดมันด้วยตัวเองหรือใช้เทมเพลตก็ตาม... สมอเรือผิดพลาด และตำแหน่งที่เปลี่ยนแปลงก็ทวีคูณ เหมือนกับว่าฉันมีแบบฟอร์มเท่านั้น มันจะไป 1px สำหรับ 1px ถ้าฉันมีแผงด้วย มันจะขยับ 2 สำหรับ 1px ถ้าฉันมี 2 แผง มันจะขยับ 3... ฉันไม่ได้วัดมัน แต่ดูเหมือนว่า เช่นนั้น...


ค่อนข้างคำตอบ:

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

person deadManN    schedule 31.01.2015