Principales respuestas
¿Al abrir un formulario es posible saber qué objeto tenía el foco previamente?

Pregunta
-
Respuestas
-
"James-2016" preguntó:
> algún evento del formulario que se abre (en algún parámetro) devuelve el control
> que previamente tenía el foco? o alguna forma de obtener el control que tenía el
> enfoque justo antes de abrir un formulario?Si he entendido bien tu pregunta, te diré que NO HAY ningún evento, propiedad o método que te devuelva la referencia del control que tenía el foco cuando CERRASTE el formulario, al menos que yo conozca, salvo que cuando cierres éste guardes en algún lado el valor que te devuelva la propiedad ActiveControl del formulario para recuperar dicho valor cuando lo vuelvas a abrir, claro está.
Por ejemplo, imagina que en el objeto My.Settings creas una nueva propiedad llamada ControlActivo con el tipo de dato String, tal y como muestra la siguiente captura de pantalla:
Inserta en el formulario donde deseas establecer el foco en el control la siguiente función, que se encarga de leer el valor de la propiedad ControlActivo y devolver la referencia de dicho control:Private Function ObtenerControlActivoAnteriormente() As Control Dim nombreControl As String = My.Settings.ControlActivo If (String.IsNullOrWhiteSpace(nombreControl)) Then ' El valor de la propiedad no se ha establecido aún. Return Nothing End If Dim ctrl As Control() = Me.Controls.Find(nombreControl, True) If ((Not ctrl Is Nothing) AndAlso (ctrl.Count > 0)) Then ' Devolvemos el primer elemento del array Return ctrl(0) End If ' No existe ningún control Return Nothing End Function
En el evento Shown del formulario (no en el evento Load, porque aquí no te va a funcionar), llamarías a la función anterior de la siguiente manera:
Private Sub FormXXX_Shown(sender As Object, e As EventArgs) Handles Me.Shown ' Referenciar el control que tenía el foco cuando se ' cerró el formulario anteriormente. ' Dim ctrl As Control = Me.ObtenerControlActivoAnteriormente() If (Not ctrl Is Nothing) Then ' Si el valor no es Nothing, establecemos el foco en el control. ' ctrl.Focus() End If End Sub
Y en el evento FormClosing del mismo formulario, el cual se desencadenará cuando se está cerrando el formulario, guardarías en la propiedad ControlActivo el nombre del formulario que tiene el foco cuando aquel se está cerrando:
Private Sub FormXXX_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing ' El formulario se está cerrando. Guardar el nombre del ' control que actualmente tiene el foco. ' My.Settings.ControlActivo = Me.ActiveControl.Name End Sub
Ni que decir tiene que si no te gusta el objeto My.Settings, puedes guardar el valor en una base de datos, en un archivo XML, en un simple archivo de texto, o donde estimes conveniente almacenarlo para posteriormente recuperar dicho valor. ;-)
Enrique Martínez Montejo
[MS MVP - Visual Studio y Tecnologías de Desarrollo]
Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.
- Marcado como respuesta James-2016 lunes, 30 de mayo de 2016 3:00
- Editado Enrique M. MontejoModerator lunes, 30 de mayo de 2016 5:41
-
Hola,
Puedes probar esto :
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown MessageBox.Show(Me.ActiveControl.Name) End Sub
Saludos.
JC NaupaCrispín
Lima - Perú
La magia no existe, la programación SI- Marcado como respuesta James-2016 lunes, 30 de mayo de 2016 3:00
Todas las respuestas
-
Hola,
Puedes probar esto :
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown MessageBox.Show(Me.ActiveControl.Name) End Sub
Saludos.
JC NaupaCrispín
Lima - Perú
La magia no existe, la programación SI- Marcado como respuesta James-2016 lunes, 30 de mayo de 2016 3:00
-
"James-2016" preguntó:
> algún evento del formulario que se abre (en algún parámetro) devuelve el control
> que previamente tenía el foco? o alguna forma de obtener el control que tenía el
> enfoque justo antes de abrir un formulario?Si he entendido bien tu pregunta, te diré que NO HAY ningún evento, propiedad o método que te devuelva la referencia del control que tenía el foco cuando CERRASTE el formulario, al menos que yo conozca, salvo que cuando cierres éste guardes en algún lado el valor que te devuelva la propiedad ActiveControl del formulario para recuperar dicho valor cuando lo vuelvas a abrir, claro está.
Por ejemplo, imagina que en el objeto My.Settings creas una nueva propiedad llamada ControlActivo con el tipo de dato String, tal y como muestra la siguiente captura de pantalla:
Inserta en el formulario donde deseas establecer el foco en el control la siguiente función, que se encarga de leer el valor de la propiedad ControlActivo y devolver la referencia de dicho control:Private Function ObtenerControlActivoAnteriormente() As Control Dim nombreControl As String = My.Settings.ControlActivo If (String.IsNullOrWhiteSpace(nombreControl)) Then ' El valor de la propiedad no se ha establecido aún. Return Nothing End If Dim ctrl As Control() = Me.Controls.Find(nombreControl, True) If ((Not ctrl Is Nothing) AndAlso (ctrl.Count > 0)) Then ' Devolvemos el primer elemento del array Return ctrl(0) End If ' No existe ningún control Return Nothing End Function
En el evento Shown del formulario (no en el evento Load, porque aquí no te va a funcionar), llamarías a la función anterior de la siguiente manera:
Private Sub FormXXX_Shown(sender As Object, e As EventArgs) Handles Me.Shown ' Referenciar el control que tenía el foco cuando se ' cerró el formulario anteriormente. ' Dim ctrl As Control = Me.ObtenerControlActivoAnteriormente() If (Not ctrl Is Nothing) Then ' Si el valor no es Nothing, establecemos el foco en el control. ' ctrl.Focus() End If End Sub
Y en el evento FormClosing del mismo formulario, el cual se desencadenará cuando se está cerrando el formulario, guardarías en la propiedad ControlActivo el nombre del formulario que tiene el foco cuando aquel se está cerrando:
Private Sub FormXXX_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing ' El formulario se está cerrando. Guardar el nombre del ' control que actualmente tiene el foco. ' My.Settings.ControlActivo = Me.ActiveControl.Name End Sub
Ni que decir tiene que si no te gusta el objeto My.Settings, puedes guardar el valor en una base de datos, en un archivo XML, en un simple archivo de texto, o donde estimes conveniente almacenarlo para posteriormente recuperar dicho valor. ;-)
Enrique Martínez Montejo
[MS MVP - Visual Studio y Tecnologías de Desarrollo]
Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.
- Marcado como respuesta James-2016 lunes, 30 de mayo de 2016 3:00
- Editado Enrique M. MontejoModerator lunes, 30 de mayo de 2016 5:41
-