2012-10-12 237 views
7

¿Cómo establece las propiedades predeterminadas para los controles personalizados, es decir, cuando se arrastran primero al formulario en el Diseñador?C# WinForms propiedades predeterminadas de control personalizado

No se puede encontrar una respuesta aquí o a través de Google; Todo lo que obtengo es cómo restringir los valores.

Usando el ancho & Altura como ejemplos, si los configuro en el constructor se aplican al control cada vez que se abre el Diseñador. ¿Cómo los configuro a un valor predeterminado que nunca se aplicará nuevamente después de que el usuario cambie las propiedades?

+0

¿Podría dar un ejemplo de cómo aplicar eso a las propiedades de la clase base? –

+0

Disculpas: es '[DefaultValue (someValue)]'. Aquí hay un enlace a MSDN con el ejemplo: http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute%28v=vs.90%29.aspx – Bridge

+0

Creo que el atributo DefaultValue es lo que necesitar. El IDE de Visual Studio colocará el valor predeterminado especificado en el atributo en el archivo de Designer. Si el usuario cambiará el valor predeterminado a algún otro valor, Visual Studio IDE actualizará el archivo Designer con un nuevo valor. Esto evitará volver a cargar el valor anterior cuando se vuelva a abrir el control ya que el valor predeterminado ya se ha sobrescrito. – jags

Respuesta

-1

En el constructor, establezca los valores de las propiedades que desea que aparezcan cuando lo arrastre al lienzo. O si son las propiedades integradas del control base, configúrelos en la clase de código del diseñador.

+1

Establecer las propiedades en el constructor hace que se apliquen cada vez que se abre el diseñador, lo que significa que no se pueden establecer. –

-1

Lo siguiente le permitirá agregar el valor al mostrar el formulario, luego de eso puede configurarlo como lo desee.

private int widthLength = 5; 

public int Width {  

    get { return widthLength ; } 
    set { widthLength = value; 
} 
+1

Al usar esto, las propiedades predeterminadas no se aplican cuando el control se arrastra al formulario en el Diseñador. También recibo un compilador que advierte que oculta el miembro heredado; agregar 'nuevo' como lo indica la advertencia no cambia el comportamiento. –

5

Pruebe usar el atributo DefaultValue.

private int height; 

[DefaultValue(50)] 
public int Height 
{ 
    get 
    { 
     return height; 
    } 
    set 
    { 
     height=value; 
    } 
} 
+1

Esto no funciona, ya que la propiedad de clase base para Altura no se reemplaza. –

2

Lo que funcionó para mí para las propiedades que no pueden anular está usando el operador new. Por ejemplo, la propiedad MultiSelect en un control ListView. Quiero MultiSelect por defecto a false, pero aún quiero poder cambiarlo.

Si tan sólo puse a false en el constructor, o en InitializeComponent, el problema (creo) es que el valor por defecto es todavía true, por lo que si fijo el valor de true en el diseñador, los avisos de diseño que true es el valor predeterminado, por lo que simplemente no establece la propiedad en absoluto en lugar de establecerla explícitamente en lo que cree que ya es la predeterminada. Pero luego el valor termina siendo false en su lugar, porque eso es lo que se establece en el constructor.

Para solucionar este problema he usado el siguiente código:

/// <summary>Custom ListView.</summary> 
public sealed partial class DetailsListView : ListView 
{ 
    ... 

    [DefaultValue(false)] 
    public new bool MultiSelect { 
     get { return base.MultiSelect; } 
     set { base.MultiSelect = value; } 
    } 

Esto permite que el control todavía tienen un MultiSelect propiedad funcional que por defecto es false en lugar de true, y la propiedad todavía se pueden activar en el nuevo control.

EDIT: encontré un problema que tenía que ver con el uso de formularios abstractos. He estado usando clases de formularios abstractos, con una implementación concreta a la que cambio cuando necesito usar el diseñador. Descubrí que cuando cambiaba la clase que heredaba, las propiedades de mi control personalizado se restablecían a los valores predeterminados anteriores. Parece que he corregido este comportamiento estableciendo propiedades en sus valores predeterminados en el constructor del control personalizado.

Cuestiones relacionadas