none
Control personalizado... ¿Cómo escribir automáticamente en el Form1.Designer.cs? RRS feed

  • Pregunta

  • Tenemos un problema, estamos creando un Control tipo TextBox.

    Una de sus propiedades es una Lista de Objetos Tecla.

    public List<Tecla> ListaTeclas
            {
                get
                {
                    return _listaTeclas;
                }
                set
                {
                    _listaTeclas = value;
                }
            }

    Cuando añadimos nuestro objeto a un formulario en tiempo de diseño queremos añadir en esa propiedad del textbox items a nuestra lista de objetos tecla.

    No es posible hacerlo...  Ya que cuando un control propio del framework lo hace (como añadir columnas a un datagrid en tiempo de edición) lo escribe automáticamente en el Designer y en nuestro caso no lo hace.

    ¿Sabe alguien como hacerlo? Muchas gracias.


    I.L.

    • Tipo cambiado I.L_ viernes, 2 de marzo de 2012 13:22
    viernes, 2 de marzo de 2012 13:18

Respuestas

    1. Elimine el set de la propiedad ListaTeclas.
    2. Sugerencia:  Renombre la propiedad a "Teclas".  Que sea lista o algo más no es muy relevante, creo yo.  Más bonito así, sin "lista".
    3. La clase Tecla debe implementar IComponent o bien heredar de Component.
    4. Esconda los componentes Tecla de la vista de diseño aplicando el atributo DesignTimeVisibleAttribute(false).
    5. Si el property grid no le provee un editor para la colección, entonces cree uno heredando de System.ComponentnModel.Design.CollectionEditor.  Sobreescriba CreateNewItemTypes(), y si lo necesita, entonces también EditValue().  Lo aplica a la propiedad usando el atributo EditorAttribute().

    Jose R. MCP

    • Marcado como respuesta I.L_ lunes, 5 de marzo de 2012 14:58
    • Desmarcado como respuesta I.L_ viernes, 23 de marzo de 2012 11:24
    • Marcado como respuesta I.L_ martes, 27 de marzo de 2012 14:55
    viernes, 2 de marzo de 2012 20:31
    Moderador

Todas las respuestas

  • la verdad no entendi que quieres lograr

    si es un control deberias usar

    public class CustomTextBox : Textbox{

      public List<Tecla> ListaTeclas {get; set;}

    }

    si compilas esto lo veras directo en el toolbox del VS y podras arrastrar al formulario

    pero es un control que tu creas con esta funcionalidad, a partir de ese momento usas ese control

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 2 de marzo de 2012 14:56
  • Cierto, tengo esa propiedad. Cojo el control de mi toolbox, lo arrastro al formulario. A este control que quiero añadir en tiempo de edición (desde el panel de propiedades del control) unos cuantos objetos del tipo tecla a la Lista y esto no es posible hacer.

    Deja introducir los items en la lista, pero como no te escribe nada en el Designer (porque estamos en tienpo de edición) se pierde lo introducido.


    I.L.

    viernes, 2 de marzo de 2012 19:13
    1. Elimine el set de la propiedad ListaTeclas.
    2. Sugerencia:  Renombre la propiedad a "Teclas".  Que sea lista o algo más no es muy relevante, creo yo.  Más bonito así, sin "lista".
    3. La clase Tecla debe implementar IComponent o bien heredar de Component.
    4. Esconda los componentes Tecla de la vista de diseño aplicando el atributo DesignTimeVisibleAttribute(false).
    5. Si el property grid no le provee un editor para la colección, entonces cree uno heredando de System.ComponentnModel.Design.CollectionEditor.  Sobreescriba CreateNewItemTypes(), y si lo necesita, entonces también EditValue().  Lo aplica a la propiedad usando el atributo EditorAttribute().

    Jose R. MCP

    • Marcado como respuesta I.L_ lunes, 5 de marzo de 2012 14:58
    • Desmarcado como respuesta I.L_ viernes, 23 de marzo de 2012 11:24
    • Marcado como respuesta I.L_ martes, 27 de marzo de 2012 14:55
    viernes, 2 de marzo de 2012 20:31
    Moderador
  • no estoy deacuerdo con estas sugerencias por el tipo de control del que se quiere heredar (TextBox)

    lo que tiene que hacer es usar CollectionBase en lugar de IList<> y usar el atributo         [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] para persistir en el diseñador.

    luego abria que evaluar la logica o funcionalidad de esta colección de teclas... que haran en el control y como se comportaran.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    viernes, 2 de marzo de 2012 20:38
  • Cierto, olvidé el DesignerSerializationVisibilityAttribute aplicado a la propiedad ListaTeclas (¿idealmente renombrada a Teclas? :) )  Gracias Marvin.

    Jose R. MCP

    viernes, 2 de marzo de 2012 20:42
    Moderador
  • Cierto, olvidé el DesignerSerializationVisibilityAttribute aplicado a la propiedad ListaTeclas (¿idealmente renombrada a Teclas? :) )  Gracias Marvin.

    Jose R. MCP

    nada.. para eso estamos y felicidades por tu nombramiento de Moderador.... Bienvenido al grupo de Moderadores.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    viernes, 2 de marzo de 2012 20:44
  • Gracias Marvin.  Estamos a la orden.

    Jose R. MCP

    sábado, 3 de marzo de 2012 2:42
    Moderador
  • Hemos probado el atributo [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] y no nos funciona

    Os explico un poco mas el tema.

    El problema: Tengo una propiedad "public Dictionary(Tecla, Comportamiento) ListaTeclasEspeciales { get; set; }" y quiero poder modificar esa propiedad de manera rapida y eficaz desde el diseñador. Algo tipo la propiedad "Columns" de un DataGridView, donde se abre una ventanita en el diseñador y puedes ir añadiendo o quitando columnas a voluntad de forma rapida y sencilla.

    Los objetos 'Tecla' y 'Comportamiento' tienen a su vez propiedades publicas "Codigo", "Nombre" por lo tanto necesitaria algo asi como dos campos uno para el codigo de Tecla y otro para el de Nombre e ir añadiendo objetos a este diccionario en tiempo de diseño.

    He conseguido lo siguiente con una Lista:

    public List<Tecla> PR_ListaTeclas { get; set; }

    Con esta propiedad puedo ver lo siguiente en el diseñador:

    Y pulsando en los puntos suspensivos aparece el editor del diseñador para añadir objetos tipo 'Tecla' en la lista.

    Supongo que os suenan estas pantallitas, pues bien, entiendo que lo que hace .NET, es por detras añadir al designer.cs los correspondientes list.add(new Tecla (9, "nombre")); por cada fila que se haya añadido aqui, con lo cual, si Aceptamos y volvemos a entrar siguen estando las filas y si entramos en el designer.cs vemos las filas que ha añadido por detras, bien, pues no es el caso, añade las filas en la ventanita, Acepto, y cuando vuelvo a entrar esta otra vez vacio y en el designer.cs no se ha añadido nada. con lo cual no puedo acabar de configurar los controles desde tiempo de diseño.

    Lo siguiente es esto mismo pero en vez de para una lista para un Dictionary y dos objetos en vez de uno (Key, Value).

    Alguien que me pueda dar pistas sobre modo Diseñador del VisualStudio 2010, como funciona, se puede crear un editor personalizado para añadir en tiempo de diseño propiedades, He visto tambien tema de [Browsables] [Editor]..etc para colocar encima de las propiedades.

    Alguien que me pueda dar algo de luz sobre este asunto,

    Muchas gracias por adelantado y un saludo,

    lunes, 5 de marzo de 2012 12:28
  • No parece haber seguido mis instrucciones, ¿o sí?  ¿Tuvo algún problema con ellas?

    Jose R. MCP

    lunes, 5 de marzo de 2012 13:38
    Moderador
  • ¿Qué quiere decir "generar el proyecto"?  ¿Qué acción es esta, exactamente?  ¿Compilar?

    Jose R. MCP

    viernes, 23 de marzo de 2012 14:08
    Moderador