期望的输出没有到来

时间:2013-12-12 14:14:32

标签: c# asp.net webforms

double num1, num2, result;
String sign = "";


protected void add_Click(object sender, EventArgs e)
{
    sign = "+";
    num1 = double.Parse(tb1.Text);
    tb1.Text = "";
}

protected void equal_Click(object sender, EventArgs e)
{
    try
    {
        num2 = double.Parse(Convert.ToString(tb1.Text));
        if(sign.Equals("+")){
                result = num1 + num2;
                tb1.Text = Convert.ToString(result);
        }
         if(sign.Equals("-")){
                result = num1 - num2;
                tb1.Text = Convert.ToString(result);
        }
        if(sign.Equals("*")){
                result = num1 * num2;
                tb1.Text = Convert.ToString(result);
        }
        if(sign.Equals("/")){
                result = num1 / num2;
                tb1.Text = Convert.ToString(result);
        }

    }
    catch (Exception ex)
    {
        tb1.Text = ex.Message;
    }
}

protected void minus_Click(object sender, EventArgs e)
{
    sign = "-";
    num1 = double.Parse(tb1.Text);
    tb1.Text = "";
}

protected void divide_Click(object sender, EventArgs e)
{
    sign = "/";
    num1 = double.Parse(tb1.Text);
    tb1.Text = "";
}

protected void product_Click(object sender, EventArgs e)
{
    sign = "*";
    num1 = double.Parse(tb1.Text);
    tb1.Text = "";
}

这是我执行算术运算的简单程序,但是当我点击'='按钮时它不会给我结果而是它给了我在文本字段中输入的最后一个数字。 有谁知道代码的问题是什么?

2 个答案:

答案 0 :(得分:3)

Web应用程序是无状态的,为每个请求(GET或POST)创建了一个新类的实例。

因此,每个POST都会重新初始化类中的字段:

double num1, num2, result;
String sign = "";

您需要在某处保留这些字段的值:ViewState将是一个选项。

典型的ViewState支持的属性实现类似于:

public double Num1
{
    get
    {
        o = ViewState["Num1"];
        return (o == null) 0D : (double) o;
    }
    set
    {
        ViewState["Num1"] = value;
    }
}

如果你将每个字段num1,num2,result,sign替换为这样实现的属性(每个都有一个唯一的名称),并且启用了ViewState,那么你应该得到你想要的结果。

答案 1 :(得分:2)

sign变量在此行后被重置为空字符串:

String sign = "";

您需要将sign的值存储在缓存中,以便在回发之间存活。

我建议Session执行此操作,如下所示:

protected void minus_Click(object sender, EventArgs e)
{
    sign = "-";
    // Store sign in Session
    Session["theSign"] = sign;

    num1 = double.Parse(tb1.Text);
    tb1.Text = "";
}

  

注意:在Sessiondivide的其他事件处理程序中执行相同的product存储逻辑。


现在在Page_Load,您需要每次都检查Session的符号值,如下所示:

protected void Page_Load(object sender, EventArgs e)
{
    // Default sign value that may be changed by value in session cache
    String sign = "";

    // Is there a session value for theSign
    if(Session["theSign"] != null)
    {
        // Yes, so set the sign variable value to use in click event handlers
        sign = Session["theSign"].ToString();
    }
}