Validación de datos en TextBox

28/06/2005 - 22:55 por Arturo | Informe spam
Hola!
Necesito que me pasen info acerca de cómo validar datos en un textbox ej.
que mi textbox sólo acepte datos numericos. Quisiera validar tanto al
presionar una tecla (evento textchanged) como al dejar el foco (evento
leave). Estuve viendo el método decimal.parse pero no me doy una idea de
cómo utilizarlo.
Desde ya muchas gracias.
 

Leer las respuestas

#1 Juan Pedro Gonzalez
29/06/2005 - 08:59 | Informe spam
Hola Arturo,

Hace algun tiempo escribi en uno de los foros en Ingles una clase que
heredaba el TextBox para permitir que se introdujesen unicamente valores
numericos. Te la publico despues de algunos comentarios.

En el hilo en el que introduje esta clase se comentaron ciertos problemas
adicionales que en ocasiones pasamos por alto. ¿Por ejemplo, que sucedería
si pegamos el texto en un TextBox? La clase que te presento a continuacion
creo que funcionaba bien, aunque es posible mejorarla un poco.

Public Class NumericTextBox
Inherits System.Windows.Forms.TextBox

Private str_OldText As String
Private int_SelectionStart As Integer
Private int_SelectionLength As Integer

Public Sub New()
MyBase.New()
Me.str_OldText = Nothing

If
(System.Globalization.NumberFormatInfo.CurrentInfo.NegativeSign.Length <> 1)
Or (System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
<> 1) Then
Throw New Exception("This class can't be used with your current
regional settings.")
End If
End Sub

Public Overrides Property Text() As String
Get
Return MyBase.Text
End Get
Set(ByVal Value As String)
If Not IsNumeric(Value) Then
Beep()
MyBase.Text = ""
Else
MyBase.Text = Value
End If
End Set
End Property

Protected Overrides Sub OnKeyDown(ByVal e As
System.Windows.Forms.KeyEventArgs)
If (e.Shift) And (e.KeyCode = Keys.Insert) Then
If Clipboard.GetDataObject.GetDataPresent(DataFormats.Text) Then
If Not
IsNumeric(Clipboard.GetDataObject.GetData(DataFormats.Text)) Then
Beep()
e.Handled = True
End If
Else
Beep()
e.Handled = True
End If
End If

End Sub
Protected Overrides Sub OnKeyPress(ByVal e As
System.Windows.Forms.KeyPressEventArgs

)
If Not Char.IsControl(e.KeyChar) Then
If Not Char.IsDigit(e.KeyChar) Then
Select Case e.KeyChar
Case
System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
If InStr(Me.Text,
System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator)
Then
Beep()
e.Handled = True
ElseIf Me.SelectionStart = 0 Then
If Me.SelectionLength = Me.Text.Length Then
Me.Text = "0" &
System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
Me.SelectionStart = 2
e.Handled = True
Else
Me.Text = "0" &
System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator &
Me.Text.Substring(Me.SelectionLength)
Me.SelectionStart = 2
e.Handled = True
End If
End If
Case
System.Globalization.NumberFormatInfo.CurrentInfo.NegativeSign
If Me.SelectionStart = 0 Then
If Me.Text.Length > 0 Then
If Me.Text.Substring(0, 1) System.Globalization.NumberFormatInfo.CurrentInfo.NegativeSign Then
Beep()
e.Handled = True
End If
End If
Else
Beep()
e.Handled = True
End If
Case Else
Beep()
e.Handled = True
End Select
End If
End If
End Sub

Protected Overrides Sub OnMouseDown(ByVal e As
System.Windows.Forms.MouseEventArgs)
Me.str_OldText = Me.Text
Me.int_SelectionStart = Me.SelectionStart
Me.int_SelectionLength = Me.SelectionLength
End Sub

Protected Overrides Sub OnMouseUp(ByVal mevent As
System.Windows.Forms.MouseEventArgs)
If Not IsNumeric(Me.Text) Then
Me.Text = Me.str_OldText
Me.SelectionStart = Me.int_SelectionStart
Me.SelectionLength = Me.int_SelectionLength
End If

Me.str_OldText = Nothing
Me.Refresh()
End Sub

Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
If Me.str_OldText Is Nothing Then
MyBase.OnPaint(e)
End If
End Sub
End Class

Saludos,

Juan Pedro González

"Arturo" escribió en el mensaje
news:
Hola!
Necesito que me pasen info acerca de cómo validar datos en un textbox ej.
que mi textbox sólo acepte datos numericos. Quisiera validar tanto al
presionar una tecla (evento textchanged) como al dejar el foco (evento
leave). Estuve viendo el método decimal.parse pero no me doy una idea de
cómo utilizarlo.
Desde ya muchas gracias.


Preguntas similares