Link to home
Start Free TrialLog in
Avatar of Philippe Renaud
Philippe RenaudFlag for Canada

asked on

restrict keychars on textbox

Hi EE,

I need to restrict keyPress on a textBox. I only want the following :

Any digits before the dot, then after the dot only one of those:   25, 50 75

so for examples this is good:


this is wrong:


can you help ?
Avatar of Meir Rivkin
Meir Rivkin
Flag of Israel image


Private Sub textBox1_KeyDown(sender As Object, e As KeyEventArgs)
	e.Handled = EvaluateText(e.KeyChar)
End Sub

Private Function EvaluateText(key As String) As Boolean
        If key = "." And textBox1.Text.Contains(".") Then
            Return False
        End If

        Dim data As String = textBox1.Text + key
       Dim d As Decimal = Decimal.Parse(data)
        Dim dec As Decimal = d - Math.Floor(d)
        Dim arr As Decimal() = {0.25D, 0.5D, 0.75D, 0}

        If arr.Contains(dec) Then
            Return True
        End If
        Return False

    End Function

Open in new window

Avatar of Philippe Renaud


what is d ?
nevermind ..
Avatar of Meir Rivkin
Meir Rivkin
Flag of Israel image

Link to home
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
if I add Cchar(Backspace) i would put it where?
it would be easier for you to have numeric control and combobox control with {.25,.50,.75,0} values.
User generated image
cause the validation code is overkill to what you want to achieve.
using 2 controls and your validation is complete, no errors.
thanks, let me think about that combox Box yes.
I'd suggest deriving from the existing TextBox so that you have a resusable component.


Public Class QuarterlyTextbox
    Inherits TextBox

    Private _validKeys As New List(Of Keys) From
            Keys.D0, Keys.NumPad0,
            Keys.D1, Keys.NumPad1,
            Keys.D2, Keys.NumPad2,
            Keys.D3, Keys.NumPad3,
            Keys.D4, Keys.NumPad4,
            Keys.D5, Keys.NumPad5,
            Keys.D6, Keys.NumPad6,
            Keys.D7, Keys.NumPad7,
            Keys.D8, Keys.NumPad8,
            Keys.D9, Keys.NumPad9,
            Keys.Decimal, Keys.OemPeriod

    Private _controlKeys As New List(Of Keys) From
            Keys.Back, Keys.Delete,
            Keys.Left, Keys.Right,
            Keys.Home, Keys.End

    Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
        If _controlKeys.Contains(e.KeyData) Then
        End If

        If (Not _validKeys.Contains(e.KeyData)) OrElse
           (Me.Text.EndsWith(".25") OrElse Me.Text.EndsWith(".50") OrElse Me.Text.EndsWith(".75")) OrElse
           (Me.Text.Contains(".") AndAlso (e.KeyData = Keys.Decimal OrElse e.KeyData = Keys.OemPeriod)) OrElse
           (Me.Text.EndsWith(".") AndAlso e.KeyData <> Keys.D2 AndAlso e.KeyData <> Keys.NumPad2 _
                                  AndAlso e.KeyData <> Keys.D5 AndAlso e.KeyData <> Keys.NumPad5 _
                                  AndAlso e.KeyData <> Keys.D7 AndAlso e.KeyData <> Keys.NumPad7) OrElse
           ((Me.Text.EndsWith(".2") OrElse Me.Text.EndsWith(".7")) AndAlso e.KeyData <> Keys.D5 AndAlso e.KeyData <> Keys.NumPad5) OrElse
           (Me.Text.EndsWith(".5") AndAlso e.KeyData <> Keys.D0 AndAlso e.KeyData <> Keys.NumPad0) Then
            e.SuppressKeyPress = True
            e.Handled = True
        End If

    End Sub

End Class

Open in new window

If you added this code to your project, then built it, you would then have a component you can drag from the ToolBox onto your form.

User generated image