Enter numeric value only into textbox in visual basic - vb.net

I am trying to set up a form to accept a telephone number, but i am unsure of how to validate it so it will only take numeric values with 11 digits.
So far i have it working to ensure that there is something in the textbox
'Validate data for Telephone Number
If txtTelephoneNumber.Text = "" Then
txtTelephoneNumber.Focus()
MessageBox.Show("You must enter a Telephone Number.", "Data Entry Error", MessageBoxButtons.OK, MessageBoxIcon.Information)

I'll imply you are using Windows Forms.
Write this as your TextBox's Key Pressed event.
Private Sub myTxtBox_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles myTxtBox.KeyPress
If txtTelephoneNumber.Text.Length > 11 Then
e.Handled= True
return
End If
If Asc(e.KeyChar) <> 8 Then
If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
e.Handled = True
End If
End If
End Sub
This should (did not have time to test it) keep the user from inputing anything that is not a number. It should prevent him from inputting more than 11 numbers too.

In your textbox keydown event. Use the following:
If Not IsNumeric(Chr(e.KeyCode)) Then
e.SuppressKeyPress = True
End If
If you want allow other characters you would do it like so:
If Not IsNumeric(Chr(e.KeyCode)) And Not e.KeyCode = 8 And Not e.KeyCode = 46 Then
e.SuppressKeyPress = True
End If
'(8 = backspace key and 46 = Delete key)

You can try
If txtTelephoneNumber.Text = "" Or Not IsNumeric(txtTelephoneNumber.Text) Or txtTelephoneNumber.Text.Length <> 11 Then
txtTelephoneNumber.Focus()
MessageBox.Show("You must enter a Telephone Number.", "Data Entry Error", MessageBoxButtons.OK, MessageBoxIcon.Information)

Put this in your KeyPress event of the TextBox
'makes sure that only numbers and the backspace are allowed in the fields.
Dim allowedChars As String = "0123456789" & vbBack
'get a reference to the text box that fired this event
Dim tText As TextBox
tText = CType(sender, TextBox)
If allowedChars.IndexOf(e.KeyChar) = -1 Then
' Invalid Character
e.Handled = True
End If
if tText.Text.Length >= 11 then
e.Handled = True
End If

I use this for the keypress event
If e.KeyChar < CStr(0) Or e.KeyChar > CStr(9) Then e.Handled = True
Actually that looks different to what i remember using, but it works. Though you'll need to allow backspace too.
Or i guess even shorter would be
If Not IsNumeric(e.KeyChar) Then e.Handled = True
also keypress event.
You can set the maximum length of a textbox using MaxLength

set max length to 12 put this in keypress of text1 and it will format it with dashes and only numbers
If Len(Text1.Text) = 3 Or Len(Text1.Text) = 7 Then
Text1.Text = Text1.Text & "-"
Text1.SelStart = Len(Text1.Text)
End If
If KeyAscii <> 127 And KeyAscii <> 8 And KeyAscii <> 13 Then
If IsNumeric(Chr(KeyAscii)) = False Then
KeyAscii = 0
End If
ElseIf KeyAscii = 8 Then
If Right(Text1.Text, 1) = "-" Then
Text1.Text = Left(Text1.Text, Len(Text1.Text) - 1)
Text1.SelStart = Len(Text1.Text)
End If
End If
if you only want numeric text box use the following in the keypress
If KeyAscii <> 127 And KeyAscii <> 8 And KeyAscii <> 13 Then
If IsNumeric(Chr(KeyAscii)) = False Then
KeyAscii = 0
End If
End If

You can use the lostfocus event and in this event you can put something like this:
if not isnumeric(textbox1.text) then
textbox1.gotfocus 'this part is to validate only numbers in the texbox and not let
' him go from the texbox
endif
and you should define the maxlength for the textbox in just 11 characters

Related

KeyPress Visual Basic - Cursor nach Eingabe in TextBox setzen

I would like the following to be caught when typing into a TextBox:
The result must always look like this: X-70-XXXXX-XXX
The first X is a letter The 5 XXXXX must be numbers
The last three XXX must be a letter + numbers (e.g.: B23)
The catching is no problem. But now I want the -70- to be automatically appended to the first letter "S" after typing it. Unfortunately, it sets the cursor incorrectly so that the result is (-70-S)
Code:
Private Sub TB_Nr_Keypress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TB_Nr.KeyPress
Dim temp As String
Dim zaehlen As Integer
temp = TB_Nr.Text
zaehlen = TB_Nr.Text.Length
Try
Select Case zaehlen
Case 0
If e.KeyChar = "S" Or e.KeyChar = "M" Then
temp = temp + "-70-"
TB_Nr.Text = temp
TB_Nr.SelectionStart = TB_Nr.TextLength
Else
e.Handled = True
End If
Case Else
e.Handled = True
End Select
Catch ex As Exception
Console.WriteLine("Fehler")
End Try
End Sub
TB_Nr.SelectionStart = TB_Nr.TextLength Does not work. It only sees the content of the text box, which in this case is -70- and not my input, i.e. the letter "S".
What can I do here?
2:
.......
Select Case zaehlen
Case 0
If e.KeyChar = "S" Or e.KeyChar = "M" Then
temp.Text = e.KeyChar & "-70-"
temp.SelectionStart = temp.Text.Length
e.Handled = True
Else
e.Handled = True
End If
.....
Case 9
Select Case Asc(e.KeyChar)
Case 48 To 57
temp.Text = e.KeyChar & "-"
temp.SelectionStart = temp.Text.Length
e.Handled = True
......
You need the TextLength after you have set your final text. Your variable has what is before that.
Try this:
Private Sub TB_Nr_Keypress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TB_Nr.KeyPress
Dim tb As TextBox = CType(sender, TextBox)
Try
If tb.Text = "" Then
Select Case e.KeyChar
Case "S", "M"
tb.Text = e.KeyChar & "-70-"
tb.SelectionStart = tb.Text.Length
e.Handled = True
End Select
End If
Catch ex As Exception
Console.WriteLine("Fehler")
End Try
End Sub

How to check if text box max length has been exceeded?

My problem:
I'm limiting a text box to 8 characters and showing a tooltip when it's exceeded (>8) rather than reached (=8). Using the .Maxlength function prevents the user from ever exceeding 8 characters so my >8 function is never fulfilled.
If I forgo the .Maxlength function and instead use .Substring to limit the input, my >8 function is fulfilled however the behavior differs from .Substring (the last rather than first 8 inputs are kept and I lose the alert sound).
It would a lot cleaner to be able to check for whenever .Maxlength is exceeded without affecting the first 8 inputs.
To reproduce:
In Visual Studio, in design mode, drag a text box and tooltip onto a fresh form.
Use the following as is:
Code:
Public Class Form1
Private Sub Textbox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
TextBox1.MaxLength = 8
If (Not IsNumeric(TextBox1.Text) And TextBox1.Text.Length > 0) Then
If ToolTip1.GetToolTip(TextBox1) = "" Then
ToolTip1.ToolTipTitle = "Input must be numeric!"
ToolTip1.Active = True
ToolTip1.IsBalloon = True
ToolTip1.ToolTipIcon = ToolTipIcon.Warning
ToolTip1.Show(vbNewLine, TextBox1, 45, -40)
End If
ElseIf TextBox1.Text.Length > 8 Then
'TextBox1.Text = TextBox1.Text.Substring(0, 8)
ToolTip1.IsBalloon = True
ToolTip1.ToolTipTitle = "8 character maximum!"
ToolTip1.Active = True
ToolTip1.ToolTipIcon = ToolTipIcon.Warning
ToolTip1.Show(vbNewLine, TextBox1, 45, -40)
Else
ToolTip1.Active = False
ToolTip1.Hide(TextBox1)
End If
End Sub
End Class
When you replace the text, it resets the caret, so move it back into place at the end:
TextBox1.Text = TextBox1.Text.Substring(0, 8)
TextBox1.Select(TextBox1.TextLength, 0)
It is better to supress the key if it is invalid:
Private Sub TextBox1_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
Dim str As String
str = TextBox1.Text
str = str.Insert(TextBox1.SelectionStart, CStr(e.KeyChar))
If e.KeyChar = ChrW(Keys.Back) Then
HideToolTip()
ElseIf str.Length > 8 Then
ShowToolTip("8 character maximum!")
e.Handled = True
ElseIf Not IsNumeric(str) Then
ShowToolTip("Input must be numeric!")
e.Handled = True
Else
HideToolTip()
End If
End Sub
Private Sub HideToolTip()
If ToolTip1.GetToolTip(TextBox1) <> "" Then
ToolTip1.Active = False
ToolTip1.Hide(TextBox1)
End If
End Sub
Private Sub ShowToolTip(ByVal str As String)
'always check if tooltip is visible, to avoid inversion
If ToolTip1.GetToolTip(TextBox1) = "" Then
ToolTip1.ToolTipTitle = str
ToolTip1.Active = True
ToolTip1.IsBalloon = True
ToolTip1.ToolTipIcon = ToolTipIcon.Warning
ToolTip1.Show(vbNewLine, TextBox1, 45, -40, 1000)
End If
End Sub
EDIT
There is a minor "bug" in IsNumeric() function as it allows numeric with spaces and multiple "."
8..888 'is numeric
.9999 'is numeric
To solve everything:
Private Sub TextBox1_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
Dim str As String = "0123456789."
If e.KeyChar = ChrW(Keys.Back) Then
HideToolTip()
ElseIf TextBox1.Text.Length = 8 Then
ShowToolTip("8 character maximum!")
e.Handled = True
ElseIf e.KeyChar = "." And (TextBox1.Text.Contains(".") Or TextBox1.SelectionStart = 0) Then 'supress a second "." or a first one
ShowToolTip("Input must be numeric!")
e.Handled = True
ElseIf Not str.Contains(CStr(e.KeyChar)) Then
ShowToolTip("Input must be numeric!")
e.Handled = True
Else
HideToolTip()
End If
End Sub
Add this after the substring call
TextBox1.SelectionStart = 8

programmatically validate a text field for mobile number

in my application I need to validate mobile number text field in different forms. so I wish to write a
function for this purpose.my needs are:
text field accept only numbers(0-9).
error message will shown if any other characters are entered.
does't allow space but allow ctrl+c,ctrl+v,ctrl+x ans back sapce.
if ctrl+v(paste) is done it will check whether the string contains characters, if yes then display error message.
does anyone can help me to write such a function in limited number of code?
I had validated the following
Private Sub mob_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles stok.KeyPress
If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then ' check whether the keypress is a number
mob.ForeColor = Color.green
Else
mob.ForeColor = Color.Red
end if
end sub
Private Sub mob_LostFocus(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles stok.KeyPress
if mob.text="" then 'for check empty space
end sub
but this is not what I need. I need all the process executed within a function
I think a regular expression would be best for your needs, take a look at this:
http://www.authorcode.com/how-to-use-regular-expression-for-validating-phone-numbers-in-net/
As a side note: I find the Asc(e.KeyChar) extremely ugly, I would parse the char to an int and see what happens: If int.TryParse() fails: error, if not: well it's a number.
Public Sub mob_validation(ByVal e As System.Windows.Forms.KeyPressEventArgs, ByVal mob As TextBox)
If e.KeyChar = Chr(22) Then
Dim output As String = New String((From c As Char In Clipboard.GetText.ToString Select c Where Char.IsLetter(c)).ToArray())
If output = "" And Len(mob.Text) = 10 Then
mob.ForeColor = Color.Green
Else
mob.ForeColor = Color.Red
Clipboard.Clear()
End If
Else
If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
If Asc(e.KeyChar) <> 8 Then
If Asc(e.KeyChar) <> 3 Then
e.Handled = True
mob.ForeColor = Color.Red
End If
End If
Else
mob.ForeColor = Color.Green
End If
End If
End Sub

Get the full text of a textbox in a keypress event

This is my code:
Private Sub prices_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles wholeprice_input_new_item.KeyPress, dozenprice_input_new_item.KeyPress, detailprice_input_new_item.KeyPress, costprice_input_new_item.KeyPress
Dim TxtB As TextBox = CType(sender, TextBox)
Dim rex As Regex = New Regex("^[0-9]*[.]{0,1}[0-9]{0,1}$")
'MsgBox(TxtB.Text())
If (Char.IsDigit(e.KeyChar) Or e.KeyChar.ToString() = "." Or e.KeyChar = CChar(ChrW(Keys.Back))) Then
If (TxtB.Text.Trim() <> "") Then
If (rex.IsMatch(TxtB.Text) = False And e.KeyChar <> CChar(ChrW(Keys.Back))) Then
e.Handled = True
End If
End If
Else
e.Handled = True
End If
End Sub
The textbox's Text property doesn't include the last character pressed, example:
Text entered = "12.1"
TxtB.Text = "12."
Text entered = "11.."
TxtB.Text = "11."
Text entered = "12"
TxtB.Text = "1"
I want to validate all the characters. How I can make the event keypress validate all characters in a text box?
The problem is that in the KeyPress event, the key that's being pressed is not yet added to the textbox. You could add the character that's being pressed to the existing text, something like this:
Dim TxtB As TextBox = CType(sender, TextBox)
If (Char.IsDigit(e.KeyChar) OrElse e.KeyChar = "."c Then
Dim fullText As String = TxtB.Text & e.KeyChar
'Do validation with fullText
End If
Actually, it's a little more complicated than that - what if the user pressed the backspace key, for instance? You might be better advised to use the TextChanged event instead, which fires after the Text property has been updated by the last key pressed.

VB.net Need Text Box to Only Accept Numbers

I'm fairly new to VB.net (self taught) and was just wondering if someone out there could help me out with some code. I'm not trying to do anything too involved, just have a TextBox that accepts a numeric value from 1 to 10. I don't want it to accept a string or any number above 10. If someone types a word or character an error message will appear, telling him to enter a valid number. This is what I have; obviously it's not great as I am having problems. Thanks again to anyone who can help.
If TxtBox.Text > 10 Then
MessageBox.Show("Please Enter a Number from 1 to 10")
TxtBox.Focus()
ElseIf TxtBox.Text < 10 Then
MessageBox.Show("Thank You, your rating was " & TxtBox.Text)
Total = Total + 1
ElseIf IsNumeric(TxtBox.Text) Then
MessageBox.Show("Thank you, your rating was " & ValueTxtBox.Text)
End If
ValueTxtBox.Clear()
ValueTxtBox.Focus()
You can do this with the use of Ascii integers. Put this code in the Textbox's Keypress event. e.KeyChar represents the key that's pressed. And the the built-in function Asc() converts it into its Ascii integer.
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
'97 - 122 = Ascii codes for simple letters
'65 - 90 = Ascii codes for capital letters
'48 - 57 = Ascii codes for numbers
If Asc(e.KeyChar) <> 8 Then
If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
e.Handled = True
End If
End If
End Sub
This is what I did in order to handle both key entry and copy/paste.
Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox.KeyPress
If Not Char.IsNumber(e.KeyChar) AndAlso Not Char.IsControl(e.KeyChar) Then
e.Handled = True
End If
End Sub
Private Sub TextBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox.TextChanged
Dim digitsOnly As Regex = New Regex("[^\d]")
TextBox.Text = digitsOnly.Replace(TextBox.Text, "")
End Sub
If you want to allow decimals and negative amount, add
AndAlso Not e.KeyChar = "." AndAlso Not e.keyChar = "-"
to the if statement in the KeyPress section.
Simplest ever solution for TextBox Validation in VB.NET
First, add new VB code file in your project.
Go To Solution Explorer
Right Click to your project
Select Add > New item...
Add new VB code file (i.e. example.vb)
or press Ctrl+Shift+A
COPY & PASTE following code into this file and give it a suitable name. (i.e. KeyValidation.vb)
Imports System.Text.RegularExpressions
Module Module1
Public Enum ValidationType
Only_Numbers = 1
Only_Characters = 2
Not_Null = 3
Only_Email = 4
Phone_Number = 5
End Enum
Public Sub AssignValidation(ByRef CTRL As Windows.Forms.TextBox, ByVal Validation_Type As ValidationType)
Dim txt As Windows.Forms.TextBox = CTRL
Select Case Validation_Type
Case ValidationType.Only_Numbers
AddHandler txt.KeyPress, AddressOf number_Leave
Case ValidationType.Only_Characters
AddHandler txt.KeyPress, AddressOf OCHAR_Leave
Case ValidationType.Not_Null
AddHandler txt.Leave, AddressOf NotNull_Leave
Case ValidationType.Only_Email
AddHandler txt.Leave, AddressOf Email_Leave
Case ValidationType.Phone_Number
AddHandler txt.KeyPress, AddressOf Phonenumber_Leave
End Select
End Sub
Public Sub number_Leave(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
Dim numbers As Windows.Forms.TextBox = sender
If InStr("1234567890.", e.KeyChar) = 0 And Asc(e.KeyChar) <> 8 Or (e.KeyChar = "." And InStr(numbers.Text, ".") > 0) Then
e.KeyChar = Chr(0)
e.Handled = True
End If
End Sub
Public Sub Phonenumber_Leave(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
Dim numbers As Windows.Forms.TextBox = sender
If InStr("1234567890.()-+ ", e.KeyChar) = 0 And Asc(e.KeyChar) <> 8 Or (e.KeyChar = "." And InStr(numbers.Text, ".") > 0) Then
e.KeyChar = Chr(0)
e.Handled = True
End If
End Sub
Public Sub OCHAR_Leave(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
If InStr("1234567890!##$%^&*()_+=-", e.KeyChar) > 0 Then
e.KeyChar = Chr(0)
e.Handled = True
End If
End Sub
Public Sub NotNull_Leave(ByVal sender As Object, ByVal e As System.EventArgs)
Dim No As Windows.Forms.TextBox = sender
If No.Text.Trim = "" Then
MsgBox("This field Must be filled!")
No.Focus()
End If
End Sub
Public Sub Email_Leave(ByVal sender As Object, ByVal e As System.EventArgs)
Dim Email As Windows.Forms.TextBox = sender
If Email.Text <> "" Then
Dim rex As Match = Regex.Match(Trim(Email.Text), "^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*#([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,3})$", RegexOptions.IgnoreCase)
If rex.Success = False Then
MessageBox.Show("Please Enter a valid Email Address", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Email.BackColor = Color.Red
Email.Focus()
Exit Sub
Else
Email.BackColor = Color.White
End If
End If
End Sub
End Module
Now use following code to Form Load Event like below.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AssignValidation(Me.TextBox1, ValidationType.Only_Digits)
AssignValidation(Me.TextBox2, ValidationType.Only_Characters)
AssignValidation(Me.TextBox3, ValidationType.No_Blank)
AssignValidation(Me.TextBox4, ValidationType.Only_Email)
End Sub
Done..!
You must first validate if the input is actually an integer. You can do it with Integer.TryParse:
Dim intValue As Integer
If Integer.TryParse(TxtBox.Text, intValue) AndAlso intValue > 0 AndAlso intValue < 11 Then
MessageBox.Show("Thank You, your rating was " & TxtBox.Text)
Else
MessageBox.Show("Please Enter a Number from 1 to 10")
End If
Try this:
Private Sub txtCaseID_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtCaseID.KeyPress
If Not Char.IsNumber(e.KeyChar) AndAlso Not Char.IsControl(e.KeyChar) Then e.KeyChar = ""
End Sub
You could avoid any code by using a NumericUpDown control rather than a text box, this automatically only allows numbers and has a max and min.
It also allow accessing the number directly with NumericUpDown1.Value as well as using up and down arrows to set the number.
Also if a number higher/over the max is entered it will jump to the nearest allowed number.
Private Sub MyTextBox_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles MyTextBox.KeyPress
If Not IsNumeric(e.KeyChar) And Not e.KeyChar = ChrW(Keys.Back) Then
e.Handled = True
End If
End Sub
Private Sub textBox5_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles textBox5.KeyPress
If Asc(e.KeyChar) <> 8 Then
If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
e.Handled = True
End If
End If
End Sub
Private Sub Data_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Data.KeyPress
If (Not e.KeyChar = ChrW(Keys.Back) And ("0123456789.").IndexOf(e.KeyChar) = -1) Or (e.KeyChar = "." And Data.Text.ToCharArray().Count(Function(c) c = ".") > 0) Then
e.Handled = True
End If
End Sub
Dim ch(10) As Char
Dim len As Integer
len = TextBox1.Text.Length
ch = TextBox1.Text.ToCharArray()
For i = 0 To len - 1
If Not IsNumeric(ch(i)) Then
MsgBox("Value you insert is not numeric")
End If
Next
If Not Char.IsNumber(e.KeyChar) AndAlso Not e.KeyChar = "." AndAlso Not Char.IsControl(e.KeyChar) Then
e.KeyChar = ""
End If
This allow you to use delete key and set decimal points
I know this post is old but I wanted to share something I have implemented to turn a TextBox into what I call an IntBox.
First you need to make an extension with:
<Runtime.CompilerServices.Extension()> _
Public Function HandledStringtoInteger(s As String) As Integer
Try
If s = String.Empty Then
Return 0
Else
Return Integer.Parse(s)
End If
Catch
Dim result As String = String.Empty
Dim ReturnInt As Integer
Dim Parsed As Integer
For Each Character In s.ToCharArray
If Character = "-" Then
If s.Substring(0, 1).ToString <> "-" Then
result = Character + result
End If
End If
If Character = "." Then
Exit For
End If
If Integer.TryParse(Character, Parsed) Then
result = result + Parsed.ToString
End If
Next
If result <> String.Empty Then
If Integer.TryParse(result, ReturnInt) Then
Return Integer.Parse(ReturnInt)
Else
If Double.Parse(result) > Double.Parse(Integer.MaxValue.ToString) Then
Return Integer.MaxValue
ElseIf Double.Parse(result) < Double.Parse(Integer.MinValue.ToString) Then
Return Integer.MinValue
Else
Return Integer.Parse(ReturnInt)
End If
End If
Else
Return 0
End If
End Try
End Function
Then make a TextChanged event sub:
Private Sub TextBox_to_IntBox(sender As Object, e As TextChangedEventArgs) Handles YourTextBox.TextChanged
If DirectCast(sender, TextBox).IsKeyboardFocused Then
DirectCast(sender, TextBox).Text = DirectCast(sender, TextBox).Text.HandledStringtoInteger
DirectCast(sender, TextBox).CaretIndex = DirectCast(sender, TextBox).Text.Length
End If
End Sub
Then whenever the user enters text it evaluates the string and only returns numeric values that are within the bounds of a standard Integer. With the "-" character you can change the integer from positive to negative and back again.
If anyone sees anything that can improve this code let me know but my tests show this works fantastic to make an IntBox.
EDIT:
I found another method that can work if you use properties in your code. (Note this will need a separate property per TextBox)
First create the property:
Public Class Properties
Implement INotifyPropertyChanged
Private _Variable as Integer
Public Property YourProperty as Object
get
Return _Variable
end get
set(value as Object)
_Variable = value.ToString.ToInteger 'I will give the ToInteger extension code later
end set
end property
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Public Sub OnPropertyChange(ByVal e As PropertyChangedEventArgs)
If Not PropertyChangedEvent Is Nothing Then
RaiseEvent PropertyChanged(Me, e)
End If
End Sub
End Class
Then make the binding in your window's main class:
Public WithEvents _YourVariable as New Properties
Public Sub New()
InitializeComponent()
With YourTextBox
.SetBinding(Textbox.TextProperty, New Binding("YourProperty"))
.DataContext = _YourVariable
End With
End Sub
Finally here is the ToInteger Extension Code I set up:
''' <summary>
''' Handles conversion of variable to Integer.
''' </summary>
''' <param name="X"></param>
''' <param name="I">Returned if conversion fails.</param>
''' <returns>Signed 32bit Integer</returns>
''' <remarks></remarks>
<Runtime.CompilerServices.Extension()> _
Public Function toInteger(Of T)(ByRef X As T, Optional I As Integer = 0) As Integer
Dim S As String = X.ToString
Try
If S = String.Empty Then
Return I
Else
Return Integer.Parse(S)
End If
Catch
Dim result As String = String.Empty
Dim ReturnInt As Integer
Dim Parsed As Byte
For Each Character In S.ToCharArray
If Character = "-" Then
If S.Substring(0, 1).ToString <> "-" Then
result = Character + result
End If
End If
If Character = "." Then
Exit For
End If
If Byte.TryParse(Character, Parsed) Then
result = result + Parsed.ToString
End If
Next
If result <> String.Empty Then
If Integer.TryParse(result, ReturnInt) Then
Return Integer.Parse(ReturnInt)
Else
If Double.Parse(result) > Double.Parse(Integer.MaxValue.ToString) Then
Return Integer.MaxValue
ElseIf Double.Parse(result) < Double.Parse(Integer.MinValue.ToString) Then
Return Integer.MinValue
Else
Return Integer.Parse(ReturnInt)
End If
End If
Else
Return I
End If
End Try
End Function
With all these combined whenever they type something into the box it will act as if it were a textbox but when they change focus the ToInteger extension will set the value as an integer into the property and return it to the textbox.
Meaning that if the operator entered "-1w3" after focus changes it will return as "-13" automatically.
This may be too late, but for other new blood on VB out there, here's something simple.
First, in any case, unless your application would require, blocking user's key entry is somehow not a good thing to do, users may misinterpret the action as problem on the hardware keyboard and at the same time may not see where their keypreesed entry error came from.
Here's a simple one, let user's freely type their entry then trap the error later:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim theNumber As Integer
Dim theEntry As String = Trim(TextBox1.Text)
'This check if entry can be converted to
'numeric value from 0-10, if cannot return a negative value.
Try
theNumber = Convert.ToInt32(theEntry)
If theNumber < 0 Or theNumber > 10 Then theNumber = -1
Catch ex As Exception
theNumber = -1
End Try
'Trap for the valid and invalid numeric number
If theNumber < 0 Or theNumber > 10 Then
MsgBox("Invalid Entry, allows (0-10) only.")
'entry was invalid return cursor to entry box.
TextBox1.Focus()
Else
'Entry accepted:
' Continue process your thing here...
End If
End Sub
I have the solution where it will check whether the text is range 1 to 10 : [1-9] will check for the range from 1 to 9. I use one more condition to check for 10.
If txtBox.Text Like "[1-9]" Or txtBox.Text Like "10" Then
MessageBox.Show("true")
Else
MessageBox.Show("false")
End If
First of all set the TextBox's MaxLength to 2 that will limit the amount of text entry in your TextBox. Then you can try something like this using the KeyPress Event. Since you are using a 2 digit maximum (10) you will need to use a Key such as Enter to initiate the check.
Private Sub TextBox1_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
Dim tb As TextBox = CType(sender, TextBox)
If Not IsNumeric(e.KeyChar) Then 'Check if Numeric
If Char.IsControl(e.KeyChar) Then 'If not Numeric Check if a Control
If e.KeyChar = ChrW(Keys.Enter) Then
If Val(tb.Text) > 10 Then 'Check Bounds
tb.Text = ""
ShowPassFail(False)
Else
ShowPassFail(True)
End If
e.Handled = True
End If
Exit Sub
End If
e.Handled = True
ShowPassFail(False)
End If
End Sub
Private Sub ShowPassFail(pass As Boolean)
If pass Then
MessageBox.Show("Thank you, your rating was " & TextBox1.Text)
Else
MessageBox.Show("Please Enter a Number from 1 to 10")
End If
TextBox1.Clear()
TextBox1.Focus()
End Sub
Public Function Isnumber(ByVal KCode As String) As Boolean
If Not Isnumeric(KCode) And KCode <> ChrW(Keys.Back) And KCode <> ChrW(Keys.Enter) And KCode <> "."c Then
MsgBox("Please Enter Numbers only", MsgBoxStyle.OkOnly)
End If
End Function
Private Sub txtBalance_KeyPress(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles txtBalance.KeyPress
If Not Isnumber(e.KeyChar) Then
e.KeyChar = ""
End If
End Sub
This worked for me... just clear the textbox completely as non-numeric keys are pressed.
Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
If IsNumeric(TextBox2.Text) Then
'nada
Else
TextBox2.Clear()
End If
End Sub
Copy this function in any module inside your vb.net project.
Public Function MakeTextBoxNumeric(kcode As Integer, shift As Boolean) As Boolean
If kcode >= 96 And kcode <= 105 Then
ElseIf kcode >= 48 And kcode <= 57
If shift = True Then Return False
ElseIf kcode = 8 Or kcode = 107 Then
ElseIf kcode = 187 Then
If shift = False Then Return False
Else
Return False
End If
Return True
End Function
Then use this function inside your textbox_keydown event like below:
Private Sub txtboxNumeric_KeyDown(sender As Object, e As KeyEventArgs) Handles txtboxNumeric.KeyDown
If MakeTextBoxNumeric(e.KeyCode, e.Shift) = False Then e.SuppressKeyPress = True
End Sub
And yes. It works 100% :)
You can use the onkeydown Property of the TextBox for limiting its value to numbers only.
<asp:TextBox ID="TextBox1" runat="server" onkeydown = "return (!(event.keyCode>=65) && event.keyCode!=32);"></asp:TextBox>
!(keyCode>=65) check is for excludng Alphabets.
keyCode!=32 check is for excluding Space character inbetween the numbers.
If you want to exclude Symbols also from entering into the textbox, then include the below condition also in the 'onkeydown' property.
!(event.shiftKey && (event.keyCode >= 48 && event.keyCode <= 57))
Thus the TextBox will finally become
<asp:TextBox ID="TextBox1" runat="server" onkeydown = "return (!(event.keyCode>=65) && event.keyCode!=32 && !(event.shiftKey && (event.keyCode >= 48 && event.keyCode <= 57)));"></asp:TextBox>
Explanation:
KeyCode for 'a' is '65' and 'z' is '90'.
KeyCodes from '90' to '222' which are other symbols are also not needed.
KeyCode for 'Space' Key is '32' which is also not needed.
Then a combination of 'Shift' key and 'Number' keys (which denotes Symbols) also not needed. KeyCode for '0' is '48' and '9' is '57'.
Hence all these are included in the TextBox declaration itself which produces the desired result.
Try and see.
This was my final... It gets around all the type issues also:
Here is a simple textbox that requires a number:
public Sub textbox_memorytotal_TextChanged(sender As Object, e As EventArgs) Handles textbox_memorytotal.TextChanged
TextboxOnlyNumbers(sender)
End Sub
and here is the procedure that corrects all bad input:
Public Sub TextboxOnlyNumbers(ByRef objTxtBox As TextBox)
' ONLY allow numbers
If Not IsNumeric(objTxtBox.Text) Then
' Don't process things like too many backspaces
If objTxtBox.Text.Length > 0 Then
MsgBox("Numerical Values only!")
Try
' If something bad was entered delete the last character
objTxtBox.Text = objTxtBox.Text.Substring(0, objTxtBox.Text.Length - 1)
' Put the cursor and the END of the corrected number
objTxtBox.Select(objTxtBox.Text.Length + 1, 1)
Catch ex As Exception
End Try
End If
End If
End Sub
Use this in your Textbox Keydown event.
Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
'you can enter decimal "if nonNumberEntered(e, TextBox1, True) then"
'otherwise just numbers "if nonNumberEntered(e, TextBox1) then"
If nonNumberEntered(e, TextBox1, True) Then
e.SuppressKeyPress = True
End If
If e.KeyCode = Keys.Enter Then
'put your code here
End If
End Sub
Copy this function in any module inside your vb.net project.
Public Function nonNumberEntered(ByVal e As System.Windows.Forms.KeyEventArgs, _
ByVal ob As TextBox, _
Optional ByVal decim As Boolean = False) As Boolean
nonNumberEntered = False
If decim Then
' Determine whether the keystroke is a number from the top of the keyboard.
If e.KeyCode < Keys.D0 OrElse e.KeyCode > Keys.D9 Then
' Determine whether the keystroke is a number from the keypad.
If e.KeyCode < Keys.NumPad0 OrElse e.KeyCode > Keys.NumPad9 Then
If e.KeyCode <> Keys.Decimal And e.KeyCode <> Keys.OemPeriod Then
If e.KeyCode <> Keys.Divide And e.KeyCode <> Keys.OemQuestion Then
' Determine whether the keystroke is a backspace.
If e.KeyCode <> Keys.Back And e.KeyCode <> Keys.Delete _
And e.KeyCode <> Keys.Left And e.KeyCode <> Keys.Right Then
' A non-numerical keystroke was pressed.
nonNumberEntered = True
End If
ElseIf ob.Text.Contains("/") Or ob.Text.Length = 0 Then
nonNumberEntered = True
End If
ElseIf ob.Text.Contains(".") Or ob.Text.Length = 0 Then
nonNumberEntered = True
End If
End If
End If
Else
' Determine whether the keystroke is a number from the top of the keyboard.
If e.KeyCode < Keys.D0 OrElse e.KeyCode > Keys.D9 Then
' Determine whether the keystroke is a number from the keypad.
If e.KeyCode < Keys.NumPad0 OrElse e.KeyCode > Keys.NumPad9 Then
' Determine whether the keystroke is a backspace.
If e.KeyCode <> Keys.Back And e.KeyCode <> Keys.Delete _
And e.KeyCode <> Keys.Left And e.KeyCode <> Keys.Right Then
' A non-numerical keystroke was pressed.
nonNumberEntered = True
End If
End If
End If
End If
'If shift key was pressed, it's not a number.
If Control.ModifierKeys = Keys.Shift Then
nonNumberEntered = True
End If
End Function
This will allow numbers like 2/4 or numbers like 3.5 to be entered in your textbox if using decim "nonNumberEntered(e,Textbox1, True)".
Allows only numbers to be entered in textbox if using "nonNumberEntered(e,Textbox1, False)" or "nonNumberEntered(e,Textbox1)".
Edit: added text.
I had a similar use requirement recently for a TextBox which could only take numbers.
In the end I used a MaskedTextBox instead of a TextBox. You define a "mask" for the textbox and it will only accept characters which you have defined - in this case, numbers. The downside is that it leaves a bit of an ugly line within the TextBox;
What I loved about the MaskedTextBox was it was so customisable. If, for whatever reason you wanted a TextBox to only accept an input in the format of 3 ints followed by 2 letters, all you need to do is set the TextMask to 000LL. There are a load of pre-defined masks within Visual Studio, and the full documentation can be found here.
Now, I know this doesn't fully solve your issue, but the use of a MaskedTextBox takes away a huge part of the complexity of the problem. You can now guarantee that the contents of the MaskedTextBox will only ever be an Int, allowing you to run a simple If statement to ensure the value is =<10
I know this post is old but I want to share my code.
Private Sub txtbox1_TextChanged(sender As Object, e As EventArgs) Handles txtbox1.TextChanged
If txtbox1.Text.Length > 0 Then
If Not IsNumeric(txtbox1.Text) Then
Dim sel As Integer = txtbox1.SelectionStart
txtbox1.Text = txtbox1.Text.Remove(sel - 1, 1)
txtbox1.SelectionStart = sel - 1
End If
End If
End Sub
On each entry in textbox (event - Handles RestrictedTextBox.TextChanged), you can do a try to caste entered text into integer, if failure occurs, you just reset the value of the text in RestrictedTextBox to last valid entry (which gets constantly updating under the temp1 variable).
Here's how to go about it. In the sub that loads with the form (me.load or mybase.load), initialize temp1 to the default value of RestrictedTextBox.Text
Dim temp1 As Integer 'initialize temp1 default value, you should do this after the default value for RestrictedTextBox.Text was loaded.
If (RestrictedTextBox.Text = Nothing) Then
temp1 = Nothing
Else
Try
temp1 = CInt(RestrictedTextBox.Text)
Catch ex As Exception
temp1 = Nothing
End Try
End If
At any other point in form:
Private Sub textBox_TextChanged(sender As System.Object, e As System.EventArgs) Handles RestrictedTextBox.TextChanged
Try
temp1 = CInt(RestrictedTextBox.Text) 'If user inputs integer, this will succeed and temp will be updated
Catch ex As Exception
RestrictedTextBox.Text = temp1.ToString 'If user inputs non integer, textbox will be reverted to state the state it was in before the string entry
End Try
End Sub
The nice thing about this is that you can use this to restrict a textbox to any type you want: double, uint etc....
every text box has a validating and validated event you can use then as follows :-
Private Sub PriceTxt_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles PriceTxt.Validating
If Not IsNumeric(PriceTxt.Text) Then
PriceTxt.BackColor = Color.Red
MsgBox("The Price Should Be Numeric Only , Enter Again", vbCritical)
PriceTxt.Text = ""
PriceTxt.BackColor = Color.White
End If
End Sub
I know it's old.. I'll just leave this code here for the sake of convenience.
Integer only:
Public Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
With TextBox1
If IsNumeric(.Text) Then .Text = .Text.Select(Function(x) If(IsNumeric(x), x, "")) : .SelectionStart = .TextLength
End With
' etc..
End Sub
Accepts Double:
Public Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
With TextBox1
If IsNumeric(.Text) Then .Text = .Text.Select(Function(x) If(IsNumeric(x) Or x = ".", x, "")) : .SelectionStart = .TextLength
End With
' etc..
End Sub
Accepts basic operations + - * /, parentheses ( ) [ ] { } and Double:
Public Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
With TextBox1
If IsNumeric(.Text) Then .Text = .Text.Select(Function(x) If(IsNumeric(x) Or ".+-*/()[]{}".Contains(x), x, "")) : .SelectionStart = .TextLength
End With
' etc..
End Sub
You Can use Follow code Textbox Keypress Event:
Private Sub txtbox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtbox1.KeyPress
Try
If Val(txtbox1.text) < 10 Then
If Char.IsLetterOrDigit(e.KeyChar) = False And Char.IsControl(e.KeyChar) = False Then
e.Handled = True
End If
Else
e.Handled = True
End If
Catch ex As Exception
ShowException(ex.Message, MESSAGEBOX_TITLE, ex)
End Try
End Sub
This code allow numbers only and you can enter only number between 1 to 10.
Very simple piece of code that works for me.
Private Sub Textbox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles textbox1.KeyPress
If Asc(e.KeyChar) > 58 Then
e.KeyChar = ""
End If
End Sub
Here's what works for me. It allows backspace, del, as well as numbers from the top row of the keyboard and the number pad. It excludes the + and - signs.
Private Sub tbMQTTPort_KeyDown(sender As Object, e As KeyEventArgs) Handles tbMQTTPort.KeyDown
Dim kc As New KeyConverter
Dim Regex = New Regex("[^0-9]+")
e.Handled = Regex.IsMatch(kc.ConvertToInvariantString(e.Key).Replace("NumPad", ""))
End Sub