TextBox输入控制与Oracle数据类型的问题

来源:互联网 发布:淘宝怎么货到付款 编辑:程序博客网 时间:2024/06/14 15:27

场景设置:写一个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,即选择原有的正则表达式或自己编写一个。这样通过属性来控制输入即可以大大减少代码,复制使用同样的控件的时候效率就提高了。