场景设置:写一个WinForm程序,假如某数据库表的字段为整数类型,而这个字段的值是从form窗体的TextBox输入。
要求是:TextBox只能输入整数,这个值在代码中用int变量存储,然后再存储到数据库。
这是我在项目中遇到的问题,问题说大可不大,但是还可能隐藏着很多bug:(1)数据库这个字段类型应该怎么设置?能保存输入的值能正确存储,不出现值太大或太小等异常。(2)从TextBox输入的值只能是数字,否则转化为int类型的时候会报异常,在实际情况中,假如TextBox输入的值太大同样会报异常,这个输入值的大小又如何根据实际情况做控制呢?
我的解决方法:
(1)我对数据库设计也不大熟悉,在此选用Oracle,参考Oracle的数据类型后,选用number(m,n)类型,C#中int类型范围为
-2,147,483,648 到 2,147,483,647,于是这个字段类型可以为number(10,0)。
(2)TextBox输入控制包括键盘输入和粘贴输入。
键盘输入的控制代码为:
private void txtSum_KeyPress(object sender, KeyPressEventArgs e)
{
if ((e.KeyChar != 8 && !char.IsNumber(e.KeyChar))&&e.KeyChar!=13)
{
MessageBox.Show("商品数量只能输入数字","操作提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
e.Handled = true;
}
}
粘贴输入控制和输入值检验:
private void txtSum_TextChanged(object sender, EventArgs e)
{
if (txtSum.Text == "")
{
return;
}
try
{
int nInput = int.Parse(txtSum.Text);
}
catch (FormatException)//输入字符格式错误异常处理
{
MessageBox.Show("请输入正确的数量", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtSum.Text = string.Empty;
}
catch (OverflowException)
{
MessageBox.Show("输入的数量过大", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtSum.Text = string.Empty;
}
}
或
private void txtSum_TextChanged(object sender, EventArgs e)
{
try
{
if (!Regex.IsMatch(txtSum.Text.Trim(), @"^[1-9]/d*$"))
{
this.txtSum.Text = string.Empty;
return;
}
int nInput = int.Parse(txtSum.Text);
}
catch (OverflowException)
{
MessageBox.Show("输入的数量过大", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtSum.Text = string.Empty;
}
}
(3)实际上TextBox控件增加以上对应的事件之后就可以对输入做到很好的控制了,但是如何类似要求的控件很多时输入不正确的时候老是弹出MessageBox,还有复制这个控件事件不会复制,会增加很多代码,下面我再对输入控制的方法做一些拓展。
(4)使用MaskedTextBox控件,因为最大int的位数有10位,在允许的情况下我们可以设置MaskedTextBox的Mask属性值为000000000,允许输入九位数字,这样既能保证只能输入数字又不会出现溢出的情况。
(5)假如使用的DevExpress系列的TextEdit控件,也可以设置mask和MaxLength,即选择原有的正则表达式或自己编写一个。这样通过属性来控制输入即可以大大减少代码,复制使用同样的控件的时候效率就提高了。