none
TextBox que solo acepte numeros RRS feed

  • Pregunta

  • Bueno, el titulo lo describe todo, como hacer un textbox que solo permita ingresar numeros? Ya que en Compact Framework al parecer no dispongo del maskedTextBox, mi idea es capturar el evento keypress y preguntar si se trata de un numero, si es asi, que lo inserte en el textbox, sino es un numero, que ignore. Como podria plasmarlo en codigo? o a alguien se le ocurre otra manera de implementarlo? Uso vs2008. Muchas gracias
    lunes, 11 de mayo de 2009 6:54

Respuestas

  • Hola Martin también estuve realizando una aplicación con CF donde tenía un textbox que solo tenía que permitir números y utilice la siguiente porción de código en VB.net

        Private Sub textbox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textbox1.KeyPress
                If Not IsNumeric(e.KeyChar) Then
                    e.Handled = True
                End If
        End Sub
    Espero te sirva.

    Saludos,

    BogotaDotNet Comunidad de Desarrolladores
     John Alexander Bulla Torres

    Ingeniero de Sistemas

    MCTS - SQL Server™ 2005 | DCE Gold

    Blog | Web Site 

     

    [Si te sirve esta respuesta por favor márcala como útil]

    • Marcado como respuesta Martin Spasiuk martes, 16 de junio de 2009 17:57
    lunes, 8 de junio de 2009 17:14
  • aqui te dejo una solucion:

    captura el evento con
    private void tuTextBox_KeyPress(object sender, KeyPressEventArgs e)
            {
                ..................
    }

    y dentro de ella llamas a mi funcion :

    public bool isCaracterValido(Char c)
            {
                if ((c >= '0' && c <= '9'))
                {
                    return true;
                }
                return false;
            }

    espero haberte ayudado
    • Marcado como respuesta Martin Spasiuk martes, 16 de junio de 2009 17:57
    martes, 16 de junio de 2009 16:55

Todas las respuestas

  • Lo más cómodo es que te hagas un control que herede de TextBox en el que sobrescribas OnKeyPress. Luego, según la tecla que recibas, devuelves KeyPressEventAgrs.Handled como true si la tecla recibida no la quieres mostrar.

    Ahora, dependiendo del formato numérico que quieras aceptar y de la funcionalidad que quieras darle al control, tendrás que dejar que se pulsen otras teclas aparte de números, como el Backspace para borrar, el punto o la coma, el menos y el más, etc.

    Un saludo,

    Alejandro Mezcua
    http://www.byteabyte.net/
    lunes, 11 de mayo de 2009 10:24
  • Hola Martin también estuve realizando una aplicación con CF donde tenía un textbox que solo tenía que permitir números y utilice la siguiente porción de código en VB.net

        Private Sub textbox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textbox1.KeyPress
                If Not IsNumeric(e.KeyChar) Then
                    e.Handled = True
                End If
        End Sub
    Espero te sirva.

    Saludos,

    BogotaDotNet Comunidad de Desarrolladores
     John Alexander Bulla Torres

    Ingeniero de Sistemas

    MCTS - SQL Server™ 2005 | DCE Gold

    Blog | Web Site 

     

    [Si te sirve esta respuesta por favor márcala como útil]

    • Marcado como respuesta Martin Spasiuk martes, 16 de junio de 2009 17:57
    lunes, 8 de junio de 2009 17:14
  • aqui te dejo una solucion:

    captura el evento con
    private void tuTextBox_KeyPress(object sender, KeyPressEventArgs e)
            {
                ..................
    }

    y dentro de ella llamas a mi funcion :

    public bool isCaracterValido(Char c)
            {
                if ((c >= '0' && c <= '9'))
                {
                    return true;
                }
                return false;
            }

    espero haberte ayudado
    • Marcado como respuesta Martin Spasiuk martes, 16 de junio de 2009 17:57
    martes, 16 de junio de 2009 16:55
  • El problema de esta aproximación es que sólo acepta números enteros positivos, pero no puedes introducir números negativos, decimales, ni tampoco borrar caracteres ya que, a no ser que esos caracteres los trates en el evento KeyPress aparte, te los rechazará. Si sólo se necesitan esos valores enteros positivos está bien, pero si se necesita algo más hay que filtrar más caracteres y tener cuidado con los caracteres que se aceptan como separadores decimales.

    Un saludo,

    Alejandro Mezcua
    http://www.byteabyte.net/
    viernes, 19 de junio de 2009 12:15
  •     private void txt_numero_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (Char.IsDigit(e.KeyChar))
                {
                    e.Handled = false;
                }
                else if (Char.IsControl(e.KeyChar))
                {
                    e.Handled = false;
                }
                else
                {
                    e.Handled = true;
                }
            }
    jueves, 7 de junio de 2012 14:35
  • Se que la pregunta ya está desde hace tiempo, pero seguro alguien tendrá la misma pregunta y llega hasta acá para solucionar el problema.

    Private Sub textbox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textbox1.KeyPress
         If Not IsNumeric(e.KeyChar) Then
              e.Handled = True
         End If
    End Sub

    El código propuesto por John funciona, pero ojo solo con números enteros positivos.

    Como el valor devuelto por Not IsNumeric(e.KeyChar) es un booleano y el asignado a e.Handled también, se puede asignar directamente.

    Private Sub textbox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textbox1.KeyPress
         e.Handled = Not IsNumeric(e.KeyChar)
    End Sub

    Y de esta manera se permiten caracteres de control, por ejemplo para permitir borrar el número. Cosa que no se puede hacer con el código anterior.

    Private Sub txtIdPaciente_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtIdPaciente.KeyPress
         e.Handled = Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar)
    End Sub

    • Editado César Delseggio viernes, 3 de agosto de 2012 0:13
    • Propuesto como respuesta elokrpo viernes, 5 de julio de 2013 15:35
    jueves, 2 de agosto de 2012 1:34
  • Que tal mira Martín esta la encontré por ahí es una clase y dentro unas funciones la modifique a MaskedBox pero original era con textbox es un cambio muy sencillo. pero la modifique para que acepte números negativos y positivos de forma -140.00 y 140.00 ojala te sirva

    la clase la llame clase y la llamo asi en evento keypress de maskedtextbox

     clase.NumeroDecMasked(e, Me.elMaskedtextbox)

    la función es..

     Function NumeroDecMasked(ByVal e As System.Windows.Forms.KeyPressEventArgs, ByVal Text As MaskedTextBox) As Integer
            Dim dig As Integer = Len(Text.Text & e.KeyChar)
            Dim a, esDecimal, NumDecimales As Integer
            Dim esDec As Boolean
            ' se verifica si es un digito o un punto para el decimal 
            If e.KeyChar.IsDigit(e.KeyChar) Or e.KeyChar = "." Or e.KeyChar = "-" Then
                e.Handled = False
            ElseIf e.KeyChar.IsControl(e.KeyChar) Then
                e.Handled = False
                Return a
            Else
                e.Handled = True
            End If
            If dig = 1 And e.KeyChar = "." Then 'si dig=1 y es un punto rechaza 
                e.Handled = True
                Return a
            End If
            If dig = 1 And e.KeyChar = "-" Then 'si dig es la posicion 1 entonces acepta el guion
                e.Handled = False
                Return a
            End If
            If dig > 1 And e.KeyChar = "-" Then 'si el digito es mayor a uno rechaza el guion ya que solo puede ir al principio
                e.Handled = True
                Return a
            End If
            If Text.SelectedText = "" Then
                ' aqui se hace el for para controlar que el numero sea de dos digitos - contadose a partir del punto decimal.
                For a = 0 To dig - 1
                    Dim car As String = CStr(Text.Text & e.KeyChar)
                    If car.Substring(a, 1) = "." Then
                        esDecimal = esDecimal + 1
                        esDec = True
                    End If
                    If esDec = True Then
                        NumDecimales = NumDecimales + 1
                    End If
                    ' aqui se controla los digitos a partir del punto numdecimales = 4 si es de dos decimales  
                    If NumDecimales >= 4 Or esDecimal >= 2 Then
                        e.Handled = True
                    End If
                Next
            End If
        End Function

    martes, 7 de mayo de 2013 17:26
  • Excelente explicación Cesar y en solo 1 linea de código, la ultima me sirvió mucho gracias.. VB 2012 Express
    viernes, 5 de julio de 2013 15:37
  • muy bueno :)

    viernes, 17 de enero de 2014 16:18
  •     private void txt_numero_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (Char.IsDigit(e.KeyChar))
                {
                    e.Handled = false;
                }
                else if (Char.IsControl(e.KeyChar))
                {
                    e.Handled = false;
                }
                else
                {
                    e.Handled = true;
                }
            }

    hola colegas como puedo modificar este código para que me acepte números con signo negativo

    saludos cordiales

    viernes, 27 de junio de 2014 15:59
  • En el evento KeyPress del textbox tenes que ingresar el siguiente código. Realiza copy paste simplemente.

    El código se refiere a que simplemente todo carácter (e.KeyChar)

    que se recibe como argumento (e)

    que no sea número (!Char.IsDigit(xxx))

    para el evento KeyPress será manejado e.Handled = true;

    C#

    if(!Char.IsDigit(e.KeyChar))          
    {
     e.Handled = true;            
    }    


    martes, 3 de febrero de 2015 19:27
  • Es correcto el código. Pero tiene el pequeño pero, de que si te equivocas marcando un número no te deja borrar. Solamente si seleccionas todo lo escrito y borrar. Pero está muy bien el código.

    Gracias.

    jueves, 12 de mayo de 2016 10:07
  • tienes toda la razón Alejandro, y como sería entonces?saludos
    miércoles, 8 de febrero de 2017 17:03
  • muchas gracias, es justo lo que buscaba, saludos
    miércoles, 8 de febrero de 2017 17:03
  • me fue de mucha ayuda gracias (Y)
    domingo, 2 de abril de 2017 2:50
  • Funciona pero tiene una desventaja que bloquea otras teclas útiles por ejemplo el "borrar"
    jueves, 27 de septiembre de 2018 22:23
  • private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                if(
                    char.IsLetter)
                {
                    e.Handled = false;

                }
                else
                {
                    e.Handled = true;
                }
            }

    Asi se bloquea numeros solo toma caracteres alfabetico

    Si lo inviertes solo tomara Numeros

    • Editado C_H_A_P_E viernes, 5 de octubre de 2018 0:19 Faltaba aclaracion
    viernes, 5 de octubre de 2018 0:18
  • Aprovechando los códigos anteriormente citados que me sirvieron mucho, yo agregue un codigo mas para poder separar por los signos de puntuacion, la cantidad se los comparto.

     Private Sub TxtImporte_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtImporte.KeyPress
            If Not IsNumeric(e.KeyChar) Then
                e.Handled = Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar) And Not Char.IsPunctuation(e.KeyChar)
            End If
        End Sub

    • Propuesto como respuesta LiyoSys martes, 24 de septiembre de 2019 6:20
    miércoles, 14 de noviembre de 2018 1:19
  • Se que la pregunta ya está desde hace tiempo, pero seguro alguien tendrá la misma pregunta y llega hasta acá para solucionar el problema.

    Private Sub textbox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textbox1.KeyPress
         If Not IsNumeric(e.KeyChar) Then
              e.Handled = True
         End If
    End Sub

    El código propuesto por John funciona, pero ojo solo con números enteros positivos.

    Como el valor devuelto por Not IsNumeric(e.KeyChar) es un booleano y el asignado a e.Handled también, se puede asignar directamente.

    Private Sub textbox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textbox1.KeyPress
         e.Handled = Not IsNumeric(e.KeyChar)
    End Sub

    Y de esta manera se permiten caracteres de control, por ejemplo para permitir borrar el número. Cosa que no se puede hacer con el código anterior.

    Private Sub txtIdPaciente_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtIdPaciente.KeyPress
         e.Handled = Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar)
    End Sub

    Excelente, esto era lo que buscaba, me tome el atrevimiento de modificar la ultima opcion para que permita decimales:

     Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
            If e.KeyChar.ToString() = "," Then
                e.KeyChar = "."
            End If
            e.Handled = Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar) And Not e.KeyChar.ToString() = "."
        End Sub

    martes, 24 de septiembre de 2019 6:17
  • Aprovechando los códigos anteriormente citados que me sirvieron mucho, yo agregue un codigo mas para poder separar por los signos de puntuacion, la cantidad se los comparto.

     Private Sub TxtImporte_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtImporte.KeyPress
            If Not IsNumeric(e.KeyChar) Then
                e.Handled = Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar) And Not Char.IsPunctuation(e.KeyChar)
            End If
        End Sub

    Muy util, tengo una modificacion a ese que hiciste, que permite validar solo el "." como signo de puntuación (Es el standard de MySQL).

     Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
            If e.KeyChar.ToString() = "," Then
                e.KeyChar = "."
            End If
            e.Handled = Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar) And Not e.KeyChar.ToString() = "."
        End Sub

    martes, 24 de septiembre de 2019 6:19
  • Bloquear letras, símbolos, negativo  

    If Char.IsDigit(e.KeyChar) Then
                e.Handled = False
            ElseIf Char.IsControl(e.KeyChar) Then
                e.Handled = False
            ElseIf e.KeyChar = "." And Not TextBox1.Text.IndexOf(".") Then
                e.Handled = True
            ElseIf e.KeyChar = "." Then
                e.Handled = False
            Else
                e.Handled = True

            End If

    Lo mismo, pero sin negativo

    If Char.IsDigit(e.KeyChar) Then
                e.Handled = False
            ElseIf Char.IsControl(e.KeyChar) Then
                e.Handled = False
            ElseIf e.KeyChar = "." And Not TextBox3.Text.IndexOf(".") Then
                e.Handled = True
            ElseIf e.KeyChar = "." Then
                e.Handled = False
            Else
                e.Handled = True
            End If
            If Char.IsDigit(e.KeyChar) Then
                e.Handled = False
            ElseIf Char.IsControl(e.KeyChar) Then
                e.Handled = False
            ElseIf e.KeyChar = "." And Not TextBox3.Text.IndexOf(".") Then
                e.Handled = True
            ElseIf e.KeyChar = "." Then
                e.Handled = False
            Else
            End If
            If Char.IsDigit(e.KeyChar) Then
                e.Handled = False
            ElseIf Char.IsControl(e.KeyChar) Then
                e.Handled = False
            ElseIf e.KeyChar = "-" And Not TextBox3.Text.IndexOf("-") Then
                e.Handled = True
            ElseIf e.KeyChar = "-" Then
                e.Handled = False
            Else
            End If

    jueves, 12 de diciembre de 2019 7:16
  • este video me funcionó perfectamente, quizás alguno de ustedes tambien les sirva, saludos https://www.youtube.com/watch?v=ATDyPCUVtHU&t=8s
    miércoles, 11 de noviembre de 2020 3:56