Click here to Skip to main content
Click here to Skip to main content

VB.NET Maskedbox Control - Final Release

By , 17 Jan 2003
 

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

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralGreat Help - Thanksmembermbusfield26 Nov '06 - 4:14 
GeneralSuggested enhancementsmemberVBProEd31 Dec '05 - 8:45 
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 enhancementsmemberRicardoPDV3 Jan '06 - 1:45 
Generalmiguelfantasticmembermiguelfantastic27 May '05 - 13:03 
GeneralProblem in Using this Controlmembernamasteall20001 Oct '04 - 4:21 
GeneralBackspace BugmemberAnAverageJoe9 Jun '04 - 5:54 
GeneralRe: Backspace BugmemberMrGTI1 Oct '04 - 4:32 
GeneralRe: Backspace Bugmemberbuffbuh28 Mar '07 - 12:54 
GeneralAbsolutely Clueless....memberTheKanuck27 May '04 - 3:02 
GeneralRe: Absolutely Clueless....memberXpto00129 Oct '04 - 18:24 
GeneralPoor Control LoadmemberMrGTI23 Sep '03 - 4:30 
GeneralRe: Poor Control Loadmembernamasteall20001 Oct '04 - 4:13 
GeneralBUGmemberbalu_vee14 Aug '03 - 3:34 
GeneralRe: BUGmembernamasteall20001 Oct '04 - 4:14 
GeneralOption strict pleasemembernemaroller30 Apr '03 - 4:18 
GeneralRe: Option strict pleasemembernamasteall20001 Oct '04 - 4:14 
Questionsmall bug ???memberzefrit22 Apr '03 - 7:13 
AnswerHelp memembernamasteall20001 Oct '04 - 4:19 
GeneralSmall bugmemberRichard Deeming20 Jan '03 - 3:18 
GeneralRe: Small bugmemberRicardoPDV20 Jan '03 - 5:50 

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

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