none
¿Al abrir un formulario es posible saber qué objeto tenía el foco previamente? RRS feed

  • Pregunta

  • O sea hay 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?
    domingo, 29 de mayo de 2016 2:32

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.






    domingo, 29 de mayo de 2016 7:39
    Moderador
  • 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
    domingo, 29 de mayo de 2016 5:41

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
    domingo, 29 de mayo de 2016 5:41
  • "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.






    domingo, 29 de mayo de 2016 7:39
    Moderador
  • ok, gracias.
    lunes, 30 de mayo de 2016 3:00