在将问题从numericUpdown值除以文本框上的值并显示在第三个文本框上时出现问题

时间:2019-03-08 22:29:05

标签: c# winforms

您好,我是这个网站和C#的新手,我试图在VS 2017上构建一个Winforms应用程序,其中包含一个numericUpDown和2个文本框。我需要将文本框1中的值除以numericUpDown控件上的值,然后在文本框2中汇总并显示结果,但要以双精度形式显示。我遇到的问题是,直到我将numericupdown的值向上更改3次之后,什么都没有计算出来,然后汇总结果是错误的。它通过1个值更改关闭。因此,如果我单击nud 3次,并且文本框1上的值是0.28,则应该得到0.09333333的结果,即0.28除以3,但结果却是0.14。如果我单击裸键,看起来它被零除。 numericupdown从0值开始的事实与我的问题有关系吗?运行应用程序时,没有收到任何错误消息或异常。我将不胜感激。请不要对我太苛刻,我在c#中是个超级新手谢谢

这是代码

    private void numericUpDown1R2Scrap_ValueChanged(object sender, EventArgs e)
    {

        double val1 = 0.0;
        double val2 = 0.0;
        double total = 0.0;

        if (!string.IsNullOrEmpty(textBox1WeightSummary.Text) && 
        !string.IsNullOrEmpty(numericUpDown1R2Scrap.Text))
        {


            val1 = double.Parse(numericUpDown1R2Scrap.Text);
            val2 = double.Parse(textBox1WeightSummary.Text);

            if (val1 != 0)
            {
                total = val2 / val1;
                textBox1RingWeightTotal.Text = total.ToString(); 
            }

2 个答案:

答案 0 :(得分:0)

在更新ValueChanged属性之前引发

Text:因此,在处理numericUpDown1R2Scrap.TextValueChanged的内容将过时。请改用Value属性,该属性将具有最新值。它已经是一个数字类型,因此您也不需要解析它(但是您确实需要强制转换它,因为在使用decimal时它是double):

val1 = (double)numericUpDown1R2Scrap.Value;
val2 = double.Parse(textBox1WeightSummary.Text);

答案 1 :(得分:0)

在表单设计器中,将NumericUpDown MinimumValue属性设置为1。这允许从1开始,而不允许下降到0

然后,始终检查NumericUpDown.Value以读取当前值,它是decimal类型。

使用Decimal.TryParse转换TextBox的数字输入。请注意,默认实现假定您使用的是当前的Culture十进制分隔符。请参阅有关使用InvariantCulture引用的文档,以在需要时强制使用点作为小数点分隔符和将逗号作为千位分隔符。

private void numericUpDown1R2Scrap_ValueChanged(object sender, EventArgs e)
{
    NumericUpDown nUpDown = sender as NumericUpDown;
    if (nUpDown.Value == 0) nUpDown.Value = 1;
    if (decimal.TryParse(textBox1WeightSummary.Text, out decimal inputValue)) {
        textBox1RingWeightTotal.Text = (inputValue / nUpDown.Value).ToString();
    }
}

此行: if (nUpDown.Value == 0) nUpDown.Value = 1; 是一种故障保险,以防万一您忘记将NumericUpDown ValueMinimum设置为1设计器(或在Form的构造函数中)。

此行: NumericUpDown nUpDown = sender as NumericUpDown; ,用于检索引发事件的NumericUpdown控件的实例。这样可以将代码重用于任何其他NumericUpDown控件,而无需手动更改引用。

此语法: decimal.TryParse([Some string], out decimal inputValue) 需要C# 7.0+
如果使用的是该语言的早期版本,则需要在方法之外声明局部变量:

decimal inputValue = 0m;
if (decimal.TryParse(textBox1WeightSummary.Text, out inputValue)) { ... }

在这一行: (inputValue / nUpDown.Value).ToString(); ,您可以更改ToString()格式,指定要使用的小数位数。例如:

(inputValue / nUpDown.Value).ToString("N2");

将输出一个十进制数字,格式设置为仅显示前两个小数位。