Para los desarrolladores que utilizan el .NET Framework y vienen de Visual Basic 6.0 tienen la costumbre de poner el foco en un control mediante la función Focus() (ya que en Visual Basic era así). Aunque es una manera totalmente aceptable y funcional, no siempre funciona como es debido. Aunque en efecto pueda parecer que Control.Select() y Control.Focus() son funciones idénticas, realmente no lo son. Acudamos a la definición de la MSDN Library:
Como ya comentaba antes, la diferencia es casi mínima, pero no por ello son iguales. Aunque en la práctica nos van a funcionar ambas fórmulas, hay ciertos casos “especiales” como es marcar el foco al cargarse un formulario.
Cuando tenemos formularios compuestos de muchos controles contenedores (ToolStripContainer, Panel, …) tenemos la necesidad de especificar via código qué control tendrá el foco al mostrarte el formulario.
La gracia del asunto es que en internet se encuentran muchas soluciones y muchas de ellas “cutrecañeras” como las siguientes:
- Poner un Timer en el formulario que se active en el Load y que hasta que no esté el foco (Control.Focus()) en el control no se desactive
- Crear una variable Boolean de instancia con valor falso y en el evento Form.Activated ejecutar Control.Focus() si el valor es falso (y después ponerlo verdadero).
- …
La verdad es que todas estas soluciones vienen por una cultura VB-sera. Si por el contrario, uno quiere conseguir un resultado limpio la manera en que tiene que hacerlo en en la siguiente:
En el evento Load del formulario, hay que llamar a la función Select() del control que deseamos que tenga el foco al cargar el formulario.
