Click here to Skip to main content
Licence 
First Posted 17 Jan 2003
Views 138,551
Bookmarked 29 times

VB.NET Maskedbox Control - Final Release

By | 17 Jan 2003 | Article
A very useful maskedbox control using vb.net

Sample Image - MaskedBox_Control.jpg

Introduction

VB.NET does not have a masked texbox and it's very important for user input. So I have made it myself because the components I have found is not good enough for me.

Details

  • The "#" character in the mask is used for digit only
  • The "&" character accepts letter or digit
  • Supported mask symbols are "-", ".", ",", "/", "\", ":"

Using Component

The use of this component is very simple. You have to select the toolbox panel, right click in the windows forms section and select customize toolbox.

Select .NET framework components, then click browse and select maskedbox.dll in the download path. The maskedbox component will appear at the end of windows forms panel. Now select the component and drop it on a form.

Then set the mask property with any combination of valid characters

Ex. ##.###.####-###.###/###

History

  • Initial - I fixed a bug where the space key is not recognized. This version inherits a textbox component to publish all features of the textbox plus maskedbox
  • 20-jan-2003 Fixes - Function keys now are not handled by control. They cause an invalid character in between the text. The function SetText has been created. Programatically changing the text value in control din't change the masked text, so I created this function where the parameter is a string to fill the text (with no mask). If the text is "", then the text and mask is cleared with a empty mask.
  • 21-jan-2003 - The Final Release!!! I hope! Accept all characters and function keys. The delete key is working now !

Comments

Any comments ? Email me at pdvtech@terra.com.br. Visit my business site at www.pdvtech.com.br.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

RicardoPDV

Web Developer

Brazil Brazil

Member

Im a 33 years old and work developing applications since 14 years old
 
COBOL, my first language (i love)
BASIC, i born know
 
Visual Basic Rock's


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralGreat Help - Thanks Pinmembermbusfield4:14 26 Nov '06  
GeneralSuggested enhancements PinmemberVBProEd8:45 31 Dec '05  
Thanks for the simplistic code that was easy to read and modify for my purposes. There are several masked edit controls in this forum that honestly don't work or were poorly tested. I thought I would share the enhancements to my version for the stated valid reasons. My scope for these changes was around date formatting/editing.
 
1. If a user selects the entire field for delete (to re-type), the control should clear out the entire field. Once the user starts typing, the mask automatically fills in and the user can start typing the new date. Here is my code addition:
 
Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
Dim tmpset = Me.SelectionStart
 
On Error Resume Next
Select Case e.KeyCode
Case Keys.Delete
If Len(Me.SelectedText) = Len(Me.Text) Then
Me.Text = String.Empty
Exit Select
End If

Me.Text = ""
For a = tmpset To aMask.Length - 1
Select Case aMskMask.GetValue(a + 1)
Case ".", "-", "\", "/", ","
aMask.SetValue(aMask.GetValue(a + 2), a)
a = a + 1
Case Else
aMask.SetValue(aMask.GetValue(a + 1), a)
End Select
Next
 
aMask.SetValue(CType("_", Char), aMask.Length - 1)
 
e.Handled = True
 
Me.Text = ""
For a = 0 To aMask.Length - 1
Me.Text += aMask.GetValue(a)
Next
Me.SelectionStart = tmpset
 
End Select
End Sub

 
2. With SQL Server, DateTime values with leading zeroes are stored as m/d/yyyy, mm/d/yyyy and m/dd/yyyy (no leading zeroes). This creates havoc in a control when attempting to edit the "as stored" value since most data entry is done heads down without concern of field delimiters. I added the following events to handle re-formatting the date when first entering then leaving the control. These events also handle any input field defined with a mask of ##/##/#### and the user does not enter the Century date value.
 
Note: You should always set the "MaxLength" property on MaskedBox to either 8 or 10 (for dates) so that the user can automatically move to the next control.
 
Protected Overrides Sub OnEnter(ByVal e As System.EventArgs)
MyBase.Text = Me.FormatData(Me.Text())
End Sub
 
Protected Overrides Sub OnLeave(ByVal e As System.EventArgs)
MyBase.Text = Me.FormatData(Me.Text())
End Sub
 
Protected Function FormatData(ByVal sText As String) As String
 
If sText Is Nothing Or sText Is String.Empty Then
Exit Function
Else
sText = sText.Replace("_", "")
 
If Len(Me.Mask) < 10 Then
Try
Dim MyDate As DateTime = CType(sText, Date)
Return MyDate.ToString("MM/dd/yy")
 
Catch
 
Return sText
 
End Try
Else
Try
Dim MyDate As DateTime = CType(sText, Date)
Return MyDate.ToString("MM/dd/yyyy")
 
Catch
 
Return sText
 
End Try
End If
 
End If
 
End Function

 
3. For those folks using SQL Server with controls bound to datasets that don't want to show the "as stored" date value from SQL Server, add the following handler and subroutine for all date field reformatting in your form.
 
Note: User-Defined Date/Time Formats (Format Function) - Unlike previous versions of Visual Basic, the Format function characters are case-sensitive. "MM" is not the same as "mm".

AddHandler txtMyDateField1.DataBindings("Text").Format, AddressOf Format
AddHandler txtMyDateField2.DataBindings("Text").Format, AddressOf Format
 
Public Sub Format(ByVal sender As Object, ByVal e As Windows.Forms.ConvertEventArgs)
'This subroutine converts any SQL Server timedate to mm/dd/yy format
If Not IsDBNull(e.Value) Then
Dim MyDate As DateTime = CType(e.Value, Date)
e.Value = MyDate.ToString("MM/dd/yy")
End If
End Sub

 
Enjoy!Big Grin | :-D
JokeRe: Suggested enhancements PinmemberRicardoPDV1:45 3 Jan '06  
Generalmiguelfantastic Pinmembermiguelfantastic13:03 27 May '05  
GeneralProblem in Using this Control Pinmembernamasteall20004:21 1 Oct '04  
GeneralBackspace Bug PinmemberAnAverageJoe5:54 9 Jun '04  
GeneralRe: Backspace Bug PinmemberMrGTI4:32 1 Oct '04  
GeneralRe: Backspace Bug Pinmemberbuffbuh12:54 28 Mar '07  
GeneralAbsolutely Clueless.... PinmemberTheKanuck3:02 27 May '04  
GeneralRe: Absolutely Clueless.... PinmemberXpto00118:24 29 Oct '04  
GeneralPoor Control Load PinmemberMrGTI4:30 23 Sep '03  
GeneralRe: Poor Control Load Pinmembernamasteall20004:13 1 Oct '04  
GeneralBUG Pinmemberbalu_vee3:34 14 Aug '03  
GeneralRe: BUG Pinmembernamasteall20004:14 1 Oct '04  
GeneralOption strict please Pinmembernemaroller4:18 30 Apr '03  
GeneralRe: Option strict please Pinmembernamasteall20004:14 1 Oct '04  
Questionsmall bug ??? Pinmemberzefrit7:13 22 Apr '03  
AnswerHelp me Pinmembernamasteall20004:19 1 Oct '04  
GeneralSmall bug PinmemberRichard Deeming3:18 20 Jan '03  
GeneralRe: Small bug PinmemberRicardoPDV5:50 20 Jan '03  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120529.1 | Last Updated 18 Jan 2003
Article Copyright 2003 by RicardoPDV
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid