2009-07-13 9 views
9

Al manipular los controles en una ventana .NET, ¿cuál de las siguientes opciones es la mejor práctica y por qué?¿Debería deshabilitarse y ocultarse un control o simplemente ocultarse?

//Hide control from user and stop control form being useable 
oControl.Enabled = false; 
oControl.Visible = false; 

o

//Hide control from user and stop control form being useable 
oControl.Visible = false; 

He estado usando el primer caso y siempre deshabilitar un control cuando ocultarlo, pero me han dicho que este es mal y que sólo debería estar escondiendolo. Me parece recordar vagamente haber leído en alguna parte que si no controlas específicamente un control, puede continuar interactuando con el usuario.

Cualquier aclaración sería apreciada.

Respuesta

11

Enabled se refiere a si o no el usuario puede interactuar con el control (es decir, si el control está en gris o no)

Visible se refiere a wehether se muestra o no el control (por lo general si esto es falso el control no se representa en absoluto, sin embargo, aparentemente no todo el tiempo, vea los comentarios de esta publicación).

Si el control no se procesa, el valor de la propiedad habilitada no tendrá ningún impacto.

+4

Esto no siempre es el caso; ver mi comentario sobre ToolStripMenuItem bajo la respuesta de ChrisF. –

8

De los MSDN:

Elementos donde la visibilidad no es visible no participan en la entrada eventos (o comandos), no influyen en ya sea la medida o adquirir los pases de diseño, no están en una secuencia de tabulación, y no se informará en la prueba de hit .

Así que creo que puede suponer que la configuración .Enabled = false es innecesaria.

ACTUALIZACIÓN

He comprobado la .Visibitydocumentation on the MSDN, pero lamentablemente no dice nada acerca de si el control está desactivado o no.

+9

Tenga en cuenta que la documentación a la que se ha vinculado se refiere a WPF, no a WinForms. Por ejemplo, un ToolStripMenuItem que tiene asignada una tecla de acceso directo, Visible = False y Enabled = True obtendrá su evento Click invocado cuando se presione la tecla de método abreviado, aunque esté oculto. –

+1

Lo siento, pensé que estaba explorando el árbol de WinForms.Debo haber golpeado el enlace equivocado en algún lugar a lo largo de la línea. – ChrisF

2

A menos que este sea un control especial que puede recibir el foco incluso cuando es invisible, no creo que deba deshabilitarlo explícitamente. Simplemente apagar la visibilidad debería ser suficiente para evitar que el usuario interactúe con el control.

No diría que es "Incorrecto", sin embargo. Lo describiría como "excesivo".

5

Una prueba rápida muestra que establecer de Visible a falso también desactiva las teclas del acelerador para ese control.

En Win32 (es decir, esto no se aplica a Windows Forms), accelerators remain enabled cuando el control está oculto pero no deshabilitado. Supongo que esta es la referencia en la que estabas pensando.

3

Para controles básicos como etiquetas o cuadros de texto, no creo que haga una diferencia real en el método que utiliza.

Pero considere un control más complejo, que contiene un temporizador para verificar si hay nuevos datos para mostrar; deshabilitar el control también desactiva el temporizador.

Si lo hace invisible sin deshabilitarlo, el temporizador todavía activa eventos y cualquier nuevo dato se procesa. Si también lo deshabilita, los datos nuevos no se procesan. Depende del caso específico, cuál de los dos comportamientos desea.

FWIW, No estoy de acuerdo con la persona que le dijo que era incorrecto para ocultar y deshabilitar. Creo que es innecesario, en la mayoría de los casos.

1

No estoy seguro acerca de .NET, pero actionscript/Flex tiene tres propiedades distintas para los controles que toman valores booleanos.

permitió

visibles

includeInLayout

Al establecer la propiedad visible falsa mantiene alrededor y puede afectar la disposición. Todavía es dibujado por el renderizador de la pantalla. Establecer propiedad includeInLayout evita que se represente todo junto. A menudo me parece útil incluir todas las propiedades dependiendo de lo que quiero que suceda con el control y mi vista. Puede haber una propiedad similar en .NET. Pero no estoy seguro.

3

Si usted está preguntando también sobre usabilidad en lugar de solo cuestiones técnicas, no le recomendaré ocultar cosas (a menos que esté cambiando completamente la "vista" actual de su aplicación), porque generalmente es menos molesto encontrar un control desactivado (le da un comentario sobre la acción que desea hacer aún no está listo) que pasar unos segundos buscándolo, solo para darse cuenta después de un tiempo que debe estar desactivado porque las condiciones previas para usarlo no están satisfechas.

Si ya eran conscientes de esto, simplemente lo ignoran :-P

8

Ya sea que tendrá que establecer Enabled = false al ocultar un control depende del control en cuestión, y qué tipo de interacción que ofrece. Para muchos controles (como Button o CheckBox), la configuración Visible = false será suficiente para evitar cualquier interacción entre el usuario y el control.

Pero algunos controles (parece ser especialmente los que ofrecen una propiedad de tecla de método abreviado), todavía ofrecerán interacción del usuario cuando no estén visibles. Por ejemplo, el ToolStripMenuItem (y el "anterior" MenuItem) seguirá teniendo invocado su evento Click cuando se presiona la tecla de método abreviado, independientemente de Visible siendo true o false.

Configuración Enabled = false evitará invocar el evento Click mediante teclas de acceso directo en esos casos. Desde ese punto de vista, yo recomendaría no contra la configuración Enabled = false al ocultar un control en una aplicación WinForms.

Cuestiones relacionadas