none
ayuda con textbox que acepta solo numeros y punto decimal RRS feed

  • Pregunta

  • Buen Día.

     

    quisiera un consejo sobre como hacer que  varios textbox que tengo acepten solo numeros y un punto decimal, ya tengo el codigo y si funciona, pero tengo muchos textbox y no creo que sea una buena idea poner por cada textbox el mismo codigo, se me ocurre hacerlo en una función y despues mandarla llamar, que me recomiendan, les dejo mi codigo.

     

     'CODIGO QUE SOLO PERMITE LA ENTRADA DE NUMEROS Y UN PUNTO DECIMAL
    
     Private
     Sub
     TotalTextBox1_KeyPress(ByVal
     eventSender As
     System.Object, ByVal
     eventArgs As
     System.
    Windows.Forms.KeyPressEventArgs) Handles TotalTextBox1.KeyPress, SalidasAlmacenTextBox.KeyPress,
     SalidasAlmacenTextBox4.KeyPress, SalidasAlmacenTextBox2.KeyPress, TextBox49.KeyPress,
    TextBox3.KeyPress
    Dim KeyAscii As Short = Asc(eventArgs.KeyChar) If InStr("0123456789." , Chr(KeyAscii)) = 0 Then If KeyAscii <> 8 Then KeyAscii = 0 End If eventArgs.KeyChar = Chr(KeyAscii) If KeyAscii = 0 Then eventArgs.Handled = True End If End Sub

     

    y como ven si quiero que los demas textbox solo acepten numeros y punto decimal, tengo que agregar al final el textbox con el evento key press, que me recomiendan?


    Jaime Bustamante Alvarado
    miércoles, 16 de marzo de 2011 15:43

Respuestas

  • hola ,adicional a todo lo que te han brindado de ejemplo, quizas podrías hacer una función

     Public Sub NumerosyDecimal(ByVal CajaTexto As Windows.Forms.TextBox, ByVal e As System.Windows.Forms.KeyPressEventArgs)
      If Char.IsDigit(e.KeyChar) Then
       e.Handled = False
      ElseIf Char.IsControl(e.KeyChar) Then
       e.Handled = False
      ElseIf e.KeyChar = "." And Not CajaTexto.Text.IndexOf(".") Then
       e.Handled = True
      ElseIf e.KeyChar = "." Then
       e.Handled = False
      Else
       e.Handled = True
      End If
     End Sub
    

    y luego invocarla en el evento keypress de cada caja de texto

     

     Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
     NumerosyDecimal(TextBox1, e)
     End Sub
    
    Saludos.
    Lima-Perú
    miércoles, 16 de marzo de 2011 16:23
  • Hola, Jaime:

    Puedes utilizar el mismo controlador para el evento KeyPress de todos los controles TextBox que desees:

    Imagina que el código lo tienes en el siguiente procedimiento:

        Private Sub TextBoxOnKeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)

            ' Referenciamos el control TextBox que ha desencadenado el evento
            '
            Dim tb As TextBox = DirectCast(sender, TextBox)

        End Sub

    Y en el evento Load del formulario, instalarías los controladores para el evento KeyPress de los controles TextBox:

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

            For Each ctrl As Control In Controls

                If (TypeOf ctrl Is TextBox) Then
                    AddHandler ctrl.KeyPress, AddressOf TextBoxOnKeyPress
                End If
            Next

        End Sub

    En cuando al código para que sólo acepten números y el punto decimal, mira a ver si te sirve el ejemplo que aparece al final del siguiente artículo:

    Cómo detectar la tecla pulsada en una celda del control DataGridView

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    miércoles, 16 de marzo de 2011 15:49
    Moderador

Todas las respuestas

  • Tienes varías opciones:

    Hacerte un control personalizado que implemente dicho evento.

    Agregar dinamicamente el manejador del evento desde código con la instrucción AddHandler


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    miércoles, 16 de marzo de 2011 15:44
    Moderador
  • Hola, Jaime:

    Puedes utilizar el mismo controlador para el evento KeyPress de todos los controles TextBox que desees:

    Imagina que el código lo tienes en el siguiente procedimiento:

        Private Sub TextBoxOnKeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)

            ' Referenciamos el control TextBox que ha desencadenado el evento
            '
            Dim tb As TextBox = DirectCast(sender, TextBox)

        End Sub

    Y en el evento Load del formulario, instalarías los controladores para el evento KeyPress de los controles TextBox:

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

            For Each ctrl As Control In Controls

                If (TypeOf ctrl Is TextBox) Then
                    AddHandler ctrl.KeyPress, AddressOf TextBoxOnKeyPress
                End If
            Next

        End Sub

    En cuando al código para que sólo acepten números y el punto decimal, mira a ver si te sirve el ejemplo que aparece al final del siguiente artículo:

    Cómo detectar la tecla pulsada en una celda del control DataGridView

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    miércoles, 16 de marzo de 2011 15:49
    Moderador
  • hola

    podrias en el Form_Load asignar el mismo metodo de evento, o sea TotalTextBox1_KeyPress a todos ellos

    o sea primer paso quita la parte del

    Handles  TotalTextBox1.KeyPress, SalidasAlmacenTextBox.KeyPress,

    del metodo

     

    luego en el Form_Load define

    AddHandler TotalTextBox1.KeyPress, AddressOf TotalTextBox1_KeyPress

    AddHandler SalidasAlmacenTextBox.KeyPress, AddressOf TotalTextBox1_KeyPress

    .

    .

    y asi por cada uno, como veras son solo linea simples de definir

    es mas se podria ahcer de forma automatica en un foreach, pero seria poco controlado si es que tienes algun textbox que no quieres aplicarle estra restriccion

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta J Bustamante miércoles, 16 de marzo de 2011 16:35
    • Desmarcado como respuesta J Bustamante miércoles, 16 de marzo de 2011 16:57
    miércoles, 16 de marzo de 2011 15:52
  • hola ,adicional a todo lo que te han brindado de ejemplo, quizas podrías hacer una función

     Public Sub NumerosyDecimal(ByVal CajaTexto As Windows.Forms.TextBox, ByVal e As System.Windows.Forms.KeyPressEventArgs)
      If Char.IsDigit(e.KeyChar) Then
       e.Handled = False
      ElseIf Char.IsControl(e.KeyChar) Then
       e.Handled = False
      ElseIf e.KeyChar = "." And Not CajaTexto.Text.IndexOf(".") Then
       e.Handled = True
      ElseIf e.KeyChar = "." Then
       e.Handled = False
      Else
       e.Handled = True
      End If
     End Sub
    

    y luego invocarla en el evento keypress de cada caja de texto

     

     Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
     NumerosyDecimal(TextBox1, e)
     End Sub
    
    Saludos.
    Lima-Perú
    miércoles, 16 de marzo de 2011 16:23
  • Gracias a todos!! me funciono perfecto, gracias!!!
    Jaime Bustamante Alvarado
    miércoles, 16 de marzo de 2011 16:36
  • gracias!! eso tenia pensado hacer como una función, solo que tenia mis dudas pero perfecto ejemplo me haz dado!
    Jaime Bustamante Alvarado
    miércoles, 16 de marzo de 2011 16:59
  • Excelente aporte... me ayudo mucho :)
    Saludos
    miércoles, 14 de enero de 2015 20:14
  • me sirvió bastante, muchas gracias

    Mario Mereles

    sábado, 4 de noviembre de 2017 22:51
  • me funciono excelente tal cual.

    Gracias

    sábado, 3 de agosto de 2019 4:17