很有意思的NumericUpDown的Value

最近在给学生批改作业时,遇到使用NumericUpDown控件的一个小程序,在使用到其Value属性时遇到一个很有意思的事情,背景如下:

首先要做的是一个计算银行存款本息合计的简单程序,界面大概如下:

很有意思的NumericUpDown的Value_第1张图片

程序功能可以从界面中看到,在存款金额中输入数字,选择存款期限后,相应的利率会出现在第三个文本框中,然后便可以计算本息合计。程序功能自不必多说,但关于NumericUpDown的使用有一点需要注意的:当你手动把其中输入的删除之后,其值(Value)却保持不变,这对于程序当然要出错,而且我们在做非空检查的时候也无从做起,因为其值仍然保留的是你清空之前的值,比如,我们输入了一些数值并计算之后,如下图:

很有意思的NumericUpDown的Value_第2张图片

本来我们在计算事件的代码中有这样的非空检查代码:

            if (numericUpDown1.Value == 0)
            {
                MessageBox.Show("请输入金额!", "友情提示");
                return;
            }
这句代码如要是防止用户不输入任何值就计算的,但对于上图来讲,当我们把金额中的100手动删掉然后保持这个输入框为空,然后选择不同的存款期限,却发现还能计算出来值,经过一番跟踪发现问题是这样的:当手动清空numericUpDown1之后,其value属性还保存原来的值100,也就是说清空并不能改变其值,但此时我们需要检查这种情况,该怎么检查呢,上面的代码已经不行,但从属性中又没有发现其他可以利用的属性,于是转到事件,但试了一圈发现其实不管用任何方法,其值(Value)都是不变的,要怎么能检测到它本身为空的这个情况,也就是说它本身为空的这个现象要通过什么属性反映出来呢,也想到了Text属性,但从属性列表中找不到,百思不得其解之际,最后断点跟踪进去,发现numericUpDown1竟然有Text属性,而且果然是空的,但就是访问不到,跟到元数据,发现如下代码,终于找到了原因

        //
        // Summary:
        //     Gets or sets the text to be displayed in the System.Windows.Forms.NumericUpDown
        //     control.
        [Bindable(false)]
        [EditorBrowsable(1)]
        [DesignerSerializationVisibility(0)]
        [Browsable(false)]
        public override string Text { get; set; }
大家注意倒数第二行有个[Browsable(false)],这代表其Text属性是不可浏览的,这就解释了为什么在代码中访问不了其Text属性,那就往其父类追踪,果然其父类的Text属性是可以访问的,代码如下:

        //
        // Summary:
        //     Gets or sets the text displayed in the spin box (also known as an up-down
        //     control).
        //
        // Returns:
        //     The string value displayed in the spin box.
        [Localizable(true)]
        public override string Text { get; set; }
既然这样,解决办法就有了,我们把代码中的numericUpDown1转化为其父类的一个对象,然后就可以根据其Text属性判断是否为空了,代码如下:

            UpDownBase up = (UpDownBase)numericUpDown1;

            if (up.Text == "")
            {
                MessageBox.Show("请你输入正确的数值!");
                return;
            }

用这句话来检查空值就屡试不爽了!感兴趣的可以试一下啊!

你可能感兴趣的:(C#编程)