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