none
mantener el focus en un textbox RRS feed

  • Pregunta

  • Hola, cree un control de usuario que tiene botones donde formo un teclado numerico del 1 al 9 y el 0 y yn botton para borrar, lo agrego a un formulario y lo que quiero es que cuando de click en algun boton, me valla agregando a una caja de texto o a otro dependiendo de donde este el focus, pero cuando se da click en algun boton del teclado se pierde el focus de la caja de texto, como puedo hacerlo sin q se pierda el focus de la cja de texto?

    Gracias

    Saludos.


    zambrano

    martes, 5 de febrero de 2013 16:52

Respuestas

  • Hola, cree un control de usuario que tiene botones donde formo un teclado numerico del 1 al 9 y el 0 y yn botton para borrar, lo agrego a un formulario y lo que quiero es que cuando de click en algun boton, me valla agregando a una caja de texto o a otro dependiendo de donde este el focus, pero cuando se da click en algun boton del teclado se pierde el focus de la caja de texto, como puedo hacerlo sin q se pierda el focus de la cja de texto?

    Gracias

    Saludos.


    zambrano

    bueno... apliquemos en ambos Lenguajes...

    tienes dos opciones para resolver el problema:

    Caso 1:

    te crear una clase que herede de la clase Button y le cambias el estilo para que no puede recibir el foco al hacer click sobre el y ni con el teclado, ejemplo:

    C#

        public class MyButton : Button
        {
            public MyButton()
            {
                this.SetStyle(ControlStyles.Selectable, false);
                this.UpdateStyles();
            }
        }
    

    VB.Net

    Public Class MyButton
        Inherits Button
    
        Sub New()
            Me.SetStyle(ControlStyles.Selectable, False)
            Me.UpdateStyles()
        End Sub
    
    End Class
    


    esto te crearia un nuevo control llamado MyButton que seria el que utilizarias.

    Caso 2:

    Si tienes muchos botones y no quieres hacer el "Caso 1" entonces, lo que podrias hacer es create un componente que implemente la interfaz "IExtenderProvider" para aplicar el "Caso 1" sin crear un nuevo control o clase y este componente se encargara de cambiar el estilo a los botones para que no pierda el foco el control activo al precionar sobre el boton, este componente agregara una nueva propiedad a todos los botones para indicar si o no puede obtener el foco el boton, ejemplo:

    C#

        [ProvideProperty("Selectable", typeof(Control))]
        public partial class ChangeStyle : Component, IExtenderProvider
        {
            private Hashtable hashtable;
            public ChangeStyle()
            {
                this.hashtable = new Hashtable();
            }
    
            public bool CanExtend(object extendee)
            {
                if (extendee is Button)
                    return true;
                return false;
            }
            [DisplayName("Selectable")]
            [Description("If true, the control can receive focus")]
            [DefaultValue(true)]
            public bool GetSelectable(Control ctl)
            {
                if (this.hashtable.ContainsKey(ctl))
                    return (bool)this.hashtable[ctl];
                return true;
            }
            public void SetSelectable(Control ctl, bool canFocused)
            {
                if (hashtable.ContainsKey(ctl))
                {
                    if (canFocused)
                        hashtable.Remove(ctl);
                }
                else
                {
                    hashtable.Add(ctl, canFocused);
                }
    
                this.OnChangeStyle(ctl, canFocused);
            }
    
            private void OnChangeStyle(Control ctl, bool value)
            {
                MethodInfo methodInfo = ctl.GetType().GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic);
                if (methodInfo != null)
                    methodInfo.Invoke(ctl, new object[] { ControlStyles.Selectable, value });
            }
        }
    

    VB.Net

    Imports System.ComponentModel
    
    <ProvideProperty("Selectable", GetType(Control))> _
    Public Class ChangeStyle
        Inherits Component
        Implements IExtenderProvider
    
        Private hashtable As Hashtable
        Sub New()
            Me.hashtable = New Hashtable()
        End Sub
    
        Function CanExtend(ByVal extendee As Object) As Boolean Implements IExtenderProvider.CanExtend
            If TypeOf extendee Is Button Then _
                Return True
            Return False
        End Function
    
        <DisplayName("Selectable")> _
        <Description("")> _
        <DefaultValue(True)> _
        Public Function GetSelectable(ByVal ctrl As Control) As Boolean
            If Me.hashtable.ContainsKey(ctrl) Then _
                Return CBool(Me.hashtable(ctrl))
            Return True
        End Function
        Public Sub SetSelectable(ByVal ctrl As Control, ByVal value As Boolean)
            If Me.hashtable.ContainsKey(ctrl) Then
                If value Then _
                    Me.hashtable.Remove(ctrl)
            Else
                Me.hashtable.Add(ctrl, value)
            End If
    
            Me.OnChangeStyle(ctrl, value)
        End Sub
    
        Private Sub OnChangeStyle(ByVal ctrl As Control, ByVal value As Boolean)
            Dim methodInfo As Reflection.MethodInfo = ctrl.GetType().GetMethod("SetStyle", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
            If methodInfo IsNot Nothing Then _
                methodInfo.Invoke(ctrl, New Object() {ControlStyles.Selectable, value})
        End Sub
    End Class
    

    y para ver la aplicación del componente, ver siguiente imagen

    y listo... cambiando el flag "Selectable" del control este no perdera el foco al hacer clic sobre él.

    cualquier duda o comentario.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 7 de febrero de 2013 18:10

Todas las respuestas

  • Si pierde el foco al momento de presionar el boton porque no juegas con el Focus(), haces lo que tengas que hacer y regresas a donde quieres

    private void Button1_Click(object sender, EventArgs e)
    {

    Textbox1.Text = "Hola";

    Textbox2.Focus();

    }

    y mueves el foco a donde quieras.

    Saludos.

    martes, 5 de febrero de 2013 20:28
  • hola lo que podrias hacer seria esto:

    namespace izqder
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            // declaramos una bandera que nos indica si el textbox derecho esta seleccionado
            bool der = false;
            // creamos 2 listas para almacenar nuestros valores de nuestros botones
            List<string> derecha = new List<string>();
            List<string> izquierda = new List<string>();
            private void textizq_Leave(object sender, EventArgs e)
            {
                // en el evento leave, si es izquierda entonces nuestra bandera se descativa
                der = false;
            }
            private void txtder_Leave(object sender, EventArgs e)
            {
                // si es derecha se pone en true
                der = true;
            }
            private void btn1_Click(object sender, EventArgs e)
            {
                // aqui es el codigo de nuestro botones
                // declaramos dos variables a las que se les asignara
                // el valor de nuestras listas
                string strderecha = "";
                string strizquierda = "";
                // aqui preguntamos si der es = true significa que el textbox derecho tiene el foco
                if (der)
                {
                    // agregamos el numero a la lista
                    derecha.Add("1");
                    // convertimos la lista es una cadena separada por comas
                    strderecha = string.Join(",", derecha.ToArray());
                    // asignamos el valor al textbox
                    txtder.Text = strderecha;
                    // regresamos el valor del foco al textbox derecho
                    
                    txtder.Focus();
                }
                    // si der = false significa que esta seleccionado el textbox izquierdo
                else
                {
                    // agregamos el valor a la lista izquierda
                    izquierda.Add("1");
                    //// convertimos la lista es una cadena separada por comas
                    strizquierda = string.Join(",", izquierda.ToArray());
                    // asignamos el valor al textbox
                    textizq.Text = strizquierda;
                    // regresamos el valor del foco al textbox izquierda
                    textizq.Focus();
                }
                // copiar y pegar este codigo en los demas botones, solo cambiar el numero que ingresara en la lista
                // no comento el boton2 por que es lo mismo que este solo cambie el valor ingresado para que vieras
                // y seria todo
            }
            private void btn2_Click(object sender, EventArgs e)
            {
                string strderecha = "";
                string strizquierda = "";
                if (der)
                {
                    derecha.Add("2");
                    strderecha = string.Join(",", derecha.ToArray());
                    txtder.Text = strderecha;
                    txtder.Focus();
                }
                else
                {
                    izquierda.Add("2");
                    textizq.Text = strizquierda = string.Join(",", izquierda.ToArray());
                    textizq.Focus();
                }
            }
            // limpiar textbox segun foco
            private void button1_Click(object sender, EventArgs e)
            {
                // si der = true entonces el textbox derecho esta seleccionado
                if (der)
                {
                    // limpiamos el textbox derecho
                    txtder.Text = "";
                    // limpiamos los datos de la lista derecha
                    derecha.Clear();
                }
                else
                {
                    // limpiamos el textbox izquierdo
                    textizq.Text = "";
                    // limpiamos los datos de lista izquierda
                    izquierda.Clear();
                }
            }
        }
    }
    funciona, probado por mi jeje saludos

    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    martes, 5 de febrero de 2013 23:13
  • Hola, cree un control de usuario que tiene botones donde formo un teclado numerico del 1 al 9 y el 0 y yn botton para borrar, lo agrego a un formulario y lo que quiero es que cuando de click en algun boton, me valla agregando a una caja de texto o a otro dependiendo de donde este el focus, pero cuando se da click en algun boton del teclado se pierde el focus de la caja de texto, como puedo hacerlo sin q se pierda el focus de la cja de texto?

    Gracias

    Saludos.


    zambrano

    que Lenguaje estas usando C# o VB.Net?


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 7 de febrero de 2013 16:40
  • Hola, cree un control de usuario que tiene botones donde formo un teclado numerico del 1 al 9 y el 0 y yn botton para borrar, lo agrego a un formulario y lo que quiero es que cuando de click en algun boton, me valla agregando a una caja de texto o a otro dependiendo de donde este el focus, pero cuando se da click en algun boton del teclado se pierde el focus de la caja de texto, como puedo hacerlo sin q se pierda el focus de la cja de texto?

    Gracias

    Saludos.


    zambrano

    bueno... apliquemos en ambos Lenguajes...

    tienes dos opciones para resolver el problema:

    Caso 1:

    te crear una clase que herede de la clase Button y le cambias el estilo para que no puede recibir el foco al hacer click sobre el y ni con el teclado, ejemplo:

    C#

        public class MyButton : Button
        {
            public MyButton()
            {
                this.SetStyle(ControlStyles.Selectable, false);
                this.UpdateStyles();
            }
        }
    

    VB.Net

    Public Class MyButton
        Inherits Button
    
        Sub New()
            Me.SetStyle(ControlStyles.Selectable, False)
            Me.UpdateStyles()
        End Sub
    
    End Class
    


    esto te crearia un nuevo control llamado MyButton que seria el que utilizarias.

    Caso 2:

    Si tienes muchos botones y no quieres hacer el "Caso 1" entonces, lo que podrias hacer es create un componente que implemente la interfaz "IExtenderProvider" para aplicar el "Caso 1" sin crear un nuevo control o clase y este componente se encargara de cambiar el estilo a los botones para que no pierda el foco el control activo al precionar sobre el boton, este componente agregara una nueva propiedad a todos los botones para indicar si o no puede obtener el foco el boton, ejemplo:

    C#

        [ProvideProperty("Selectable", typeof(Control))]
        public partial class ChangeStyle : Component, IExtenderProvider
        {
            private Hashtable hashtable;
            public ChangeStyle()
            {
                this.hashtable = new Hashtable();
            }
    
            public bool CanExtend(object extendee)
            {
                if (extendee is Button)
                    return true;
                return false;
            }
            [DisplayName("Selectable")]
            [Description("If true, the control can receive focus")]
            [DefaultValue(true)]
            public bool GetSelectable(Control ctl)
            {
                if (this.hashtable.ContainsKey(ctl))
                    return (bool)this.hashtable[ctl];
                return true;
            }
            public void SetSelectable(Control ctl, bool canFocused)
            {
                if (hashtable.ContainsKey(ctl))
                {
                    if (canFocused)
                        hashtable.Remove(ctl);
                }
                else
                {
                    hashtable.Add(ctl, canFocused);
                }
    
                this.OnChangeStyle(ctl, canFocused);
            }
    
            private void OnChangeStyle(Control ctl, bool value)
            {
                MethodInfo methodInfo = ctl.GetType().GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic);
                if (methodInfo != null)
                    methodInfo.Invoke(ctl, new object[] { ControlStyles.Selectable, value });
            }
        }
    

    VB.Net

    Imports System.ComponentModel
    
    <ProvideProperty("Selectable", GetType(Control))> _
    Public Class ChangeStyle
        Inherits Component
        Implements IExtenderProvider
    
        Private hashtable As Hashtable
        Sub New()
            Me.hashtable = New Hashtable()
        End Sub
    
        Function CanExtend(ByVal extendee As Object) As Boolean Implements IExtenderProvider.CanExtend
            If TypeOf extendee Is Button Then _
                Return True
            Return False
        End Function
    
        <DisplayName("Selectable")> _
        <Description("")> _
        <DefaultValue(True)> _
        Public Function GetSelectable(ByVal ctrl As Control) As Boolean
            If Me.hashtable.ContainsKey(ctrl) Then _
                Return CBool(Me.hashtable(ctrl))
            Return True
        End Function
        Public Sub SetSelectable(ByVal ctrl As Control, ByVal value As Boolean)
            If Me.hashtable.ContainsKey(ctrl) Then
                If value Then _
                    Me.hashtable.Remove(ctrl)
            Else
                Me.hashtable.Add(ctrl, value)
            End If
    
            Me.OnChangeStyle(ctrl, value)
        End Sub
    
        Private Sub OnChangeStyle(ByVal ctrl As Control, ByVal value As Boolean)
            Dim methodInfo As Reflection.MethodInfo = ctrl.GetType().GetMethod("SetStyle", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
            If methodInfo IsNot Nothing Then _
                methodInfo.Invoke(ctrl, New Object() {ControlStyles.Selectable, value})
        End Sub
    End Class
    

    y para ver la aplicación del componente, ver siguiente imagen

    y listo... cambiando el flag "Selectable" del control este no perdera el foco al hacer clic sobre él.

    cualquier duda o comentario.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 7 de febrero de 2013 18:10
  • no me habia fijado que creo un control de usuario, pense que era una aplicacion desde cero,  muy buena explicacion de marvin, maestro. saludos

    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    jueves, 7 de febrero de 2013 18:23