首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有一种方法可以在catch块中使用以前在try块中分配的变量?

是否有一种方法可以在catch块中使用以前在try块中分配的变量?
EN

Stack Overflow用户
提问于 2016-05-19 11:10:50
回答 3查看 79关注 0票数 0

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

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

所以我说:

3+3=6

现在,我的计算器将把6放在文本框中,用于下一次和。

所以说我做了:

6/3

计算器拾取的内容无效,但我希望文本框值从前面的和返回到6。

这就是我尝试过的:

代码语言:javascript
运行
复制
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),它显示了前面的和,所以我想,也许我可以把所有的东西都放在等号的右边,但是我不知道怎么做。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-19 11:27:12

代码语言:javascript
运行
复制
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()方法,那么您可以这样做:

代码语言:javascript
运行
复制
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. 如果是这样的话,我们必须检查最后添加到tbxSum中的是什么
  4. 如果最后添加到tbxSum中的内容再次出现在buttonChars数组中,则不希望追加字符串
  5. 否则,如果tbxSum为空或末尾有另一个字符,则可以追加字符。
票数 3
EN

Stack Overflow用户

发布于 2016-05-19 11:13:07

可以将旧值存储在try块之外的变量解密中,并在catch块中再次使用该变量:

代码语言:javascript
运行
复制
string oldSumValue = tbxSum.Text;

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

Stack Overflow用户

发布于 2016-05-20 09:17:10

或者,我想出了这个方法来防止这样的情况发生:

A)“*”或“/”的副本

(B)以'*‘或'/’开头的总和

代码语言:javascript
运行
复制
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);
            }

        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37321465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档