2009-06-16 9 views
8

Cada vez que se abre un formulario, el sistema enfoca automáticamente uno de los controles por usted. Por lo que puedo decir, el control que obtiene el foco es el primer control habilitado en el orden de tabulación, según el comportamiento estándar de Windows.¿Cómo especificar qué control debe enfocarse cuando se abre un formulario?

La pregunta es cómo cambiar esto en tiempo de ejecución sin tener que reorganizar dinámicamente el orden de tabulación. Por ejemplo, algunos formularios pueden querer variar el control inicialmente enfocado basado en la lógica del programa, para poner el foco en el control más apropiado. Si solo enfoca algún otro control dentro de su controlador OnLoad, la lógica predeterminada se ejecuta de todos modos y vuelve a enfocar el control predeterminado.

Si va a escribir en C/C++ y utilizando un procedimiento de ventana crudo o MFC, puede devolver 0 (FALSE) de su manejador WM_INITDIALOG, y el valor por defecto de enfoque lógica es ignorada. Sin embargo, no puedo encontrar ninguna forma de hacerlo en Windows Forms. El mejor que he llegado con BeginInvoke es utilizar para ajustar el foco después de que los OnLoad acabados, así:

protected override void OnLoad(System.EventArgs e) 
{ 
    base.OnLoad(e); 
    // ... code ... 
    BeginInvoke(new MethodInvoker(() => this.someControl.Focus())); 
} 

Debe haber alguna manera apropiada de hacer esto - ¿qué es?

Respuesta

13

Después de buscar en Reflector, encontré la que parece ser la forma "correcta" de hacerlo: usando ContainerControl.ActiveControl. Esto se puede hacer desde OnLoad (o en otro lugar, consulte los documentos para conocer las limitaciones) y le indica directamente a qué marco de control desea enfocarse.

Ejemplo de uso:

protected override void OnLoad(System.EventArgs e) 
{ 
    base.OnLoad(e); 
    // ... code ... 
    this.ActiveControl = this.someControl; 
} 

Esta parece ser la solución más limpia y más simple hasta el momento.

+0

Gracias. ¡Funciona! –

+0

no solo la selección se muestra en contol, pero no puede escribir en el cuadro de texto seleccionado o el orden de tabulación tampoco pasa al siguiente. –

1
public void ControlSetFocus(Control^ control) 
    { 

     // Set focus to the control, if it can receive focus. 
     if (control->CanFocus) 
     { 
     control->Focus(); 
     } 
    }  
+0

Gracias - esto generalmente funciona para enfocar un control, pero no ayuda con el caso que estoy describiendo. – Charlie

+0

¿Por qué? ................ –

+0

Estoy de acuerdo con Adam. Necesita un evento que ocurra más tarde en el ciclo de inicio del formulario. –

0

En lugar de utilizar el evento onLoad no se puede utilizar Form.Activated o Form.Shown eventos para ver si se les llama posterior prestación de enfoque de control?

+0

Gracias por las ideas. Sin embargo, estoy esperando otra solución porque estos eventos pueden ocurrir varias veces en la vida de un formulario. Idealmente, solo quiero cambiar el foco cuando se abre el formulario por primera vez; después de eso, debe preservarse lo que el usuario estaba haciendo. – Charlie

+0

No estoy seguro de que los eventos se llamen más veces que el evento Onload, justo cuando se abre el formulario. Consulte aquí http://msdn2.microsoft.com/en-us/library/86faxx0d.aspx ... y podrá administrar cuántas veces se dispara su lógica de enfoque dentro del formulario en sí –

+0

Desafortunadamente, ese gráfico es un tanto engañoso. 'Activado' en realidad se activará cada vez que vuelva a su forma después de cambiar a alguna otra aplicación/formulario. 'Mostrado' se activará cada vez que muestres el formulario, lo que puede ocurrir más de una vez si estás usando una forma no modal y mostrándola/escondiéndola (versus usar ShowDialog para mostrar modalmente el formulario). – Charlie

Cuestiones relacionadas