none
Ayuda con pregunta elemental enfoque en control de texto RRS feed

  • Pregunta

  • Veran, tengo un formulario con un botón y un control de texto.

    En el evento click del botón he puesto la siguiente linea:

    txtNombre.Focus()

    Al dar clic en el botón el enfoque pasa al control de texto llamado txtNombre. Hasta allí todo bien.

    Pero yo quiero que al ejecutar el programa el enfoque se ponga sobre txtNombre, entonces pongo la misma línea en el formulario inicial (en su evento Load), que es tambien el fomulario donde está el control, pero es como si la linea no hiciera nada, el enfoque no aparece sobre ningun control, cómo hago para que funcione?


    • Editado James-2016 domingo, 17 de enero de 2016 6:43
    domingo, 17 de enero de 2016 6:42

Respuestas

  • "James-2016" escribió:

    > yo quiero que al ejecutar el programa el enfoque se ponga sobre txtNombre,
    > entonces pongo la misma línea en el formulario inicial (en su evento Load),
    > que es tambien el fomulario donde está el control, pero es como si la linea
    > no hiciera nada, el enfoque no aparece sobre ningun control, cómo hago para
    > que funcione?

    Hola:

    El evento Load no es el mejor lugar para indicar que un control concreto reciba el foco, porque lo más seguro es que en dicho evento el control todavía no pueda recibirlo (el valor de su propiedad CanFocus es False). Si deseas comprobar si puede o no recibir el foco, tan solo tienes que ejecutar lo siguiente:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            If (Not txtNombre.CanFocus) Then
                MessageBox.Show("El control txtNombre no puede recibir el foco.")
    
            Else
                Dim recibioFoco As Boolean = txtNombre.Focus()
                If (Not recibioFoco) Then
                    MessageBox.Show("El control no ha recibido el foco.")
                End If
    
            End If
    
        End Sub

    Si tu intención es que un control concreto obtenga el foco cuando abres un formulario, lo que tienes que hacer es establecer correctamente el orden de tabulación de todos los controles existentes en el formulario, de tal manera que aparezca con el foco aquel control que tenga el valor 0 en su propiedad TabIndex:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    ' Ejecutar lo que proceda.

    ' ...

    ' ...

    ' Al final del evento Load ejecutamos txtNombre.TabIndex = 0 End Sub


    Verás como de ésta manera el control sí recibe el foco cuando termina de ejecutarse el evento Load, salvo que tengas por el formulario algún otro código que lo impida. ;-)

    Un saludo


    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, 17 de enero de 2016 8:13
    Moderador
  • "James-2016" preguntó:

    > Y suponiendo que tenga cinco controles con el orden de tabulación establecido
    > pero quiero que el cursor no quede sobre el control que tiene el orden de
    > tabulación 0, sino con el que tiene el orden de tabulación 3, cómo lo haría
    > usando el método focus()? ¿Dónde podría poner el código?

    Si deseas establecer el foco de entrada en un control concreto cuando se muestre el formulario por primera vez, con independencia del orden de tabulación que tenga establecido, tienes que esperar a que se cargue el formulario (se ejecute su evento Load) y se muestre, por tanto, tendrías que llamar al método Focus en el evento Shown del formulario, el cual se desencadena cuando el formulario se muestra por primera vez:

       Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    
            NombreControl.Focus()
    
        End Sub

    > mmm creo que podría ser con un bucle comparando la propiedad CanFocus
    > hasta que sea true noo?

    ¡Hombre! Dependiendo en qué evento ejecutes el bucle, porque lo único que puede ocurrir es que dejes bloqueada la carga del formulario y su posterior visualización. Ten en cuenta que, entre otros, primero se ejecuta el evento Load y una vez que está cargado el formulario (y sus controles están creados y visibles), se ejecuta el evento Shown. En éste último es donde tienes que establecer el foco en el control que desees y que el valor de su propiedad TabIndex sea mayor que cero.

    Lo mismo te resulta de interés la lectura del siguiente artículo:

    Orden de eventos en los formularios Windows Forms


    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.



    lunes, 18 de enero de 2016 16:02
    Moderador
  • "James-2016" preguntó:

    > el control de texto que tengo tiene un texto por defecto y al ponerle
    > el foco el texto aparece seleccionado, como haría para pasarle el
    > enfoque al control sin que el texto quede seleccionado?

    Para ello tendrás que especificar en qué posición deseas establecer el punto de inserción del control TextBox. Por ejemplo, si tu intención es que el punto de inserción se establezca al final del contenido actual existente en ese control TextBox cada vez que el mismo reciba el foco, en su evento Enter ejecutarías:

        Private Sub TextBox1_Enter(sender As Object, e As EventArgs) Handles TextBox1.Enter
    
            ' Establecemos el punto de inserción al final del contenido actual.
            TextBox1.SelectionStart = TextBox1.TextLength
    
        End Sub

    Y si deseas establecerlo al comienzo del contenido actual, entonces en el mismo evento ejecutarías:

            ' Establecemos el punto de inserción al comienzo del contenido actual.
            TextBox1.SelectionStart = 0

    Te comento que en el siguiente enlace encontrarás la ayuda oficial sobre el control TextBox del espacio de nombres System.Windows.Forms, donde podrás conocer sus propiedades, métodos y eventos:

    TextBox (Clase)


    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.


    lunes, 18 de enero de 2016 21:25
    Moderador

Todas las respuestas

  • Estimado James-2016, para poder realizar lo que estas solicitando deberías de aplicar el siguiente código (En el evento load de tu formulario):

    txtNombre.Select()
    Espero haberte ayudado. Saludos.

    domingo, 17 de enero de 2016 7:10
  • Ok gracias, el cursor ya aparece en el control de texto, pero aun no es lo que quiero, con select() el texto aparece seleccionado pero me gustaría que solo se visualice el cursor dentro del control de texto pero sin seleccionar el texto, cómo podría hacer eso?
    domingo, 17 de enero de 2016 7:37
  • "James-2016" escribió:

    > yo quiero que al ejecutar el programa el enfoque se ponga sobre txtNombre,
    > entonces pongo la misma línea en el formulario inicial (en su evento Load),
    > que es tambien el fomulario donde está el control, pero es como si la linea
    > no hiciera nada, el enfoque no aparece sobre ningun control, cómo hago para
    > que funcione?

    Hola:

    El evento Load no es el mejor lugar para indicar que un control concreto reciba el foco, porque lo más seguro es que en dicho evento el control todavía no pueda recibirlo (el valor de su propiedad CanFocus es False). Si deseas comprobar si puede o no recibir el foco, tan solo tienes que ejecutar lo siguiente:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            If (Not txtNombre.CanFocus) Then
                MessageBox.Show("El control txtNombre no puede recibir el foco.")
    
            Else
                Dim recibioFoco As Boolean = txtNombre.Focus()
                If (Not recibioFoco) Then
                    MessageBox.Show("El control no ha recibido el foco.")
                End If
    
            End If
    
        End Sub

    Si tu intención es que un control concreto obtenga el foco cuando abres un formulario, lo que tienes que hacer es establecer correctamente el orden de tabulación de todos los controles existentes en el formulario, de tal manera que aparezca con el foco aquel control que tenga el valor 0 en su propiedad TabIndex:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    ' Ejecutar lo que proceda.

    ' ...

    ' ...

    ' Al final del evento Load ejecutamos txtNombre.TabIndex = 0 End Sub


    Verás como de ésta manera el control sí recibe el foco cuando termina de ejecutarse el evento Load, salvo que tengas por el formulario algún otro código que lo impida. ;-)

    Un saludo


    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, 17 de enero de 2016 8:13
    Moderador
  • Gracias, ha matado dos pájaros de un tiro:

    - Ahora entiendo por qué es que aparentemente "no hacía caso" el programa cuando le indico que el foco lo debe tener un control en particular.

    - Y el orden de tabulación me da la solución. Es que vengo de Visual Basic y decidí incursionar en .net y estoy más perdido que Adán el Día de la Madre jeje

    Una cosita más para terminar de descifrar al monstruo:

    Y suponiendo que tenga cinco controles con el orden de tabulación establecido pero quiero que el cursor no quede sobre el control que tiene el orden de tabulación 0, sino con el que tiene el orden de tabulación 3, cómo lo haría usando el método focus()? ¿Dónde podría poner el código?


    Saludos cordiales.
    • Editado James-2016 domingo, 17 de enero de 2016 23:47
    domingo, 17 de enero de 2016 23:47
  • mmm creo que podría ser con un bucle comparando la propiedad CanFocus hasta que sea true noo?
    domingo, 17 de enero de 2016 23:50
  • "James-2016" preguntó:

    > Y suponiendo que tenga cinco controles con el orden de tabulación establecido
    > pero quiero que el cursor no quede sobre el control que tiene el orden de
    > tabulación 0, sino con el que tiene el orden de tabulación 3, cómo lo haría
    > usando el método focus()? ¿Dónde podría poner el código?

    Si deseas establecer el foco de entrada en un control concreto cuando se muestre el formulario por primera vez, con independencia del orden de tabulación que tenga establecido, tienes que esperar a que se cargue el formulario (se ejecute su evento Load) y se muestre, por tanto, tendrías que llamar al método Focus en el evento Shown del formulario, el cual se desencadena cuando el formulario se muestra por primera vez:

       Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    
            NombreControl.Focus()
    
        End Sub

    > mmm creo que podría ser con un bucle comparando la propiedad CanFocus
    > hasta que sea true noo?

    ¡Hombre! Dependiendo en qué evento ejecutes el bucle, porque lo único que puede ocurrir es que dejes bloqueada la carga del formulario y su posterior visualización. Ten en cuenta que, entre otros, primero se ejecuta el evento Load y una vez que está cargado el formulario (y sus controles están creados y visibles), se ejecuta el evento Shown. En éste último es donde tienes que establecer el foco en el control que desees y que el valor de su propiedad TabIndex sea mayor que cero.

    Lo mismo te resulta de interés la lectura del siguiente artículo:

    Orden de eventos en los formularios Windows Forms


    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.



    lunes, 18 de enero de 2016 16:02
    Moderador
  • mm gracias, esta era, la posible solución que puse no funcionó y es que al hacerla dentro del evento Load era lo mismo que nada porque igual el control no estaba disponible.

    Esta respuesta resuelve con precisión lo que trato de hacer.

    lunes, 18 de enero de 2016 18:35
  • Otra cosita el control de texto que tengo tiene un texto por defecto y al ponerle el foco el texto aparece seleccionado, como haría para pasarle el enfoque al control sin que el texto quede seleccionado?

    lunes, 18 de enero de 2016 18:43
  • "James-2016" preguntó:

    > el control de texto que tengo tiene un texto por defecto y al ponerle
    > el foco el texto aparece seleccionado, como haría para pasarle el
    > enfoque al control sin que el texto quede seleccionado?

    Para ello tendrás que especificar en qué posición deseas establecer el punto de inserción del control TextBox. Por ejemplo, si tu intención es que el punto de inserción se establezca al final del contenido actual existente en ese control TextBox cada vez que el mismo reciba el foco, en su evento Enter ejecutarías:

        Private Sub TextBox1_Enter(sender As Object, e As EventArgs) Handles TextBox1.Enter
    
            ' Establecemos el punto de inserción al final del contenido actual.
            TextBox1.SelectionStart = TextBox1.TextLength
    
        End Sub

    Y si deseas establecerlo al comienzo del contenido actual, entonces en el mismo evento ejecutarías:

            ' Establecemos el punto de inserción al comienzo del contenido actual.
            TextBox1.SelectionStart = 0

    Te comento que en el siguiente enlace encontrarás la ayuda oficial sobre el control TextBox del espacio de nombres System.Windows.Forms, donde podrás conocer sus propiedades, métodos y eventos:

    TextBox (Clase)


    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.


    lunes, 18 de enero de 2016 21:25
    Moderador
  • Gracias, ahora sí quedó, veo que visual .net demanda un esfuerzo de programación mayor que en VB6 pero vale la pena, veo que hay la posibilidad de hacer cosas que en VB6 simplemente no se podía como por ejemplo personalizar todos los aspectos del control grid. Voy a seguir a aprendiendo, estoy maravillado con visual .net.

    • Editado James-2016 lunes, 18 de enero de 2016 23:40
    lunes, 18 de enero de 2016 23:39