6

Estoy creando un control personalizado que muestra botones de opción (no, no tiene que ser botones de opción. Solo intento aprender a hacerlo, así que puede hacer algunas cosas más complejas en el camino que pueden contener múltiples listas de controles) que se agregan a través de la propiedad Items (similar a algunos otros controles).El control personalizado no se actualiza en Visual Studio Designer

Puedo construir el proyecto, arrastrarlo a un formulario desde el panel de componentes y agregar botones de opción a través de la propiedad Elementos. Desafortunadamente esto no se actualiza en el diseñador a menos que sea:

  • Reconstruir el proyecto 2-3 veces
  • Cierre y vuelva a abrir el formulario en el diseñador

Al principio tenía la lógica que pone a estos en la forma contenida en el constructor después de Initialize pero que no estaba funcionando, así que me mudé a Form_Load.

¿Qué me estoy perdiendo? Las opciones anteriores son solo soluciones temporales a corto plazo, no soluciones.

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 

    } 
} 

Respuesta

4

Usted DEBERÍAMOS utilizar el evento Load o el fabricante, porque cuando se agrega el control con la herramienta de diseño se crea una instancia de la UserControl y el evento Load está activado. En su caso, cuando esto sucede, _item todavía está vacío. Otra cuestión es que hay algunos problemas serializar una lista, por lo que haría uso de una matriz:

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

El resultado en el Diseñador de formularios:

enter image description here

+1

Ohhhhhhhhhhhh sólo quiero abrazarte derecha ahora, pasé tanto tiempo jugando con esto sin suerte para encontrar algo sobre este tema con mis pobres búsquedas en Google. ¿Tiene alguna referencia a un artículo que discute los problemas con la serialización de listas genéricas en el diseñador? – Mohgeroth

+1

Haha :) ¡Me alegra ayudarte! –

+2

@Mohgeroth No necesita otra colección, ya tiene una en la colección Controls que es donde los controles de su hijo tienen que vivir de todos modos. – Tergiver

Cuestiones relacionadas