radcontrols for .net winforms user-interface behavior

.net - radcontrols - winforms controls



¿Cuál es la diferencia entre Control.Select() y Control.Focus()? (6)

El enfoque es un método de bajo nivel destinado principalmente a los autores de control personalizado. En cambio, los programadores de aplicaciones deben usar el método Select o la propiedad ActiveControl para controles secundarios, o el método Activate para formularios.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

En WinForms, para establecer el foco en un control específico, siempre parezco terminar llamando a Control.Select() y Control.Focus() para que funcione.

¿Cuál es la diferencia, y este es el enfoque correcto?


Focus () es la función de bajo nivel que realmente establece el foco.

Select () es un método de nivel más alto. Primero se ve iterativamente hacia arriba en la jerarquía principal del control hasta que encuentra un control de contenedor. Luego establece la propiedad ActiveControl de ese contenedor (al control llamado). Sin embargo, la lógica en esos métodos no es sencilla, y existe un manejo especial para los contenedores UserControl.


Focus (), en algunas situaciones, puede provocar que una ventana que posee el control obtenga el foco si no tiene foco. Seleccionar () no causa una captura de enfoque por la ventana.


Para un ejemplo de cómo son diferentes, si está tratando de establecer un control para que una aplicación de formularios se enfoque por defecto a cuando lo abra, solo Select () funcionará cuando se llame al constructor después de InitializeComponent (). Focus () no lo hará.


Por experiencia personal, escribí un control de usuario heredando el ComboBox de Windows. Tuve que escribir código para anular el evento OnEnter y tenía una declaración allí diciendo

If Me.Focused Then ... Else ...

Sin embargo, desafortunadamente devolvió el resultado inesperado. Si llamé a MyCustomerComboControl.Select (en los eventos Load, Shown o Activated) llamó al método OnEnter pero no lo registró, tenía el foco (es decir, Focused era False) pero si llamé a Focus funcionó. Además, Select trabajó si el formulario estaba abierto, es decir, si seleccioné otro control y volví a seleccionar el control original todo estaba bien. Entonces, en cualquier otra circunstancia que no sea mi escenario, use Select porque dice lo anterior.


Solo para agregar a este hilo encontré que al escribir un control de usuario que movía otros controles de un formulario a otro (formulario recién creado). La forma original ya no podía seleccionar el control pero usar el foco le permitía hacerlo. Creo que esto enfatiza las respuestas sobre los niveles en los que trabajan estos métodos. Pero también significa que no es lo suficientemente simple para decir usar Select en el nivel superior ya que select ya no funcionó como se esperaba en la forma original (no es que debería serlo, lo coloqué en una forma diferente, lo acepto)