Introduction
The TextBox
control is the most used control in a Windows
program. It also cause a lot of problem either from QA or the user because of
invalid data that was entered. Using a masked control will save a lot of time
for the developer and reduce the complaints and bugs.
This masked intelligent user control enhances the function of the
TextBox
control, which can mask the Date, IP Address, SSN, Phone
numbers, digits, decimal and checks the validation, and automatically set the
delimiter location.
The property Masked is set to None by default and the
control works like a normal TextBox control.
If setting the property to
DateOnly, the control is masked to Date format.
It is intelligent.
What the user enters |
What is Displayed |
12 | 12/ |
124 |
12/04/ |
13 |
01/3 |
3 |
03/ |
34 |
03/04/ |
14 |
01/04/ |
1/ |
01/ |
Using the ErrorProvider
to handle the invalidate input:
Creating Control:
- Start the Visual Studio.NET Windows Forms designer.
- Select a new C# project by clicking New from the File menu.
- Click Windows control library template on the templates.
- Set the Name MaskedTextBox
Then open the maskedTextBox.cs to Change the base class to the
System.Windows.Forms.TextBox
.
Adding a Property:
public enum Mask {None, DateOnly, PhoneWithArea, IpAddress,
SSN, Decimal, Digit };
private Mask m_mask;
public Mask Maked
{
get { return m_mask;}
set {
m_mask = value;
this.Text="";
}
}
Override the OnKeyPress
function
this.KeyPress += new
KeyPressEventHandler(this.OnKeyPress);
private void OnKeyPress(object sender, KeyPressEventArgs e)
{
MaskedTextBox sd = (MaskedTextBox) sender;
if (sd.m_IPAddrOnly)
sd.MaskIpAddr(e);
if (sd.m_digitOnly)
sd.MaskDigit(e);
if(sd.m_ssn)
sd.MaskPhoneSSN(e, 3, 2);
if(sd.m_phoneOnly)
sd.MaskPhoneSSN(e, 3, 3);
if(sd.m_dateOnly)
sd.MaskDate(e);
if(sd.m_decimalOnly)
sd.MaskDecimal(e);
}
Unboxing the sender and using it to call these function is very important for
multiple properties and when more than one control is used in one form,
otherwise different controls may share the same variable with another control,
which will cause unexpected results.
Double check the masked format:
private void OnLeave(object sender, EventArgs e)
{
MaskedTextBox sd = (MaskedTextBox) sender;
Regex regStr;
switch(m_mask)
{
case Mask.DateOnly:
regStr = new Regex(@"\d{2}/\d{2}/\d{4}");
if(!regStr.IsMatch(sd.Text))
errorProvider1.SetError(this, "*");
break;
case Mask.PhoneWithArea:
regStr = new Regex(@"\d{3}-\d{3}-\d{4}");
if(!regStr.IsMatch(sd.Text))
errorProvider1.SetError(this,"**");
break;
case Mask.IpAddress:
short cnt=0;
int len = sd.Text.Length;
for(short i=0; i<len;i++)
if(sd.Text[i] == '.')
{
cnt++;
if(i+1 < len)
if(sd.Text[i+1] == '.')
{
errorProvider1.SetError(this, "*");
break;
}
}
if(cnt < 3 || sd.Text[len-1] == '.')
errorProvider1.SetError(this, "*");
break;
case Mask.SSN:
regStr = new Regex(@"\d{3}-\d{2}-\d{4}");
if(!regStr.IsMatch(sd.Text))
errorProvider1.SetError(this, "*");
break;
case Mask.Decimal:
break;
case Mask.Digit:
break;
}
}
Usage
After creating the DLL program, you should add the component into ToolBox.
By:
- Right click the mouse in the ToolBox, and then select Customize Toolbox to
open a dialog.
- Select the tab .Net framework component,
- Use the browser to find your DLL, check it, then click Ok.
The control should be in the ToolBox and it is ready to use.
That is all. I hope you enjoy it.
History:
Update at 03/04/2002.
Using enum to set the properties.
Add Onleave
function to check the invalidation of the controls.
Add Leap year check for
Date mask in the CheckDayOfMonth funcrion.
12 July 2002 - updated source download
9 Nov 2003 - updated source download
If you have any comments or find some bugs, I would love to hear about it and
make it better. You can reach me at Jibin
Pan.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.