繁体   English   中英

为什么我的总数没有在这个小计算器中显示?

[英]Why are my totals not happening in this little calculator?

从这个简单的小C#Windows窗体提示计算器开始。 几年前,我制作了一个VB版本,效果很好,并且移植到了Palm Treo上,并且在应用成为移动世界之前就很方便了。

因此,对于此Tip Calc,我有一个基本的Windows窗体,其中包含3个文本框字段: Bill amountTip amount (%)number of people

我有两个标签: label 1显示小费总额, label 2在划分聚会后显示总计,等等。

在过去4天的空闲时间里,我一直在努力获取小费总额标签,而我却无法克服这一障碍。

我有一个calculate按钮,单击该按钮将创建变量,将文本框数据转换为小数,(稍后再进行字段验证),添加帐单金额加小费除以聚会总额。

我对其进行了调试,可以看到'tree'变量中填充了所需的总数,但是由于某种原因, label7不会填充该总数。

这是我的代码:

public partial class Form1 : Form
{
    private void button1_Click(object sender, EventArgs e)
    {
        decimal check = Convert.ToDecimal(Check.Text);
        decimal tip = Convert.ToDecimal(textBox2.Text);
        decimal ppl = Convert.ToDecimal(textBox3.Text);
        decimal tree = Convert.ToDecimal(tip * check);
        //    tree = Convert.ToDecimal(tip * check);
        if (Decimal.TryParse(label7.Text, out tree))
            MessageBox.Show(tree.ToString());
        //    else
        //       MessageBox.Show(Ex);
        //tree = Decimal.Parse(label7.Text);
        //try { tree = Decimal.Parse(label7.Text); }
        // catch (Exception ex) { System.Windows.Forms.MessageBox.Show("There is some sort of error!"); }
        //label7.Visible = true;
        label8.Text = check + label7.Text;
        label8.Visible = true;
    }

    private void Check_KeyPress(object sender, KeyPressEventArgs e)
    {
        char check = e.KeyChar;

    }
}

更新:我的格式确实很糟糕。 (感谢Matti Virkkunen)。 此后我已经清理了。

private void button1_Click(object sender, EventArgs e)
{
    decimal billamt = Convert.ToDecimal(check.Text);
    decimal tipamt = Convert.ToDecimal(tipAmt.Text);
    decimal people = Convert.ToDecimal(numPpl.Text);
    decimal calcttl = Convert.ToDecimal(tipamt * billamt);
    billWithTipLbl.Text = calcttl;
    billWithTipLbl.Visible = true;
    resultLabel.Text = billamt + billWithTipLbl.Text;
    resultLabel.Visible = true;
}

我应该澄清。 我最初的问题是当我确实为tree变量分配了billWithTipLbl.Text时出现了“无法将类型的十进制转换为字符串”的错误。 Label7已替换为billWithTipLbl。 我确实有一个BillWithTipLbl.Text = calcttl; (was label7.Text = tree;)之前定义过一次,但一直得到“无法将类型的十进制转换为字符串”。
我误解了Decimal.TryParse()是正确转换的方式,因此calcttl(是树)可能会塞入标签文本中。

当时的label8.Text(现在为resultLabel.Text)似乎没有问题,以小数点表示,我不明白为什么label7.Text(现在的BillWithTipLbl.Text)在用小数点转​​换为字符串的过程中遇到困难。

您的代码中没有任何内容可以在label7放置任何文本。

实际上,通过尝试从label7读取一个数字并将其放入您的tree变量中,此行与上述操作正好相反:

if (Decimal.TryParse(label7.Text, out tree))

正如您已经知道了label8 ,要将任何内容放入标签中,您需要按照label7.Text = ...;

您的命名也很糟糕。 为什么不将您的文本框和标签重命名为有意义的名称,例如resultLabel而不是label7

我将对先前的答案进行扩展。 您正在滥用Decimal.TryParse()。 所有TryParse方法都尝试将给定的字符串转换为给定的类型。 在这种情况下,将字符串键入值类型十进制。 如果转换成功,则该方法返回true。 签名包含一个out变量,该变量接受转换后的值。

这是使用您的表单的示例:

decimal check, tip, ppl;

if (Decimal.TryParse(Check.Text, out check) &&
    Decimal.TryParse(textBox2.Text, out tip) &&
    Decimal.TryParse(textBox3.Text, out ppl)
    )
{
    decimal tree = tip * check;
    label7.Text = tree.ToString();
    label8.Text = check + label7.Text; // ??? What is this supposed to show?
    label8.Visible = true;
}

这一次完成了两件事。 它将每个文本值转换为小数,并报告每次转换是否成功(返回true),然后对表单标签执行所需的操作。

在Decimal.Parse()或Convert.ToDecimal()上使用Decimal.TryParse()可以避免某些异常。 或者,可以在引发解析时捕获解析或转换异常。 TryParse()通常是一种更干净,更有效的解决方案,并且只要用户输入中可能包含无法转换为所需类型的值,就应使用TryParse()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM