我受命在C#Web应用程序上创建一个计算器,但是我注意到当我使用其他按钮中设置的变量时,程序会将它们设置为0,特别是我分配的“ num”和“ sign”变量在PlusBut中,但实际上在EqualBut中使用它们时,它们被分配为0。我的代码在Windows窗体中工作,但这是我第一次使用网站应用程序。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1 {
public partial class About: System.Web.UI.Page {
int sign;
double num, num2;
protected void Page_Load(object sender, EventArgs e) { }
protected void Button4_Click(object sender, EventArgs e) { }
protected void But0_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + "0";
}
protected void But1_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + "1";
}
protected void But2_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + "2";
}
protected void But3_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + "3";
}
protected void But4_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + "4";
}
protected void But5_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + "5";
}
protected void But6_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + "6";
}
protected void But7_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + "7";
}
protected void But8_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + "8";
}
protected void But9_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + "9";
}
protected void PlusBut_Click(object sender, EventArgs e) {
num = double.Parse(AnswerBox.Text);
AnswerBox.Text = "";
sign = 1;
}
protected void DecBut_Click(object sender, EventArgs e) {
AnswerBox.Text = AnswerBox.Text + ".";
}
protected void MinusBut_Click(object sender, EventArgs e) {
num = double.Parse(AnswerBox.Text);
AnswerBox.Text = "";
sign = 2;
}
protected void MultBut_Click(object sender, EventArgs e) {
num = double.Parse(AnswerBox.Text);
AnswerBox.Text = "";
sign = 3;
}
protected void DivButton_Click(object sender, EventArgs e) {
num = double.Parse(AnswerBox.Text);
AnswerBox.Text = "";
sign = 4;
}
protected void EqualBut_Click(object sender, EventArgs e) {
num2 = double.Parse(AnswerBox.Text);
AnswerBox.Text = "" + num + " " + num2 + " " + sign;
}
}
}
答案 0 :(得分:2)
基本上,当您触发回发(通过单击案例中的按钮)时,将创建About
类的新实例,并且字段的先前值也会丢失。
您应该阅读有关ASP Page Life Cycle Events的信息。
有多种使变量持久化的方法,一种是使用Session
或ViewState
变量,这可能是您所用的最简单的解决方案,并且对于计算器来说足够了。
double num1
{
get { return Convert.ToDouble(ViewState["num1"] ?? 0); }
set { ViewState["num1"] = value; }
}
另一种方法是使用JavaScript避免回发,但是通过结合客户端和服务器端操作,这将增加应用程序的复杂性。
答案 1 :(得分:1)
我有点猜测,但是我认为您的问题是Web应用程序不会从一个按钮按下到另一个按钮持续存在。每次用户按下按钮时,浏览器都会向服务器发送请求。服务器创建Web应用程序并向其发出请求,然后该应用程序产生结果。
您需要将一个请求的值持久化到下一个请求。有几种方法可以执行此操作,但是将它们保存到会话中是正常的。确切的植入方法取决于您使用的Web技术。
答案 2 :(得分:0)
ASP.NET是服务器端。因此,每次在客户端触发一次点击时,都会创建一个关于About的新实例,并使用默认值(也称为0)创建sign,num和num2。
要么将JavaScript更改为客户端编程语言,要么将值定义为static。静态变量链接到该类而不是其实例,因此它们将在回调之间保存值:
public partial class About : System.Web.UI.Page
{
static int sign;
static double num;
static double num2;
/* ... */
protected void PlusBut_Click(object sender, EventArgs e)
{
About.num = double.Parse(AnswerBox.Text);
AnswerBox.Text = "";
sign = 1;
}
}