2011-08-26 20 views
6

Actualmente en mi aplicación es imposible anular la selección de un cuadro de texto. La única forma es seleccionar otro cuadro de texto. Mis usuarios y yo aceptamos que al hacer clic en cualquier otro lugar del formulario, se debe anular la selección del cuadro de texto actual. Traté de sobreescribir el MouseDown en muchos controles y tener el foco establecido en una etiqueta al azar, pero no funciona para algunos controles como MenuStrip o barras de desplazamiento. ¿Algunas ideas?¿Cómo deseleccionar el cuadro de texto si el usuario hace clic en otro lugar del formulario?

+2

¿Cuál es la razón de este requisito? ¿Cómo beneficia esto a tus usuarios? – cdhowie

+0

¿Qué plataforma estás usando? WinForms, ASP.NET, WPF? –

+0

@Kevin: Winforms C# –

Respuesta

2

Suponiendo que no tiene otros controles en su foro, intente agregar un control de Panel que pueda recibir el foco.

Conjunto del TabIndex en el control Panel a algo menos de tu control o TextBoxNumericUpDown tiene.

Ahora, cuando su formulario principal recibe el foco, el Panel debe recibir el foco en lugar del área TextBox.

ScreenShot

+0

Esto no resuelve mi problema. No quiero que se habiliten o deshabiliten, solo que pierdan el foco cuando el usuario haga clic de lo contrario. Además, esto solo detecta clics de formulario y no controla los clics en el formulario. –

+0

Si el control está deshabilitado, no recibirá mensajes del mouse y no recibirá el foco. –

+0

Sí, pero solo lo deshabilita (lo que no quiero) cuando el usuario hace clic en un área en blanco en el * formulario *. –

0

que tienen algún tipo de "solución" para usted. Solo otro control (que puede enfocar) en segundo plano. Probé esto para un GridView (que pintará su control de color gris), pero debería poder hacerlo con un control personalizado en el color que desea o simplemente establecer el color de fondo de la vista de grilla (doh). De esta forma, cada vez que el usuario haga clic en el fondo, este control de fondo se enfocará.

+0

Esto tampoco funciona. Simplemente cambia el contenedor de todos los controles del formulario al panel. El mismo problema todavía existe. –

1

Dado que probablemente tenga una etiqueta, o cualquier otro control en su winform, yo iría con la solución recommended here y solo pondré el foco en una etiqueta cuando haga clic en el formulario.

En el peor de los casos, incluso puede agregar una etiqueta situada en la posición -100, -100, configurarlo como el primero en el orden de las pestañas y enfocarlo() en el formulario haga clic.

2

Tuve un problema similar recientemente. Mi interfaz es muy compleja, con muchos paneles y páginas con pestañas, por lo que ninguna de las respuestas más simples que encontré ha funcionado.

Mi solución fue agregar programáticamente un manejador de clics del mouse a cada control no enfocable en mi formulario, que intentaría enfocar cualquier etiqueta en el formulario. Enfocar una etiqueta específica no funcionaría cuando estuviera en una página de pestañas diferente, así que terminé revisando y enfocando todas las etiquetas.

Código de lograr es la siguiente:

private void HookControl(Control controlToHook) 
    { 
     // Add any extra "unfocusable" control types as needed 
     if (controlToHook.GetType() == typeof(Panel) 
      || controlToHook.GetType() == typeof(GroupBox) 
      || controlToHook.GetType() == typeof(Label) 
      || controlToHook.GetType() == typeof(TableLayoutPanel) 
      || controlToHook.GetType() == typeof(FlowLayoutPanel) 
      || controlToHook.GetType() == typeof(TabControl) 
      || controlToHook.GetType() == typeof(TabPage) 
      || controlToHook.GetType() == typeof(PictureBox)) 
     { 
      controlToHook.MouseClick += AllControlsMouseClick; 
     } 
     foreach (Control ctl in controlToHook.Controls) 
     { 
      HookControl(ctl); 
     } 
    } 
    void AllControlsMouseClick(object sender, MouseEventArgs e) 
    { 
     FocusLabels(this); 
    } 
    private void FocusLabels(Control control) 
    { 
     if (control.GetType() == typeof(Label)) 
     { 
      control.Focus(); 
     } 
     foreach (Control ctl in control.Controls) 
     { 
      FocusLabels(ctl); 
     } 
    } 

Y luego agregar esto a su evento Form_Load:

HookControl(this); 
Cuestiones relacionadas