StarSoul

学历代表过去,能力代表现在,学习力代表未来!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

TextBox限制只能输入整数或小数

Posted on 2011-08-18 15:41  StarSoul  阅读(822)  评论(0)    收藏  举报

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的值保存下来
}
}