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

MaskingText for ASP.NET

By , 20 Sep 2007
 
Screenshot - Mask1.jpg

Shot2

Introduction


As we all knows, there is a MaskedTextBox control for Windows Application, where as in web, there is no masking for TextBox is available, this is the solution of the maskof the text box.

It will allow user to insert the text in predefined mask only.

Background


Some companies like telerik are providing this control for $299 or above, eventhough we are having knowledge, why should I pay? This was the question which inspired me to create this control.

Using the code


A brief description of how to use the article or code. The class names, the methods and properties, any tricks or tips.

Blocks of code should be set as style "Formatted" like this:

<%@ Register Assembly="MaskingText" Namespace="MaskingText" TagPrefix="cc1" %>
<cc1:MaskedText ID="MaskedText1" runat="server" DefaultMask="Phone" Mask="(###) ###-####">(___) ___-____</cc1:MaskedText>

Below is the code syntax for web control library:

Imports System

Imports System.Collections.Generic

Imports System.ComponentModel

Imports System.Text

Imports System.Web

Imports System.Web.UI

Imports System.Web.UI.WebControls

 

<DefaultProperty("Text"), ToolboxData("<{0}:MaskedText runat="server"></{0}:MaskedText>")> _

Public Class MaskedText

Inherits System.Web.UI.WebControls.TextBox

'# - Numeric

'@ - Alphas

'? - Any Character

Private MaskingChars As New List(Of String)(New String() {"#", "?", "@"})

Private DefaultMasks As New ArrayList(New Object() {"", "###.###.#.###", "(###) ###-####", "###-##-###"})

Private _DefMask As CommonMasks

Public Enum CommonMasks

None = 0

IPAddress = 1 '

Phone = 2 '

SSN = 3 '

End Enum

<Bindable(True), Category("Appearance"), DefaultValue(""), Localizable(True)> Public Overrides Property Text() As String

Get

Dim s As String = CStr(ViewState("Text"))

If s Is Nothing Then

Return String.Empty

Else

Return s

End If

End Get

Set(ByVal Value As String)

ViewState("Text") = Value

End Set

End Property

<Bindable(True), Category("Mask"), DefaultValue(""), Localizable(True)> _

Public Property DefaultMask() As CommonMasks

Get

Return _DefMask

End Get

Set(ByVal Value As CommonMasks)

_DefMask = Value

Me.Mask = CStr(DefaultMasks(DirectCast(_DefMask, Integer)))

End Set

End Property

<Bindable(True), Category("Mask"), DefaultValue(""), Localizable(True)> _

Public Property Mask() As String

Get

Dim s As String = CStr(ViewState("Mask"))

If s Is Nothing Then

Return String.Empty

Else

Return s

End If

End Get

Set(ByVal Value As String)

If Value <> "" Then

Dim tempString As String = System.Text.RegularExpressions.Regex.Replace(Value, "\#|\?|\@", "_")

Me.Text = tempString

Me.MaxLength = Value.Length + 1

ViewState("Mask") = Value

End If

End Set

End Property

Protected Overrides Sub RenderContents(ByVal output As HtmlTextWriter)

output.Write(Text)

End Sub

Private Sub MaskedText_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender

Me.Attributes.Add("onkeyup", "processText('" & Me.ClientID & "','" & Me.Mask & "')")

Me.Attributes.Add("onkeydown", "return checkKey('" & Me.ClientID & "','" & Me.Mask & "')")

Me.Page.ClientScript.RegisterClientScriptResource(GetType(MaskingText.MaskedText), "MaskingText.Mask.js")

End Sub

End Class
Description:


By just setting the mask property, user can easily use this control.

Things to be note:

1. # sign indicate the Numeric Character.

2. @ sign indicate the Alpha Character, where as

3. ? sign indicates any character.

For example, if user want to mask this textbox for the format "(123)-(ABC)-(1DE)"

the format string will be "(###)-(@@@)-(#@@)"

Very easy to use....!!

Isn't it???

Points of Interest


There are predefined mask also like IPAddress, Phone and SSN, which automatically format the text box.

Hope this will help we (Web Developer) to provide a goof UI.

Have a Happy Programming....!! :)

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Paresh Rathod
Web Developer
India India
Member
My self Paresh Rathod, working as a web developer in Rajkot, Guajrat, India.
 
I am having total experience of 10 yrs in this field.
 
I beleive in...
TOGETHER WE CAN AND WE WILL MAKE A DIFFERENCE.

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.
Search this forum  
    Spacing  Noise  Layout  Per page   
Generala few problemsmemberTobyKraft28 Sep '07 - 4:51 
Paresh,
Very nice work and very useful but I found a couple of weaknesses...
 
The processText routine takes a bit of time and it's easy to type too fast for the routine to keep up and you lose characters. (tested on 1.6Ghz processor) Not sure what can be done to speed it up.
 
When you Tab into a masked textbox, the cursor is on the last character position, not the first.
 
When you exit an input area, you cannot backspace back to the prior section so the user has to use the mouse to force the cursor into a different area. (such as in a phone number after entering the area code you can't backspace back into it) very annoying for data entry work.
 
Suggestion - have the Home key go to the 1st position, have the End key go to the last position.
 
Thanks,
 


 
Toby Kraft

GeneralRe: a few problemsmemberAlan Vu16 Feb '10 - 11:25 
Suggestion for cursor position. Something is like
 
function processText(id, mask) {
 
if (mask == "") { return; }
this.mask = mask;
this.id = id;
this.pos = doGetCaretPosition(id);
var pos = doGetCaretPosition(id);
var text = document.getElementById(id).value;
var rstring = ReplaceString(mask);
var myRegExp = '/' + rstring + '/g';
this.formattedText = text.replace(eval(myRegExp), '');
document.getElementById(id).value = applyFormat(formattedText, mask);
 
if (this.formattedText != "__________") {
setCursorToNextLiteralChar();
}
else {
setCaretPosition(this.id, 0);
}
}
 
Thank You
QuestionRe: a few problemsmemberPavan202010 Mar '13 - 11:37 
Hi, I have the same problem. even after adding above code (function processText(id, mask) ) is not helping.
 
When I enter numbers faster, the cursor position pushing the first entered character to the last and make the phone number wrong.
 
Could you suggest a good solution for this?
thanks in advance.
AnswerRe: a few problemsmemberParesh Rathod10 Mar '13 - 21:16 
Hi Pavan,
 
I am glad to see that even after five years, somebody is asking me about my control.
But I am really sorry, Now a days I am developing iPhone application and I am out of .NET development since 2 yrs, so it will be hard for me to answer you.
But wish you all the best for your problem.
 
Regards,
Paresh
Regards,
Paresh Rathod

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

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130523.1 | Last Updated 21 Sep 2007
Article Copyright 2007 by Paresh Rathod
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid