我们如何将两个或多个方法调用语句容纳到一个Click事件处理程序中?

时间:2016-07-07 21:46:58

标签: c# methods

我正在创建一个应用程序,其中用户使用复选框选择一个或两个选项,然后单击计算按钮并显示总价格

为此,我必须使用我自己的方法,例如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方法,情况并非如此,如果我单独使用它,它将在任一情况下显示值。

仅考虑油和润滑油,冲动和总费用  enter image description here

  

修改

这是我使用totalFeesAnsLabelBox.Text = (storeRadTran + storeValue).ToString();之后发生的事情我认为IF语句是罪魁祸首。

enter image description here

这是另一个编辑:

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();






        }
    }
}

3 个答案:

答案 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

第二个问题:如果选中inspectionCheckBoxreplaceMufflerCheckBox,而不是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,它不再检查任何其他条件。