我正在创建一个应用程序,其中用户使用复选框选择一个或两个选项,然后单击计算按钮并显示总价格
为此,我必须使用我自己的方法,例如Oil和Lube部分和Rushes,并使用click事件处理程序调用它以在标签框中显示值。
我可以轻松调用一个方法并在标签框中显示其值,但如果我容纳另一个调用语句,则会出现逻辑错误,即忽略第一个调用语句,第二个调用语句的值不正确地显示在标签框中。
以下是我的两种方法:
private decimal RushesMethod(out decimal radiatorRush_var, out decimal transmissionFlush_var, out decimal both_var)
{
radiatorRush_var = 0m;
transmissionFlush_var = 0m;
both_var = 0m;
if (radiatorRushCheckBox.Checked)
{
radiatorRush_var = 30.00m;
}
else if (transmissionFlushCheckBox.Checked)
{
transmissionFlush_var = 80.00m;
}
else if (radiatorRushCheckBox.Checked && transmissionFlushCheckBox.Checked)
{
radiatorRush_var = 30.00m;
transmissionFlush_var = 80.00m;
both_var = radiatorRush_var + transmissionFlush_var;
}
return both_var + transmissionFlush_var + radiatorRush_var;
}
private decimal OilLubeCharges(out decimal ValueTotal, out decimal ValueOilChange, out decimal ValueOilLube )
{
ValueTotal = 0m;
ValueOilChange = 0m;
ValueOilLube = 0m;
if (oilChangeCheckBox.Checked && lubeJobCheckBox.Checked)
{
ValueOilChange = 26.00m;
ValueOilLube = 18.00m;
ValueTotal = ValueOilChange + ValueOilLube;
}
else if (oilChangeCheckBox.Checked)
{
ValueOilChange = 26.00m;
}
else if (lubeJobCheckBox.Checked)
{
ValueOilLube = 18.00m;
}
return ValueOilLube +ValueOilChange+ValueTotal;
}
这是计算事件按钮处理程序:
private void calculateButton_Click(object sender, EventArgs e)
{
decimal totalOilLubeChargesAccept_var;
decimal oilChangeAccept_var;
decimal oilLubeChangesAccept_var;
decimal storeValue = OilLubeCharges(out totalOilLubeChargesAccept_var, out oilChangeAccept_var, out oilLubeChangesAccept_var );
totalFeesAnsLabelBox.Text = storeValue.ToString();
decimal radiatorRush_var;
decimal transmissionFlush_var;
decimal bothRadAndTran;
decimal storeRadTran = RushesMethod(out radiatorRush_var, out transmissionFlush_var, out bothRadAndTran);
totalFeesAnsLabelBox.Text = storeRadTran.ToString();
}
如果我只使用OilLubeCharges
来调用第一种方法,你可以看到它绝对正常,但问题是当我包含第二个调用方法RushesMethod
时它会忽略第一个调用方法并使用二次通话方式。
即使我只使用RushesMethod
,如果同时检查了散热器冲洗和透射冲洗检查按钮,它也不会显示该值。它仅显示是否选中其中任何一个。对于OilLubeCharges
方法,情况并非如此,如果我单独使用它,它将在任一情况下显示值。
修改
这是我使用totalFeesAnsLabelBox.Text = (storeRadTran + storeValue).ToString();
之后发生的事情我认为IF语句是罪魁祸首。
这是另一个编辑:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Automative_APP
{
public partial class automativeForm : Form
{
public automativeForm()
{
InitializeComponent();
}
private decimal MiscMethod()
{
decimal valueTotal2 = 0m;
if (inspectionCheckBox.Checked && replaceMufflerCheckBox.Checked && tireRotationCheckBox.Checked)
{
valueTotal2 += (15.00m + 100.00m + 20.00m);
}
else if (inspectionCheckBox.Checked)
{
valueTotal2 += 15.00m;
}
else if (replaceMufflerCheckBox.Checked)
{
valueTotal2 += 100.00m;
}
else if (replaceMufflerCheckBox.Checked)
{
valueTotal2 += 20.00m;
}
return valueTotal2;
}
private decimal RushesMethod()
{
decimal valueTotal = 0m;
if (radiatorRushCheckBox.Checked)
{
valueTotal += 30.00m;
}
else if (transmissionFlushCheckBox.Checked)
{
valueTotal += 80.00m;
}
else if (radiatorRushCheckBox.Checked && transmissionFlushCheckBox.Checked)
{
valueTotal += (80.00m + 30.00m);
}
return valueTotal;
}
private decimal OilLubeCharges()
{
decimal valueTotalOL=0m;
if (oilChangeCheckBox.Checked && lubeJobCheckBox.Checked)
{
valueTotalOL += (26.00m + 18.00m);
}
else if (oilChangeCheckBox.Checked)
{
valueTotalOL += 26.00m;
}
else if (lubeJobCheckBox.Checked)
{
valueTotalOL += 18.00m;
}
return valueTotalOL;
}
private void partsSummaryLabelBox_Click(object sender, EventArgs e)
{
}
private void taxPartsLabelBox_Click(object sender, EventArgs e)
{
}
private void exitButton_Click(object sender, EventArgs e)
{
this.Close(); //close the form
}
private void calculateButton_Click(object sender, EventArgs e)
{
decimal rushesVar = RushesMethod();
decimal oiLAndLubeVar = OilLubeCharges();
decimal miscVar = MiscMethod();
decimal totalSum;
totalSum = (rushesVar + oiLAndLubeVar + miscVar);
totalFeesAnsLabelBox.Text = totalSum.ToString();
}
}
}
答案 0 :(得分:1)
您更新两次相同的标签文字值:
totalFeesAnsLabelBox.Text = storeValue.ToString();
totalFeesAnsLabelBox.Text = storeRadTran.ToString();
也许这就是你要找的东西(将小数值相加然后将标签的文本设置为此总和):
totalFeesAnsLabelBox.Text = (storeValue + storeRadTran).ToString();
答案 1 :(得分:1)
首先需要将两个十进制变量相加。 (评论已经建议)
totalFeesAnsLabelBox.Text = (storeValue + storeRadTran).ToString();
改善逻辑。使用相同的十进制变量。例如;
decimal priceValue = 0;
decimal totalOilLubeChargesAccept_var;
decimal oilChangeAccept_var;
decimal oilLubeChangesAccept_var;
priceValue += OilLubeCharges(out totalOilLubeChargesAccept_var, out oilChangeAccept_var, out oilLubeChangesAccept_var );
totalFeesAnsLabelBox.Text = storeValue.ToString();
decimal radiatorRush_var;
decimal transmissionFlush_var;
decimal bothRadAndTran;
priceValue += RushesMethod(out radiatorRush_var, out transmissionFlush_var, out bothRadAndTran);
totalFeesAnsLabelBox.Text = priceValue.ToString();
您检查方法中是否选中了复选框,如果没有计算,则返回0。
希望有所帮助,
答案 2 :(得分:1)
为了计算各个部分的价格(例如换油),我建议如下
private decimal OilLubeCharges()
{
decimal ValueTotal=0m;
if (oilChangeCheckBox.Checked)
ValueTotal += 26.00m;
if (lubeJobCheckBox.Checked)
ValueTotal += 18.00m;
return ValueTotal;
}
我没有看到所有out
变量的目的,所以我删除了它们。唯一值得关注的是总和。要计算这一点,您只需检查是否选中了各种复选框,如果是,则只需将相应的值添加到总和中。不需要所有if ... else if
级联。
另外一个案例,你计算了
ValueTotal = ValueOilChange + ValueLubJob;
然后几行你回复
return ValueTotal + ValueOilChange + ValueLubeJob;
,如果你考虑上面的计算:
return ValueOilChange + ValueLubeJob + ValueOilChange + ValueLubeJob;
即两倍于正确的总和。
对于事件处理程序中的计算,您应该计算各个部分的总和,就像您已经做过的那样。然后将所有这些部分总和相加,并将文本框内容设置为此总和。
private void calculateButton_Click(object sender, EventArgs e)
{
decimal storeValue = OilLubeCharges();
decimal storeRadTran = RushesMethod();
var totalSum = storeValue + storeRadTran;
totalFeesAnsLabelBox.Text = storeRadTran.ToString();
}
修改
如果你确实需要这些变量,你必须正确计算它们。如果选中相应的复选框,只需分配它们即可。总数再次是所有部分的总和。再举一个例子:
private decimal OilLubeCharges(out decimal oilcharges, out decimal lubecharges) {
oilcharges = 0m;
lubecharges = 0m;
if (oilChangeCheckBox.Checked)
oilcharges = 26m;
if (lubeJobCheckBox.Checked)
lubecharges = 18m;
//the total is the sum of oilcharges and lubecharges
return oilcharges + lubecharges;
}
修改
你应该真正摆脱所有这些if ... else if
构造。它们使您的代码或多或少无法维护。如果您需要额外的复选框怎么办?您必须添加大量新else if
以涵盖所有可能的情况。此外,正如您的代码所示,它非常容易出错。
第一个问题:在您的MiscMethod
中,您正在检查replaceMufflerCheckBox
两次,但从不检查tireRotationCheckBox
。
第二个问题:如果选中inspectionCheckBox
和replaceMufflerCheckBox
,而不是tireRotationCheckbox
,会发生什么?要与您心爱的else if
正确处理这样的星座,您需要以下内容:
if (a && b && c)
else if (a && b)
else if (a && c)
else if (b && c)
else if (a)
else if (b)
else if (c)
现在考虑你必须添加一个额外的条件d
...所以你应该真的,真的,摆脱else,如果构造和重构你的代码,就像我上面给你看的那样。
你和Transmission flush的问题是一样的。虽然您已经检查了所有可能的组合,但是您按错误的顺序进行了检查。如果选中radiationRush
,则无论是否选中transmissionFlush
,它都会执行第一种情况。由于else if
,它不再检查任何其他条件。