有没有办法在先前在try块中分配的catch块中使用变量?

时间:2016-05-19 11:10:51

标签: c# wpf try-catch

所以我刚刚制作了一个由按钮和文本框(tbxSum)组成的基本小计算器。

我遇到的问题是,如果输入了无效的总和,我希望我的catch块能够接收它(它确实如此)并用最新的结果替换文本框中的内容。计算器(它没有)。

所以说我说:

3 + 3 = 6

我的计算器现在将6放在文本框中,用于下一笔款项。

然后说我做了:

6 // 3

计算器选择它是无效的,但我希望文本框值从前一个总和返回到6。

这是我尝试过的:

var myButton = (Button)sender;

        if (myButton.Content.ToString() == "=")
        {

            DataTable dt = new DataTable();
            string s = tbxSum.Text;
            string result = "";

            if (s.Contains("("))
            {
                s = s.Replace("(", "*(");
            }

            try
            {
                var v = dt.Compute(s, "");
                tbkSum.Text = s + "=" + v.ToString();

                tbxSum.Text = v.ToString();
            }

            catch
            {   
                MessageBox.Show("Invalid Sum");
                tbxSum.Text = result;
            }
        }

我还有一个文本块(tbkSum),它显示了前一个总和,所以我想也许我可以把等号右边的所有内容都拿走,但我不知道该怎么做。

3 个答案:

答案 0 :(得分:3)

class Calculate(){
    private boolean lastGoodValueSet = false;
    private int lastGoodValue = 0;

    void buttonFunction(){
        if (myButton.Content.ToString() == "=")
        {
            //Your code
            try
            {
                var v = dt.Compute(s, "");
                tbkSum.Text = s + "=" + v.ToString();
                lastGoodValue = v;
                lastGoodValueSet = true;
            }

            catch
            {   
                MessageBox.Show("Invalid Sum");
                tbxSum.Text = result;
                if (lastGoodValueSet)
                    tbxSum.Text = lastGoodValue;
            }
        }
    }

}

这是您可以使用的一组示例代码,它是一个简单的值,您必须存储以表明是否已经完成了良好的计算,如果是这样的话,在错误点我们想要回到计算。希望有所帮助!您希望向用户提供某种消息,因此他们知道存在错误。

我们必须这样做,因为在用户按下等号按钮时,tbkSum内的值已经改变,我们需要在用户更改值之前,所以抓住的最佳时间它是在我们在成功计算时更新tbkSum文本值

的时候

这也假设您每次进行计算时都不会创建Calculate类的新实例。否则,您需要将号码存储在其他地方

修改 解决此问题的另一种方法是首先防止重复,我从您的其他注释中读到,您可以通过应用程序上的按钮控制文本框中的内容。假设所有按钮都使用buttonFunction()的相同方法,那么你可以这样做:

private char[] buttonChars = {'/','*', '+'/*e.t.c*/}
void buttonFunction(){
    string buttonPressedStr = myButton.Content.ToString();
    char buttonPressed = buttonPressedStr[0];
    int pos = Array.IndexOf(buttonChars , buttonPressed);
    if (pos > -1)
    {
        if (tbxSum.Text.Length > 0){
            char last = tbxSum.Text[tbxSum.Text.Length - 1];
            pos = Array.IndexOf(buttonChars , last);
        }
        else
            pos = 0;
        if (pos > -1){
            tbkSum.Text += buttonPressedStr;
        }
}

有更简洁的方法可以做到这一点,但它是一个例子,说明如何首先阻止您的问题。一些解释:

  1. buttonChars是您的不同按钮类型的数组,它们将附加到框中的文本中,例如+, - 等等
  2. 首先检查按下的按钮是否在指定的buttonChars
  3. 集合中
  4. 如果是这样,我们必须检查添加到tbxSum的最后一件事是
  5. 如果在tbxSum数组中再次找到添加到buttonChars的最后一件事,我们就不想附加字符串
  6. 否则,如果tbxSum为空或者最后有另一个角色,我们可以附加我们的角色

答案 1 :(得分:2)

您可以将旧值存储在try块的变量中,并再次在catch块中使用此变量:

string oldSumValue = tbxSum.Text;

try
{
    // your code          
}
catch
{
    tbxSum.Text = oldSumValue ;
    MessageBox.Show("Invalid Sum");       
}

答案 2 :(得分:1)

或者我提出这个以防止出现:

A)重复'*'或'/'

B)以'*'或'/'

开头的总和
public MainWindow()
    {
        InitializeComponent();

        if (tbxSum.Text == "")
        {
            btnDiv.IsEnabled = false;
            btnMult.IsEnabled = false;
        }
    }

    protected void btnSumClick(object sender, EventArgs e)
    {

        btnDiv.IsEnabled = true;
        btnMult.IsEnabled = true;

        var myButton = (Button)sender;
        int pos = tbxSum.Text.Length;

        if (pos > 0)
        {

            if ((tbxSum.Text[pos - 1] == '/' || tbxSum.Text[pos - 1] == '*') &&
                (myButton.Content.ToString() == "/" || myButton.Content.ToString() == "*"))
            {
                int location = tbxSum.Text.Length - 1;
                tbxSum.Text = tbxSum.Text.Remove(location, 1);
            }

        }
    }