none
Problemas al recibir el foco RRS feed

  • Pregunta

  • Hola

    Tengo problemas al recibir el foco de un control personalizado textBox

    protected override void OnGotFocus(EventArgs e)
            {
                base.OnGotFocus(e);
                this.DeselectAll();
    
                if (AcceptDecimal == true)
                    this.TextAlign = HorizontalAlignment.Right;
                else
                    this.TextAlign = HorizontalAlignment.Left;
                
                if (SombrearTexto == true)
                {
                    if (this.SelectionLength == 0)
                        this.SelectAll();
                }
            }

    Cuando me acepta números con decimales me alinea el texto de derecha a izquierda eso trabaja bien, pero cuando quiero escribir de izquierda a derecha me da el problema que si escribo HOLA solo me muestra OLA, el primer carácter no lo escribe, cual puede ser el problema.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 12 de junio de 2013 19:00

Respuestas

  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Text.RegularExpressions;
    using System.Numerics;
    
    namespace GlobalTech.TextBoxControl
    {
        [ToolboxBitmap(typeof(TextBox))]
        public partial class TextBoxUniversal : DevComponents.DotNetBar.Controls.TextBoxX
        {
            private bool Sombra;
            private bool _mTeclaPermitida;
    
            public enum TipoDato
            {
                AlfaNumerico = 0,
                Enteros = 1,
                Letras = 2,
                Numeric = 3
            }
    
            public TextBoxUniversal()
            {
                InitializeComponent();
                if (TipoValidacion == TipoDato.Letras) this.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
            }
    
            private short decimales = 2; // Por default permitira 2 decimales.
            private bool punto = false; // Auxiliar para limitar el número de puntos en el textboxt.
    
            // Creates the private variable that will store the value of your 
            // property.
            private bool _varDecimal;
            // Declares the property.
            public bool AcceptDecimal
            {
                // Sets the method for retrieving the value of your property.
                get
                {
                    return _varDecimal;
                }
                // Sets the method for setting the value of your property.
                set
                {
                    _varDecimal = value;
                }
            }
    
            #region Propiedades del TextBox
            // Implementar la propiedad que permita al usuario establecer el número de decimales a mostrar
            // Agregamos una descripcion a la propiedad que pueda leer el usuario.
            [Description("Define el número de decimales para el cuadro de texto.")]
            public short NumeroDecimales
            {
                get { return this.decimales; }
                set { this.decimales = value; }
            }
    
            TipoDato TipoValidacion;
            [Description("Permite escojer entre los tipos de validación aceptado por el TextBox")] public TipoDato TipoControl
            {
                get {return this.TipoValidacion;}
                set {this.TipoValidacion = value;}
            }
    
            [Description("Permite escojer entre seleccionar texto o no seleccionar en el TextBox")]
            public bool SombrearTexto
            {
                get { return this.Sombra; }
                set { this.Sombra = value; }
            }
            #endregion
    
            protected override void OnKeyPress(KeyPressEventArgs e)
            {
                base.OnKeyPress(e);
    
                switch (TipoValidacion)
                {
                    case TipoDato.AlfaNumerico:
                        break;
                    case TipoDato.Enteros:
                        if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
                        {
                            e.Handled = true; // Rechazar el carácter
                            return;
                        }
                        break;
                    case TipoDato.Letras:
                        if (!Char.IsLetter(e.KeyChar) &&
                            !Char.IsControl(e.KeyChar) &&
                            !Char.IsSeparator(e.KeyChar))
                        {
                            e.Handled = true;
                            return;
                        }
                        //this.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
                        break;
                    case TipoDato.Numeric:
                        //verificar si el textbox contiene el caracter punto y actualizar nuestra variable a true si ya se tiene un punto
                        if (this.Text.Contains(".") == true)
                            punto = true;
                        else
                            punto = false;
    
                        //permitir solo los caracteres de digitos y punto
                        // e.KeyChar == (char)Keys.Home
                        if (char.IsDigit(e.KeyChar) || e.KeyChar == '.')
                        {
                            //validar si el usuario esta ingresando el caracter (punto)
                            if (e.KeyChar == '.')
                            {
                                //limitar el numero de puntos en el textbox
                                if (punto)
                                {
                                    e.Handled = true;// si ya existe un punto, bloquear el caracter
                                    return;
                                }
                                //si no existe ningun punto en el textbox, permitir el caracter
                                punto = true;
    
                            }
    
                            //si el caracter es un digito
                            //comprobar que el cuadro de texto cumpla con la expresion regular:
                            //0 a n digitos(punto)n numero de decimales
                            //si cumple con la expresion, permitir el digito ingresado
                            if (Regex.IsMatch(this.Text, @"^\d*\.\d{" + decimales + "}$")) e.Handled = true;
                        }
                        else
                        {
                            //si es tecla de control especial, permitirla
                            if (!Char.IsControl(e.KeyChar))
                            {
    
                                e.Handled = true;
                                return;
                            }
                        }
                        break;
                }
    
            }
    
            protected override void OnGotFocus(EventArgs e)
            {
                base.OnGotFocus(e);
                //this.DeselectAll();
    
                //if (AcceptDecimal == true)
    
                //    this.TextAlign = HorizontalAlignment.Right;
                //else
                //    this.Refresh();
                
                if (SombrearTexto == true)
                {
                    if (this.SelectionLength == 0)
                        this.SelectAll();
                }
            }
    
            protected override void OnLeave(EventArgs e)
            {
                base.OnLeave(e);
                if (AcceptDecimal == true)
                {
                    decimal numero = default(decimal);
                    bool bln = decimal.TryParse(this.Text, out numero);
    
                    if (string.IsNullOrEmpty(this.Text))
                        return;
                    else
                    {
                        string NDecimales = "N" + NumeroDecimales;
                        this.Text = numero.ToString(NDecimales);
                        this.TextAlign = HorizontalAlignment.Right;
                        this.DeselectAll();
                    }
                }
            }
    
            /// <summary>
            /// Verifica si la expresión se puede evaluar como un número.
            /// </summary>
            /// <author>Enrique Martínez Montejo</author>
            /// <date>31/07/2005</date>
            /// <Modifier>José Luis García Bautista</Modifier> 
            /// <date>15/02/2013</date>
            /// <param>Expresión numérica o alfanumérica que será evaluada. <name>value</name> </param>
            /// <param>Si es True, se rechazarán los valores numéricos
            /// especificados en notación científica, base hexadecimal o base octal. <name>onlyDecimalBase</name> </param>
            /// <param name="valor">Valor a ser evaluado </param>
            /// <returns></returns>
            /// <remarks></remarks>
            public static Boolean IsNumeric(string valor)
            {
                BigInteger result;
                return BigInteger.TryParse(valor, out result);
            }
    
            public static Boolean IsDecimal(string valor)
            {
                decimal result;
                return decimal.TryParse(valor, out result);
            }
    
    
            //****************************************************************************************
            // Comentarios:  A diferencia de la función IsNumeric, la función IsNumber devolverá
            //               False si el número decimal se ha expresado en notación científica
            //               (1,20E+06), en base hexadecimal (&H125EA5) o en base octal (&O4457245),
            //               y siempre que se desee evaluar un número en base decimal.
            //
            //               Como la función se basa en la función IsNumeric, se tendrá en
            //               cuenta el símbolo de moneda de la configuración regional. En
            //               cambio, no se tiene en cuenta el punto o la coma que pueda
            //               existir como símbolo decimal en la configuración regional.
            //****************************************************************************************
            private bool IsNumber(string value, bool onlyDecimalBase)
            {
                if ((string.IsNullOrEmpty(value)))
                    return false;
    
                try
                {
    
                    if ((!_varDecimal) & (!(IsNumeric(value))))
                        return false;
                    if ((_varDecimal) & (!IsDecimal(value)))
                        return false;
    
                    // Primero compruebo si es un número mediante la función IsNumeric de Visual Basic.
                    //
                    //if (!(IsNumeric(value)) & (!IsDecimal(value))) //Quitar comentario para permitir los numeros decimales en el control textbox
                    //    return false;
                    if ((!(onlyDecimalBase)))
                        return true;
    
    
    
    
                    // Aún siendo un número, compruebo que el mismo no
                    // se haya expresado como notación científica (E),
                    // en base hexadecimal (&H) o en base octal (&O).
                    //
                    // Modelo que representa la lista de caracteres
                    // que pueden estar incluidos en una expresión
                    // en notación científica, base decimal u octal.
                    //
                    const string pattern = "*[&HOA-F]*";
    
                    return (!(value.ToUpperInvariant().Contains(pattern)));
    
                }
                catch (Exception ex)
                {
                    throw ex;
    
                }
    
            }
    
            [System.Diagnostics.DebuggerStepThrough]
            protected override void WndProc(ref Message m)
            {
                const Int32 emUndo = 0xc7;// Es el mensaje Deshacer para los controles TextBox de una única línea.
                const Int32 wmClear = 0x303;
                const Int32 wmCopy = 0x301;
                const Int32 wmCut = 0x300;
                const Int32 wmPaste = 0x0302;
                const Int32 wmUndo = 0x304;// Es el mensaje Deshacer para los controles TextBox multilínea.
    
                switch (m.Msg)
                {
                    case wmClear:
                        _mTeclaPermitida = true;
    
                        break;
                    case wmCopy:
                        _mTeclaPermitida = true;
    
                        break;
                    case wmCut:
                        _mTeclaPermitida = true;
    
                        break;
                    case wmPaste:
                        var dataObject = Clipboard.GetDataObject();
                        if (dataObject != null && !(dataObject.GetDataPresent(DataFormats.Text)))
                            return;
    
                        // Comprobamos si el contenido del portapapeles es numérico.
                        if ((!(ValidateClipboardText())))
                        {
                            _mTeclaPermitida = false;
                            return;
                        }
    
                        _mTeclaPermitida = true;
    
                        break;
                    case emUndo:
                        _mTeclaPermitida = true;
    
                        break;
                    case wmUndo:
                        _mTeclaPermitida = true;
    
                        break;
                }
    
                // Procesamos los restantes mensajes
                base.WndProc(ref m);
    
            }
    
            // La función comprobará el contenido del portapapeles de windows
            // Para verificar si su contenido es o no numérico.
            private bool ValidateClipboardText()
            {
                var dataObject = Clipboard.GetDataObject();
                if (dataObject != null && (dataObject.GetDataPresent(DataFormats.Text)))
                {
                    // Contenido actualmente existente en el portapapeles
                    string value = Clipboard.GetText(TextDataFormat.Text);
    
                    bool bln = IsNumber(value, true);
                    if (!bln)
                        return false;
    
                    // Le añadimos el texto actualmente existente en el control
                    // y lo volvemos a validar
                    value = Text + value;
                    return IsNumber(value, true);
                }
                return false;
            }
    
        }
    }
    

    Copi y pega. Recompila me cuentas. ya te digo que a mi me va bien


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila sábado, 15 de junio de 2013 17:27
    sábado, 15 de junio de 2013 16:36
    Moderador
  • El código que te he mandado ,el ultimo, mira de donde hereda...de devcomponents

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila sábado, 15 de junio de 2013 17:27
    sábado, 15 de junio de 2013 17:04
    Moderador
  • Haz un clean de tu solución y haz un rebuild primero del proyecto de tus componentes y luego rebuild de forms... 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila sábado, 15 de junio de 2013 17:27
    sábado, 15 de junio de 2013 17:08
    Moderador

Todas las respuestas

  • Tienes algún formato aplicado? En el evento kwypress ves que se recogen todas los caracteres?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 12 de junio de 2013 19:12
    Moderador
  • Solo tengo esto

    protected override void OnKeyPress(KeyPressEventArgs e)
            {
                base.OnKeyPress(e);
    
                switch (TipoValidacion)
                {
                    case TipoDato.AlfaNumerico:
                        break;
                    case TipoDato.Enteros:
                        if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar))
                            e.Handled = false; // Permitir el carácter
                        else
                            e.Handled = true; // Rechazar el carácter
                        break;
                    case TipoDato.Letras:
                        if (Char.IsLetter(e.KeyChar) |
                            Char.IsControl(e.KeyChar) |
                            Char.IsSeparator(e.KeyChar))
                            e.Handled = false;
                        else
                            e.Handled = true;
    
                        this.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
                        break;
                    case TipoDato.Numeric: ==> Acá es el problema
                        //verificar si el textbox contiene el caracter punto y actualizar nuestra variable a true si ya se tiene un punto
                        if (this.Text.Contains(".") == true)
                            punto = true;
                        else
                            punto = false;
    
                        //permitir solo los caracteres de digitos y punto
                        // e.KeyChar == (char)Keys.Home
                        if (char.IsDigit(e.KeyChar) || e.KeyChar == '.')
                        {
                            //validar si el usuario esta ingresando el caracter (punto)
                            if (e.KeyChar == '.')
                            {
                                //limitar el numero de puntos en el textbox
                                if (punto == false)
                                {
                                    //si no existe ningun punto en el textbox, permitir el caracter
                                    e.Handled = false;
                                    punto = true;
    
                                }
                                else
                                    e.Handled = true; // si ya existe un punto, bloquear el caracter
    
                                return;
                            }
    
                            //si el caracter es un digito
                            //comprobar que el cuadro de texto cumpla con la expresion regular:
                            //0 a n digitos(punto)n numero de decimales
                            //si cumple con la expresion, permitir el digito ingresado
                            if (Regex.IsMatch(this.Text, @"^\d*\.\d{" + decimales + "}$")) e.Handled = true;
                        }
                        else
                        {
                            //si es tecla de control especial, permitirla
                            if (Char.IsControl(e.KeyChar))
                            {
                                e.Handled = false;
                            }
                            else
                                e.Handled = true;
                        }
                        //this.Refresh();
                        break;
                }
    
            }


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 12 de junio de 2013 19:15
  • Sergio que puede estar mal?

    Al comienzo muestro el código del evento GotFocus


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    jueves, 13 de junio de 2013 21:39
  • Hola Pedro,perdona amigo. Si pones un punto de interrupción en keypress y el tipo es alfanumérico hace lo que tiene que hacer? O es de tipo sololetras??


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    jueves, 13 de junio de 2013 22:38
    Moderador
  • El problema es cuando tienes solo números y pones letras?? Explícame de nuevo por favor

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    jueves, 13 de junio de 2013 22:39
    Moderador
  • El problema es en todos menos el numerico

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    jueves, 13 de junio de 2013 22:40
  • Ok..o que si pongo sololetras y escribo hola únicamente me escribe ola es así?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    jueves, 13 de junio de 2013 22:42
    Moderador
  • Mira lo que hice es que cuando sea numerico escriba de derecha a izquierda pero cuando es solo letras alfanumericos enteros pasa el problema de cuando escribo recien escribe el segundo caracter que ingreso por teclado

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    jueves, 13 de junio de 2013 22:43
  • Lo vemos mañana sin falta...ok? Es tarde. Que mas eventos manejas?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    jueves, 13 de junio de 2013 22:43
    Moderador
  • Asi es

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    jueves, 13 de junio de 2013 22:44
  • Ok amigo esos 2 eventos

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    jueves, 13 de junio de 2013 22:44
  • El problema es Letras es allí donde no me deja ingresar el primer caracter

    protected override void OnKeyPress(KeyPressEventArgs e)
            {
                base.OnKeyPress(e);
    
                switch (TipoValidacion)
                {
                    case TipoDato.AlfaNumerico:
                        break;
                    case TipoDato.Enteros:
                        if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar))
                            e.Handled = false; // Permitir el carácter
                        else
                            e.Handled = true; // Rechazar el carácter
                        break;
                    case TipoDato.Letras:
                        if (Char.IsLetter(e.KeyChar) |
                            Char.IsControl(e.KeyChar) |
                            Char.IsSeparator(e.KeyChar))
                            e.Handled = false;
                        else
                            e.Handled = true;
    
                        this.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
                        break;
                    case TipoDato.Numeric:
                        //verificar si el textbox contiene el caracter punto y actualizar nuestra variable a true si ya se tiene un punto
                        if (this.Text.Contains(".") == true)
                            punto = true;
                        else
                            punto = false;
    
                        //permitir solo los caracteres de digitos y punto
                        // e.KeyChar == (char)Keys.Home
                        if (char.IsDigit(e.KeyChar) || e.KeyChar == '.')
                        {
                            //validar si el usuario esta ingresando el caracter (punto)
                            if (e.KeyChar == '.')
                            {
                                //limitar el numero de puntos en el textbox
                                if (punto == false)
                                {
                                    //si no existe ningun punto en el textbox, permitir el caracter
                                    e.Handled = false;
                                    punto = true;
    
                                }
                                else
                                    e.Handled = true; // si ya existe un punto, bloquear el caracter
    
                                return;
                            }
    
                            //si el caracter es un digito
                            //comprobar que el cuadro de texto cumpla con la expresion regular:
                            //0 a n digitos(punto)n numero de decimales
                            //si cumple con la expresion, permitir el digito ingresado
                            if (Regex.IsMatch(this.Text, @"^\d*\.\d{" + decimales + "}$")) e.Handled = true;
                        }
                        else
                        {
                            //si es tecla de control especial, permitirla
                            if (Char.IsControl(e.KeyChar))
                            {
                                e.Handled = false;
                            }
                            else
                                e.Handled = true;
                        }
                        break;
                }
    
            }


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    jueves, 13 de junio de 2013 23:16
  • Sergio, pudistes ver mi problema?

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 14 de junio de 2013 16:29
  • Char.IsLetter(e.KeyChar) |
                           
    Char.IsControl(e.KeyChar) |
                           
    Char.IsSeparator(e.KeyChar))


    Pon las dobles barras ||

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    viernes, 14 de junio de 2013 16:35
    Moderador
  • Sigue fallando Sergio

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 14 de junio de 2013 16:56
  • Puedes poner un breakpoint en tu evento keypress, pulsas la H de Hola y efectivamente se escribe? No estará entrando en algún handled=true??hazlo poco a poco

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    viernes, 14 de junio de 2013 17:05
    Moderador
  • Entra aqui

     e.Handled = false;


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 14 de junio de 2013 17:09
  • Y se visualiza en el textbox? Si es así pulsa otra tecla...

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    viernes, 14 de junio de 2013 17:11
    Moderador
  • Solo se visualiza cuando ingreso la segunda letra 

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 14 de junio de 2013 17:15
  • A que se debe este problema pq no escribe el primer caracter que le ingreso como si cuando preciono el segundo caracter recien recibiera el foco

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 14 de junio de 2013 17:23
  • Creo que deberiass hacer un return; después de cada hsndled = true;

    Codifica para que no entre en los if que tengan hsndles =false ya que por defecto es así... Espero haberme explicado.


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    viernes, 14 de junio de 2013 17:27
    Moderador
  • Por ejemplo...

    if (punto == false)
                               
    {
                                   
    //si no existe ningun punto en el textbox, permitir el caracter
                                    e
    .Handled = false;
                                    punto
    = true;

                               
    }
                               
    else
                                    e
    .Handled = true; // si ya existe un punto, bloquear el caracter

                               
    return;

    por  lo siguiente

    if (punto){
                                    e
    .Handled = true; // si ya existe un punto, bloquear el caracter

                               
    return;
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    viernes, 14 de junio de 2013 17:29
    Moderador
  • Fíjate en este ejemplo

    http://www.codeproject.com/Articles/29766/TNumEditBox-A-Numeric-Edit-Control-with-ContextMen


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    viernes, 14 de junio de 2013 17:46
    Moderador
  • Sergio sigue igual entra al e.handle = false

    Hice lo que me recomendastes


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 14 de junio de 2013 17:54
  • Chequeaste el ejemplo del enlace? Busca la parte del onkeypress y veras que no hay handled= false...solo hay handled=true e inmediatamente return porque si no es valido no hace falta continuar codigo

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    viernes, 14 de junio de 2013 18:00
    Moderador
  • Como me indicas no escribe nada y entra al handle true

    case TipoDato.Letras:
                        if (Char.IsLetter(e.KeyChar) |
                            Char.IsControl(e.KeyChar) |
                            Char.IsSeparator(e.KeyChar))
                        {
                            e.Handled = true;
                            return;
                        }
                        //else
                        //{
                        //    e.Handled = true;
                        //    return;
                        //}
                        this.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
                        break;


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 14 de junio de 2013 18:06
  • protected override void OnKeyPress(KeyPressEventArgs e)
            {
                base.OnKeyPress(e);
    
                switch (TipoValidacion)
                {
                    case TipoDato.AlfaNumerico:
                        break;
                    case TipoDato.Enteros:
                        if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
    					{
                            e.Handled = true; // Rechazar el carácter
    						return;
    					}
    					break;
                    case TipoDato.Letras:
                        if (!Char.IsLetter(e.KeyChar) &&
                            !Char.IsControl(e.KeyChar) &&
                            !Char.IsSeparator(e.KeyChar))
                        {
                            e.Handled = true;
    						return;
    					}
                        this.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
                        break;
                    case TipoDato.Numeric:
                        //verificar si el textbox contiene el caracter punto y actualizar nuestra variable a true si ya se tiene un punto
                        if (this.Text.Contains(".") == true)
                            punto = true;
                        else
                            punto = false;
    
                        //permitir solo los caracteres de digitos y punto
                        // e.KeyChar == (char)Keys.Home
                        if (char.IsDigit(e.KeyChar) || e.KeyChar == '.')
                        {
                            //validar si el usuario esta ingresando el caracter (punto)
                            if (e.KeyChar == '.')
                            {
                                //limitar el numero de puntos en el textbox
                                if (punto)
                                {                                
                                    e.Handled = true;// si ya existe un punto, bloquear el caracter
                                    return;
                                }
                                //si no existe ningun punto en el textbox, permitir el caracter
    							punto = true;
                                
                            }
    
                            //si el caracter es un digito
                            //comprobar que el cuadro de texto cumpla con la expresion regular:
                            //0 a n digitos(punto)n numero de decimales
                            //si cumple con la expresion, permitir el digito ingresado
                            if (Regex.IsMatch(this.Text, @"^\d*\.\d{" + decimales + "}$")) e.Handled = true;
                        }
                        else
                        {
                            //si es tecla de control especial, permitirla
                            if (!Char.IsControl(e.KeyChar))
                            {
                               
                                e.Handled = true;
    							return;
    						}
                        }
                        break;
                }
    
            }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    viernes, 14 de junio de 2013 18:21
    Moderador
  • Hola ya lo probé ese código hace lo mismo pq? sigue saliendo el mismo resultado

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 14 de junio de 2013 19:01
  • Hola Pedro! Puedes pasarme el código completo de tu textbox prosnalizado y lo voy probando en casa?así le doy una vuelta mejor a ver que esta ocurriendo vale? Gracias. Si crees mejor mandme un mensaje de Facebook con un enlace a dicho codigo


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    sábado, 15 de junio de 2013 13:55
    Moderador
  • Hola Sergio, falla en el textbox del devcomponets

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 15 de junio de 2013 15:39
  • Cuando selecciono un texto de numeric me permite escribir letras y cuando pierdo el foco en un texto solo letras lo convierte en 0.00

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 15 de junio de 2013 15:49
  • que raro... yo lo estoy probando en el proyecto que me pasaste, hago lo que dices y formatea el numerico y lo pone a la derecha y el numeric solo me deja poner numeros y el punto. En el proyecto que me pasaste no todos los textbox eran de tipo universal....

    haz otro form2 con textbox universal y establece el tipo y me comentas. es muy raro amigo


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    sábado, 15 de junio de 2013 16:27
    Moderador
  • El tipo universal sirbe para todo ya que tiene una propiedad para elegir el tipo de dato que debe ingresar lo estoy probando con el contrl del devcomponets, voy hacer lo que me comentas

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    sábado, 15 de junio de 2013 16:29
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Text.RegularExpressions;
    using System.Numerics;
    
    namespace GlobalTech.TextBoxControl
    {
        [ToolboxBitmap(typeof(TextBox))]
        public partial class TextBoxUniversal : DevComponents.DotNetBar.Controls.TextBoxX
        {
            private bool Sombra;
            private bool _mTeclaPermitida;
    
            public enum TipoDato
            {
                AlfaNumerico = 0,
                Enteros = 1,
                Letras = 2,
                Numeric = 3
            }
    
            public TextBoxUniversal()
            {
                InitializeComponent();
                if (TipoValidacion == TipoDato.Letras) this.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
            }
    
            private short decimales = 2; // Por default permitira 2 decimales.
            private bool punto = false; // Auxiliar para limitar el número de puntos en el textboxt.
    
            // Creates the private variable that will store the value of your 
            // property.
            private bool _varDecimal;
            // Declares the property.
            public bool AcceptDecimal
            {
                // Sets the method for retrieving the value of your property.
                get
                {
                    return _varDecimal;
                }
                // Sets the method for setting the value of your property.
                set
                {
                    _varDecimal = value;
                }
            }
    
            #region Propiedades del TextBox
            // Implementar la propiedad que permita al usuario establecer el número de decimales a mostrar
            // Agregamos una descripcion a la propiedad que pueda leer el usuario.
            [Description("Define el número de decimales para el cuadro de texto.")]
            public short NumeroDecimales
            {
                get { return this.decimales; }
                set { this.decimales = value; }
            }
    
            TipoDato TipoValidacion;
            [Description("Permite escojer entre los tipos de validación aceptado por el TextBox")] public TipoDato TipoControl
            {
                get {return this.TipoValidacion;}
                set {this.TipoValidacion = value;}
            }
    
            [Description("Permite escojer entre seleccionar texto o no seleccionar en el TextBox")]
            public bool SombrearTexto
            {
                get { return this.Sombra; }
                set { this.Sombra = value; }
            }
            #endregion
    
            protected override void OnKeyPress(KeyPressEventArgs e)
            {
                base.OnKeyPress(e);
    
                switch (TipoValidacion)
                {
                    case TipoDato.AlfaNumerico:
                        break;
                    case TipoDato.Enteros:
                        if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
                        {
                            e.Handled = true; // Rechazar el carácter
                            return;
                        }
                        break;
                    case TipoDato.Letras:
                        if (!Char.IsLetter(e.KeyChar) &&
                            !Char.IsControl(e.KeyChar) &&
                            !Char.IsSeparator(e.KeyChar))
                        {
                            e.Handled = true;
                            return;
                        }
                        //this.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
                        break;
                    case TipoDato.Numeric:
                        //verificar si el textbox contiene el caracter punto y actualizar nuestra variable a true si ya se tiene un punto
                        if (this.Text.Contains(".") == true)
                            punto = true;
                        else
                            punto = false;
    
                        //permitir solo los caracteres de digitos y punto
                        // e.KeyChar == (char)Keys.Home
                        if (char.IsDigit(e.KeyChar) || e.KeyChar == '.')
                        {
                            //validar si el usuario esta ingresando el caracter (punto)
                            if (e.KeyChar == '.')
                            {
                                //limitar el numero de puntos en el textbox
                                if (punto)
                                {
                                    e.Handled = true;// si ya existe un punto, bloquear el caracter
                                    return;
                                }
                                //si no existe ningun punto en el textbox, permitir el caracter
                                punto = true;
    
                            }
    
                            //si el caracter es un digito
                            //comprobar que el cuadro de texto cumpla con la expresion regular:
                            //0 a n digitos(punto)n numero de decimales
                            //si cumple con la expresion, permitir el digito ingresado
                            if (Regex.IsMatch(this.Text, @"^\d*\.\d{" + decimales + "}$")) e.Handled = true;
                        }
                        else
                        {
                            //si es tecla de control especial, permitirla
                            if (!Char.IsControl(e.KeyChar))
                            {
    
                                e.Handled = true;
                                return;
                            }
                        }
                        break;
                }
    
            }
    
            protected override void OnGotFocus(EventArgs e)
            {
                base.OnGotFocus(e);
                //this.DeselectAll();
    
                //if (AcceptDecimal == true)
    
                //    this.TextAlign = HorizontalAlignment.Right;
                //else
                //    this.Refresh();
                
                if (SombrearTexto == true)
                {
                    if (this.SelectionLength == 0)
                        this.SelectAll();
                }
            }
    
            protected override void OnLeave(EventArgs e)
            {
                base.OnLeave(e);
                if (AcceptDecimal == true)
                {
                    decimal numero = default(decimal);
                    bool bln = decimal.TryParse(this.Text, out numero);
    
                    if (string.IsNullOrEmpty(this.Text))
                        return;
                    else
                    {
                        string NDecimales = "N" + NumeroDecimales;
                        this.Text = numero.ToString(NDecimales);
                        this.TextAlign = HorizontalAlignment.Right;
                        this.DeselectAll();
                    }
                }
            }
    
            /// <summary>
            /// Verifica si la expresión se puede evaluar como un número.
            /// </summary>
            /// <author>Enrique Martínez Montejo</author>
            /// <date>31/07/2005</date>
            /// <Modifier>José Luis García Bautista</Modifier> 
            /// <date>15/02/2013</date>
            /// <param>Expresión numérica o alfanumérica que será evaluada. <name>value</name> </param>
            /// <param>Si es True, se rechazarán los valores numéricos
            /// especificados en notación científica, base hexadecimal o base octal. <name>onlyDecimalBase</name> </param>
            /// <param name="valor">Valor a ser evaluado </param>
            /// <returns></returns>
            /// <remarks></remarks>
            public static Boolean IsNumeric(string valor)
            {
                BigInteger result;
                return BigInteger.TryParse(valor, out result);
            }
    
            public static Boolean IsDecimal(string valor)
            {
                decimal result;
                return decimal.TryParse(valor, out result);
            }
    
    
            //****************************************************************************************
            // Comentarios:  A diferencia de la función IsNumeric, la función IsNumber devolverá
            //               False si el número decimal se ha expresado en notación científica
            //               (1,20E+06), en base hexadecimal (&H125EA5) o en base octal (&O4457245),
            //               y siempre que se desee evaluar un número en base decimal.
            //
            //               Como la función se basa en la función IsNumeric, se tendrá en
            //               cuenta el símbolo de moneda de la configuración regional. En
            //               cambio, no se tiene en cuenta el punto o la coma que pueda
            //               existir como símbolo decimal en la configuración regional.
            //****************************************************************************************
            private bool IsNumber(string value, bool onlyDecimalBase)
            {
                if ((string.IsNullOrEmpty(value)))
                    return false;
    
                try
                {
    
                    if ((!_varDecimal) & (!(IsNumeric(value))))
                        return false;
                    if ((_varDecimal) & (!IsDecimal(value)))
                        return false;
    
                    // Primero compruebo si es un número mediante la función IsNumeric de Visual Basic.
                    //
                    //if (!(IsNumeric(value)) & (!IsDecimal(value))) //Quitar comentario para permitir los numeros decimales en el control textbox
                    //    return false;
                    if ((!(onlyDecimalBase)))
                        return true;
    
    
    
    
                    // Aún siendo un número, compruebo que el mismo no
                    // se haya expresado como notación científica (E),
                    // en base hexadecimal (&H) o en base octal (&O).
                    //
                    // Modelo que representa la lista de caracteres
                    // que pueden estar incluidos en una expresión
                    // en notación científica, base decimal u octal.
                    //
                    const string pattern = "*[&HOA-F]*";
    
                    return (!(value.ToUpperInvariant().Contains(pattern)));
    
                }
                catch (Exception ex)
                {
                    throw ex;
    
                }
    
            }
    
            [System.Diagnostics.DebuggerStepThrough]
            protected override void WndProc(ref Message m)
            {
                const Int32 emUndo = 0xc7;// Es el mensaje Deshacer para los controles TextBox de una única línea.
                const Int32 wmClear = 0x303;
                const Int32 wmCopy = 0x301;
                const Int32 wmCut = 0x300;
                const Int32 wmPaste = 0x0302;
                const Int32 wmUndo = 0x304;// Es el mensaje Deshacer para los controles TextBox multilínea.
    
                switch (m.Msg)
                {
                    case wmClear:
                        _mTeclaPermitida = true;
    
                        break;
                    case wmCopy:
                        _mTeclaPermitida = true;
    
                        break;
                    case wmCut:
                        _mTeclaPermitida = true;
    
                        break;
                    case wmPaste:
                        var dataObject = Clipboard.GetDataObject();
                        if (dataObject != null && !(dataObject.GetDataPresent(DataFormats.Text)))
                            return;
    
                        // Comprobamos si el contenido del portapapeles es numérico.
                        if ((!(ValidateClipboardText())))
                        {
                            _mTeclaPermitida = false;
                            return;
                        }
    
                        _mTeclaPermitida = true;
    
                        break;
                    case emUndo:
                        _mTeclaPermitida = true;
    
                        break;
                    case wmUndo:
                        _mTeclaPermitida = true;
    
                        break;
                }
    
                // Procesamos los restantes mensajes
                base.WndProc(ref m);
    
            }
    
            // La función comprobará el contenido del portapapeles de windows
            // Para verificar si su contenido es o no numérico.
            private bool ValidateClipboardText()
            {
                var dataObject = Clipboard.GetDataObject();
                if (dataObject != null && (dataObject.GetDataPresent(DataFormats.Text)))
                {
                    // Contenido actualmente existente en el portapapeles
                    string value = Clipboard.GetText(TextDataFormat.Text);
    
                    bool bln = IsNumber(value, true);
                    if (!bln)
                        return false;
    
                    // Le añadimos el texto actualmente existente en el control
                    // y lo volvemos a validar
                    value = Text + value;
                    return IsNumber(value, true);
                }
                return false;
            }
    
        }
    }
    

    Copi y pega. Recompila me cuentas. ya te digo que a mi me va bien


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila sábado, 15 de junio de 2013 17:27
    sábado, 15 de junio de 2013 16:36
    Moderador
  • Lo probe con el devcomponets en otro formulario y tengo el mismo problema cuando escribo hola solo se ve ola, o solo funciona con el textbox del VS

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 15 de junio de 2013 16:58
  • El código que te he mandado ,el ultimo, mira de donde hereda...de devcomponents

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila sábado, 15 de junio de 2013 17:27
    sábado, 15 de junio de 2013 17:04
    Moderador
  • Haz un clean de tu solución y haz un rebuild primero del proyecto de tus componentes y luego rebuild de forms... 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila sábado, 15 de junio de 2013 17:27
    sábado, 15 de junio de 2013 17:08
    Moderador
  • Te aviso espera

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 15 de junio de 2013 17:17
  • Como hago una limpieza de la solucion

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 15 de junio de 2013 17:21
  • Efectivamente funciono!!!!

    Gracias Sergio


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 15 de junio de 2013 17:27
  • Una consulta pq cuando regreso por segunda vez al control de numeric me sombrea el contenido, cuando digo regreso por segunda vez me refiero a usar la tecla tab y desplazarme hasta llegar a el pq tengo una propiedad para sombrearlo todo en true o false

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 15 de junio de 2013 17:38
  • Te sombrea porque usas este método en OnGotFocus

    protected override void OnGotFocus(EventArgs e)
           
    {
               
    base.OnGotFocus(e);
               
    //this.DeselectAll();

               
    //if (AcceptDecimal == true)

               
    //    this.TextAlign = HorizontalAlignment.Right;
               
    //else
               
    //    this.Refresh();
               
               
    if (SombrearTexto == true)
               
    {
                   
    if (this.SelectionLength == 0)
                       
    this.SelectAll();
               
    }
           
    }
    Si tienes la propiedad SombrearTexto a true lomque hace es seleccionar todo el texto con SelectAll


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    sábado, 15 de junio de 2013 19:14
    Moderador
  • Voy a revisar


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 15 de junio de 2013 19:22
  • Hola pedro, viste lo del sombreado?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    domingo, 16 de junio de 2013 10:47
    Moderador
  • Recién lo voy a revisar, te aviso en un momento

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    domingo, 16 de junio de 2013 18:33
  • Cuando el texto que es de tipo numérico cuando recibe el foco por segunda vez lo sombrea pero la propiedad sombreadoTexto lo tengo en false

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    domingo, 16 de junio de 2013 20:09
  • Hola pedro, puedes poner un punto de interrupcion en el método sobreescrito de OnGotFocus?? Si vas paso a paso en la ejecución, efectivemente se mete en el if de sombreado??

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    domingo, 16 de junio de 2013 20:27
    Moderador
  • Hola Sergio 

    Cuando pongo el punto de interrupción en OnGotFocus no puedo escribir en el formulario se hace como un bucle no puedo depurar, pero si tu me dices que entra al if de sombreado no se pq? yo en propiedades del control lo tengo así y no debería entrar

    protected override void OnGotFocus(EventArgs e)
            {
                base.OnGotFocus(e);
                //this.DeselectAll();
    
                //if (AcceptDecimal == true)
    
                //    this.TextAlign = HorizontalAlignment.Right;
                //else
                //    this.Refresh();
    
                if (SombrearTexto == true)
                {
                    if (this.SelectionLength == 0)
                        this.SelectAll();
                }
            }


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 17 de junio de 2013 13:23
  • Sergio si quiero que el control numeric y enteros escriban desde la derecha hacia la izquierda eso  lo hago en el evento OnGotFocus pq? cuando lo hice tuve complicaciones.

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 17 de junio de 2013 13:46
  • Lo estoy haciendo así y me va bien

     protected override void OnGotFocus(EventArgs e)
            {
                base.OnGotFocus(e);
    
                if (TipoControl == TipoDato.Enteros || TipoControl == TipoDato.Numeric)
                    this.TextAlign = HorizontalAlignment.Right;
    
                if (SombrearTexto == true)
                {
                    if (this.SelectionLength == 0)
                        this.SelectAll();
                }
            }


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 17 de junio de 2013 13:56