为什么我的总数不会出现在这个小计算器中?

时间:2016-02-24 20:36:26

标签: c# winforms

从这个简单的小型c#windows表单小费计算器开始。我多年前制作了一个VB版本,效果很好,我移植到我的Palm Treo,并且在应用程序成为移动世界中的东西之前很方便。

因此,对于此Tip Calc,我有一个包含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;
}

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

label8.Text(现在是resultLabel.Text)当时似乎没有问题采取小数,我不明白为什么label7.Text(现在billWithTipLbl.Text)有一个很难用十进制字符串的东西。

2 个答案:

答案 0 :(得分:1)

您的代码中没有任何内容可以在label7中添加任何文字。

事实上,这一行与label7中的数字相同,并将其放入tree变量中,与此完全相反:

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

正如您已经通过label8找到的,要在标签中添加任何内容,您需要按照label7.Text = ...;的方式执行操作。

你的命名也很可怕。为什么不将文本框和标签重命名为有意义的内容,例如resultLabel代替label7

答案 1 :(得分:0)

我将在前一个答案上稍微扩展一下。你在滥用Decimal.TryParse()。 所有TryParse方法都尝试将给定字符串转换为给定类型。在这种情况下,字符串为值类型Decimal。如果转换成功,则该方法返回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()通常是一种更清晰,更有效的解决方案,只要用户输入可能包含不能转换为所需类型的值,就应该使用它。