从这个简单的小型c#windows表单小费计算器开始。我多年前制作了一个VB版本,效果很好,我移植到我的Palm Treo,并且在应用程序成为移动世界中的东西之前很方便。
因此,对于此Tip Calc,我有一个包含3个文本框字段的基本窗体:Bill amount
,Tip 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)有一个很难用十进制字符串的东西。
答案 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()通常是一种更清晰,更有效的解决方案,只要用户输入可能包含不能转换为所需类型的值,就应该使用它。