6

Ich erstelle ein benutzerdefiniertes Steuerelement, das Optionsfelder ausgibt (Nein, es müssen keine Optionsfelder sein. Ich versuche nur zu lernen, wie ich das mache.) kann einige komplexere Dinge auf den Weg bringen, die mehrere Listen von Steuerelementen enthalten können), die über die Items-Eigenschaft hinzugefügt werden (ähnlich wie einige andere Steuerelemente).Benutzerdefiniertes Steuerelement wird in Visual Studio Designer nicht aktualisiert

Ich kann das Projekt erstellen, ziehen Sie dieses auf ein Formular aus dem Komponentenbereich und fügen Radio Optionsfelder über die Items-Eigenschaft hinzu. Leider ist dies nicht in Designer aktualisiert, wenn Sie entweder:

  • das Projekt neu 2-3mal
  • und schließen Sie das Formular in Designer

wieder öffnen Zuerst hatte ich die Logik, die diese aufsetzt das Formular, das nach dem Initialisieren im Konstruktor enthalten war, aber nicht funktionierte, weshalb ich zu Form_Load wechselte.

Was fehlt mir? Die oben genannten Optionen sind nur kurzfristige Umgehungslösungen, keine Lösungen.

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 

    } 
} 

Antwort

4

Sie should't das Load Ereignis oder den Konstruktor verwenden, denn wenn Sie das Steuerelement mit dem Designer-Tool hinzufügen, eine Instanz der UserControl erstellt und Das Ereignis Load wird ausgelöst. In diesem Fall ist _item immer noch leer. Ein weiteres Problem ist, dass es einige Probleme Serialisierung eine Liste sind, so würde ich ein Array verwenden:

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

Das Ergebnis wird im Formular-Designer:

enter image description here

+1

Ohhhhhhhhhhhh Ich will dir nur Recht umarmen jetzt habe ich so lange damit verbracht, damit zu spielen, ohne etwas Glück zu diesem Thema mit meinen armen Google-Suchen zu finden. Haben Sie zufällig einen Verweis auf einen Artikel, in dem die Probleme bei der Serialisierung generischer Listen im Designer diskutiert werden? – Mohgeroth

+1

Haha :) Ich bin froh, Ihnen zu helfen! –

+2

@Mohgeroth Sie benötigen keine weitere Sammlung, Sie haben bereits eine in der Controls-Sammlung, in der Ihre Kindersteuerelemente sowieso leben müssen. – Tergiver