6

Tworzę niestandardowy element sterujący, który określa przyciski opcji (Nie, to nie muszą być przyciski opcji, po prostu próbuję nauczyć się, jak to zrobić, więc może sprawić, że niektóre bardziej złożone elementy mogą zawierać wiele list kontrolek), które są dodawane za pośrednictwem właściwości Items (podobnie jak niektóre inne kontrolki).Kontrola niestandardowa nie jest aktualizowana w programie Visual Studio Designer

Mogę zbudować projekt, przeciągnąć go na formularz z panelu komponentu i dodać przyciski opcji za pośrednictwem właściwości Items. Niestety to nie jest aktualizowana w projektanta, chyba że albo:

  • Odbuduj projekt 2-3 razy
  • Zamknij i ponownie w postać projektanta

na pierwszy miałem logikę, która stawia je na formularz zawarty w konstruktorze po Initialize, ale to nie działało, więc przeniosłem się do Form_Load.

Czego mi brakuje? Powyższe opcje są tylko krótkoterminowymi obejściami, a nie rozwiązaniami.

RBLTest.cs

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Data; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WFCL_Library 
{ 
    public partial class RBLTest : UserControl 
    { 
     private List<RadioButton> _items; 

     private int leftSpacing = 100; 
     private int topSpacing = 25; 

     public RBLTest() 
     { 
      _items = new List<RadioButton>(); 
      InitializeComponent(); 
     } 

     private void RadioButtonList_Load(object sender, EventArgs e) 
     { 
      int curLeftPos = 0; 
      int curTopPos = 0; 
      foreach (RadioButton rb in _items) 
      { 
       rb.Location = new Point(curLeftPos, curTopPos); 
       rb.Size = new Size(85, 17); 

       curLeftPos += leftSpacing; 

       if (curLeftPos > this.Width) 
       { 
        curLeftPos = 0; 
        curTopPos += topSpacing; 
       } 

       this.Controls.Add(rb);     
      } 
     } 

     [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
     public List<RadioButton> Items 
     { 
      get 
      { 
       return _items; 
      } 
      set 
      { 
       _items = value; 
      } 
     } 
    }  
} 

RBLTest.Designer.cs

namespace WFCL_Library 
{ 
    partial class RBLTest 
    { 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     private System.ComponentModel.IContainer components = null; 

     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
     protected override void Dispose(bool disposing) 
     { 
      if (disposing && (components != null)) 
      { 
       components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     #region Component Designer generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InitializeComponent() 
     { 
      this.SuspendLayout(); 
      // 
      // RBLTest 
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
      this.Name = "RBLTest"; 
      this.Size = new System.Drawing.Size(407, 44); 
      this.Load += new System.EventHandler(this.RadioButtonList_Load); 
      this.ResumeLayout(false); 

     } 

     #endregion 

    } 
} 

Odpowiedz

4

should't użyć zdarzenia Load lub konstruktora, ponieważ podczas dodawania kontrolę przy pomocy narzędzia projektanta instancja jest tworzona i UserControl zdarzenie Load jest wyrzucane. W twoim przypadku, gdy tak się stanie, _item jest nadal pusty. Inną kwestią jest to, że istnieją pewne problemy szeregowania listę, więc użyję tablicy:

public partial class RBLTest : UserControl { 
    private RadioButton[] _items; 

    private int leftSpacing = 100; 
    private int topSpacing = 25; 

    public RBLTest() { 
     InitializeComponent(); 
    } 

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public RadioButton[] Items { 
     get { 
      return _items; 
     } 
     set { 
      _items = value; 

      int curLeftPos = 0; 
      int curTopPos = 0; 
      foreach (RadioButton rb in _items) { 
       rb.Location = new Point(curLeftPos, curTopPos); 
       rb.Size = new Size(85, 17); 

       curLeftPos += leftSpacing; 

       if (curLeftPos > this.Width) { 
        curLeftPos = 0; 
        curTopPos += topSpacing; 
       } 

       this.Controls.Add(rb); 
      } 
     } 
    } 
} 

Wynik w kreatorze Kształt:

enter image description here

+1

Ohhhhhhhhhhhh Chcę po prostu przytulić cię teraz tak długo bawiłem się z tym bez powodzenia, znajdując cokolwiek na ten temat z moimi słabymi wyszukiwaniami google. Czy zdarza ci się mieć odniesienie do artykułu omawiającego problemy z serializowaniem ogólnych list w projektancie? – Mohgeroth

+1

Haha :) Cieszę się, że mogę Ci pomóc! –

+2

@Mohgeroth Nie potrzebujesz kolejnej kolekcji, już masz ją w kolekcji Controls, w której Twoje dziecko musi i tak żyć. – Tergiver

Powiązane problemy