1、改用MaskedTextBox,然后设置Mask即可。这里有一个示例:下面的代码示例初始化 MaskedTextBox 以接受日期,并且将使用 MaskInputRejected 和 TypeValidationCompleted 事件来警告用户输入了无效值。private void Form1_Load(object sender, EventArgs e) { maskedTextBox1.Mask = "00/00/0000"; maskedTextBox1.MaskInputRejected += new MaskInputRejectedEventHandler(maskedTextBox1_MaskInputRejected); maskedTextBox1.KeyDown += new KeyEventHandler(maskedTextBox1_KeyDown); }void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) { if (maskedTextBox1.MaskFull) { toolTip1.ToolTipTitle = "Input Rejected - Too Much Data"; toolTip1.Show("You cannot enter any more data into the date field. Delete some characters in order to insert more data.", maskedTextBox1, maskedTextBox1.Location.X, maskedTextBox1.Location.Y, 5000); } else if (e.Position == maskedTextBox1.Mask.Length) { toolTip1.ToolTipTitle = "Input Rejected - End of Field"; toolTip1.Show("You cannot add extra characters to the end of this date field.", maskedTextBox1, maskedTextBox1.Location.X, maskedTextBox1.Location.Y, 5000); } else { toolTip1.ToolTipTitle = "Input Rejected"; toolTip1.Show("You can only add numeric characters (0-9) into this date field.", maskedTextBox1, maskedTextBox1.Location.X, maskedTextBox1.Location.Y, 5000); } }void maskedTextBox1_KeyDown(object sender, KeyEventArgs e) { // The balloon tip is visible for five seconds; if the user types any data before it disappears, collapse it ourselves. toolTip1.Hide(maskedTextBox1); } 2、在KeyPress中处理键入的值,并把e.Handle设置为true表示处理了。
这是个继承TextBox写成的只接收数字的TextBoxusing System.Runtime.InteropServices; using System.ComponentModel; using System.Windows.Forms.Design;namespace CustomControls { /// <summary> /// NumbersOnlyTextBox class /// </summary> [Designer(typeof(NumbersOnlyTextBox.NumbersOnlyTextBoxDesigner))] public class NumbersOnlyTextBox:System.Windows.Forms.TextBox { [DllImport("user32.dll")] private static extern bool MessageBeep(uint uType); public override bool PreProcessMessage(ref Message msg) { int keyValue = msg.WParam.ToInt32(); if ((keyValue > 47 && keyValue < 58) || keyValue == 46 || (keyValue > 34 && keyValue < 41) || keyValue == 8) { return base.PreProcessMessage(ref msg); } else { //Delete Key if (msg.Msg == 256 && keyValue == 46) { return base.PreProcessMessage(ref msg); } //Windows message id used to limit 1 beep per keystroke if (msg.Msg == 258) { MessageBeep(0); } return true; } } public NumbersOnlyTextBox() { } #region Internal Classes /// <summary> /// /// </summary> internal class NumbersOnlyTextBoxDesigner : System.Windows.Forms.Design.ControlDesigner { #region Method Overrides protected override void PostFilterProperties(System.Collections.IDictionary properties) { //base.PostFilterProperties(properties); properties.Remove("Text"); } #endregion } #endregion } }
{
maskedTextBox1.Mask = "00/00/0000"; maskedTextBox1.MaskInputRejected += new MaskInputRejectedEventHandler(maskedTextBox1_MaskInputRejected);
maskedTextBox1.KeyDown += new KeyEventHandler(maskedTextBox1_KeyDown);
}void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{
if (maskedTextBox1.MaskFull)
{
toolTip1.ToolTipTitle = "Input Rejected - Too Much Data";
toolTip1.Show("You cannot enter any more data into the date field. Delete some characters in order to insert more data.", maskedTextBox1, maskedTextBox1.Location.X, maskedTextBox1.Location.Y, 5000);
}
else if (e.Position == maskedTextBox1.Mask.Length)
{
toolTip1.ToolTipTitle = "Input Rejected - End of Field";
toolTip1.Show("You cannot add extra characters to the end of this date field.", maskedTextBox1, maskedTextBox1.Location.X, maskedTextBox1.Location.Y, 5000);
}
else
{
toolTip1.ToolTipTitle = "Input Rejected";
toolTip1.Show("You can only add numeric characters (0-9) into this date field.", maskedTextBox1, maskedTextBox1.Location.X, maskedTextBox1.Location.Y, 5000);
}
}void maskedTextBox1_KeyDown(object sender, KeyEventArgs e)
{
// The balloon tip is visible for five seconds; if the user types any data before it disappears, collapse it ourselves.
toolTip1.Hide(maskedTextBox1);
}
2、在KeyPress中处理键入的值,并把e.Handle设置为true表示处理了。
using System.ComponentModel;
using System.Windows.Forms.Design;namespace CustomControls
{
/// <summary>
/// NumbersOnlyTextBox class
/// </summary>
[Designer(typeof(NumbersOnlyTextBox.NumbersOnlyTextBoxDesigner))]
public class NumbersOnlyTextBox:System.Windows.Forms.TextBox
{
[DllImport("user32.dll")]
private static extern bool MessageBeep(uint uType); public override bool PreProcessMessage(ref Message msg)
{
int keyValue = msg.WParam.ToInt32();
if ((keyValue > 47 && keyValue < 58) || keyValue == 46 || (keyValue > 34 && keyValue < 41) || keyValue == 8)
{
return base.PreProcessMessage(ref msg);
}
else
{
//Delete Key
if (msg.Msg == 256 && keyValue == 46)
{
return base.PreProcessMessage(ref msg);
}
//Windows message id used to limit 1 beep per keystroke
if (msg.Msg == 258)
{
MessageBeep(0);
} return true; } } public NumbersOnlyTextBox()
{
}
#region Internal Classes
/// <summary>
///
/// </summary>
internal class NumbersOnlyTextBoxDesigner : System.Windows.Forms.Design.ControlDesigner
{
#region Method Overrides
protected override void PostFilterProperties(System.Collections.IDictionary properties)
{
//base.PostFilterProperties(properties);
properties.Remove("Text");
}
#endregion
} #endregion } }