1. 在KeyDown事件中屏蔽非法按键。
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
TextBox txt = sender as TextBox;
if ((e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || e.Key == Key.Decimal)
{
if (txt.Text.Contains(".") && e.Key == Key.Decimal)
{
e.Handled = true;
return;
}
e.Handled = false;
}
else if (((e.Key >= Key.D0 && e.Key <= Key.D9) || e.Key == Key.OemPeriod) && e.KeyboardDevice.Modifiers != ModifierKeys.Shift)
{
if (txt.Text.Contains(".") && e.Key == Key.OemPeriod)
{
e.Handled = true;
return;
}
e.Handled = false;
}
else
{
e.Handled = true;
}
}
2. 在TextChanged事件中利用TextChange类屏蔽非法输入和粘贴输入。
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = sender as TextBox;
TextChange[] change = new TextChange[e.Changes.Count];
e.Changes.CopyTo(change, 0);
int offset = change[0].Offset;
if (change[0].AddedLength > 0)
{
double num = 0;
if (!Double.TryParse(textBox.Text, out num))
{
textBox.Text = textBox.Text.Remove(offset, change[0].AddedLength);
textBox.Select(offset, 0);
}
}
}
TextChange类,是Framework 3.0SP1和3.5中新增的,3.0本身是没有的。
3. 在TextChanged事件中利用正则表达式屏蔽非法按键输入和粘贴输入。
private const string pattern_integer = @"^[0-9]*$";
private const string pattern_decimal = @"^[0-9]*[.]?[0-9]*$";
string strDoublebak; //记录TextBox原来的内容
private void txtDouble_TextChanged(object sender, TextChangedEventArgs e)
{
Match m = Regex.Match(this.txtDouble.Text, pattern_decimal); // 匹配正则表达式
if (!m.Success) // 输入的不是小数
{
this.txtDouble.Text = strDoublebak; // textBox内容不变
// 将光标定位到文本框的最后
this.txtDouble.SelectionStart = this.txtDouble.Text.Length;
}
else // 输入的是小数
{
strDoublebak = this.txtDouble.Text; // 将现在textBox的值保存下来
}
}
浙公网安备 33010602011771号