Perilaku Panel yang salah pada Formulir Windows yang diwarisi?

Saya memerlukan solusi untuk perilaku yang salah pada Panel pada formulir Windows bawaan. Saya memiliki beberapa tombol yang seharusnya dipasang di sudut kanan bawah panel, tetapi lokasinya berbeda-beda sehingga saya tidak dapat memprediksi pada formulir yang diwariskan. Saya telah mencoba berbagai kombinasi properti Dock dan Anchor, tetapi sejauh ini tidak ada tombol yang muncul di tempat yang seharusnya. Semua kontrol ditandai Dilindungi.

Perilaku sudah benar pada formulir dasar itu sendiri. Perilaku yang salah hanya terjadi pada formulir yang diwarisi; tombol tidak ditautkan ke panel induknya.

Jika saya memasang tombol di kiri atas, saya dapat mengubah ukuran formulir yang diwarisi menjadi lebih besar dan pada akhirnya tombol tersebut akan terbuka, di suatu tempat di luar ukuran formulir dasar. Jika saya memasang tombol di kanan bawah, saya tidak dapat membuat formulir cukup besar untuk membuka tombolnya.

Saya sudah mencoba membuat panel khusus yang mewarisi Panel, dan GroupBox, tetapi cara kerjanya tidak berbeda. Saya juga bernasib sama dengan meletakkan kancing-kancingnya langsung di formulir, tanpa wadah.

Yang saya inginkan: Panel di bagian bawah Formulir yang dapat diubah ukurannya dengan tombol saya di sudut kanan bawah. Sisa formulir harus berupa area yang dapat diubah ukurannya untuk DataGridView (Saya sudah mengatasi masalah pewarisan dan docking dengan yang ini >:-/) Tombol harus selalu berada di sudut kanan bawah terlepas dari ukuran jendela. Saya tidak ingin mengubah ukuran tombol.

Jika saya sendiri harus mengubah ukuran kontrolnya, saya bersedia melakukannya. Namun jika kerangka kerja dapat melakukannya dengan benar, dan saya hanya perlu mempelajari cara menggunakannya dengan benar, saya lebih memilih pendidikan.

Saya menemukan tautan ini yang tampaknya menggambarkan perilaku buruk serupa: Cara menghentikan tombol agar tidak berpindah dalam bentuk yang diwariskan. Itu belum dijawab.


Berikut adalah beberapa kode yang diekstraksi dari program yang bermasalah dengan saya.

Bentuk dasar

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

Formulir yang diwarisi (diubah ukurannya agar sesuai dengan konten data saya)

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

Edit: beberapa data tambahan setelah diutak-atik lagi. Masalahnya tampaknya merupakan bug pada desainer Visual Studio 2005, atau interaksi aneh antara desainer dan kompiler C#. Ketika saya membuat formulir warisan saya, tombol-tombol tersebut dipindahkan ke lokasi yang sewenang-wenang (tetapi tidak acak!) di tepi formulir. Tombol-tombolnya masih tersedia dan dapat dipilih menggunakan dropdown kontrol di jendela VS Properties.

Saya dapat memilih kontrol dan memperbaiki lokasinya agar muncul di tempat yang benar pada permukaan desain dan pada waktu proses. Mereka bahkan bergerak dengan benar ketika saya mengubah ukuran formulir. Namun, setelah pembangunan, perancang memodifikasi Lokasi tombol yang terlihat. Kode dalam file *.Designer.cs masih benar, namun properti tombol diubah. Dalam bentuk yang diwarisi dari atas, properti Lokasi desainer untuk refreshButton dan saveButton adalah 371,7 dan 452,7 meskipun panel yang memuatnya hanya lebarnya 445 piksel.

Setidaknya informasi baru ini memberi saya perbaikan sebagian, tetapi saya masih tidak tahu mengapa hal itu terjadi.


Jawab: Ya, ternyata tombol-tombolnya memang tetap melekat pada panel. Sayangnya, perancang mengubah lokasi jangkar menjadi di luar area yang terlihat dari bentuk. Kesimpulannya adalah desainer VS2005 tidak dapat diandalkan dan tidak menangani formulir warisan 100% dengan benar.

Solusi yang saya simpulkan adalah dengan mengganti metode OnResize() di formulir dasar saya dan memperbaiki lokasi tombol di sana. Ini peretasan kecil, tetapi memenuhi kebutuhan saya.

/// <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 sumber
comment
Apakah masalah terjadi dengan VS2010? Coba edisi ekspres jika Anda tidak memilikinya.   -  person Tergiver    schedule 11.02.2011
comment
Terima kasih, tapi saya menggunakan VS2005 Professional. Memutakhirkan bukanlah pilihan yang terjangkau.   -  person Suncat2000    schedule 22.02.2011
comment
Akan berguna untuk mengetahui apakah itu sesuatu yang telah diperbaiki di versi yang lebih baru.   -  person Tergiver    schedule 23.02.2011
comment
Gejala yang sama di V2013, diselesaikan dengan jangkar kiri, bawah, bukan kanan, bawah...   -  person kristian mo    schedule 16.08.2016


Jawaban (4)


Mari kita lihat beberapa kode yang menduplikasi perilaku tersebut. Kode ini tidak:

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
Pertanyaan yang diedit untuk memasukkan kode yang relevan. Tampak seperti bug desainer. - person Suncat2000; 11.02.2011
comment
Warisan kode berfungsi dengan benar. Warisan visual (desainer) tidak dapat diandalkan. - person Suncat2000; 22.02.2011

Saya mendapatkan hasil yang sangat tidak dapat diandalkan dengan berpegang pada formulir yang diwariskan.

Saya telah menemukan bahwa tampaknya semuanya bekerja lebih baik jika Anda memasang kontrol jika memungkinkan (daripada menjangkar), bahkan jika ini berarti menempatkan kontrol pada panel di dalam panel. (Kamu bilang selesaikan, kan?!)

person Stuart Helwig    schedule 19.08.2011

Saya memiliki masalah yang sama dengan Panel.
Untuk memperbaikinya, pertama-tama atur Properti Anchor di Desainer pada Formulir induk.
Lalu, buka BUILD -> REBUILD SOLUTION.

Ini juga dapat berfungsi pada versi Visual Studio yang lebih lama.

EDIT: Untuk Tombol, Anda perlu Menangani acara Resize, seperti yang disarankan jawaban lain.

person josh    schedule 16.12.2014

Saya memiliki VS 2012, bahkan berisi formulir yang diwarisi, tetapi saya memiliki masalah yang sama, tidak peduli apakah saya mewarisinya sendiri atau menggunakan templat... jangkarnya salah, dan perubahan posisinya berlipat ganda, seperti jika saya hanya memiliki formulir , jadinya 1px untuk 1px, jika saya juga punya panel, itu bergerak 2 untuk 1px, jika saya punya 2 panel itu bergerak 3... saya tidak mengukurnya, tapi kelihatannya seperti itu...


Agak Sebuah Jawaban:

Semenit yang lalu, saya menguji sesuatu, saya mengatur pengubah semua wadah bersarang, menjadi sesuatu yang dapat diakses, kemudian formulir anak menghasilkan lebih banyak kode, waktu proses benar, tetapi sekarang perancang setelah setiap kompilasi, memposisikan ulang kontrol saya di dalam formulir, jadi mengenai itu, saya juga menambahkan panel lain dalam bentuk anak, dan mengaturnya ke mode dok, lalu memasang kontrol saya ke sana, lalu memperbaikinya, bahkan sebelumnya penahan pun salah...

person deadManN    schedule 31.01.2015