我从asp.net开始,但我不太确定我做错了什么。实际上我在asp的第一步就是制作一个计算器,但在寻找答案2小时后我决定问你这个问题。
我有10个按钮[0,1,2 ... 9],4个动作按钮[+, - ,*,/]和一个按钮来计算[=]:
int firstNumber, secondNumber;
Button lastClicked;
bool isFirstNumberSet;
protected void Page_Load(object sender, EventArgs e)
{
firstNumber = 0;
isFirstNumberSet = false;
lastClicked = new Button();
}
public void addToTextbox(object sender, EventArgs e)
{
Button number = (Button)sender;
TextBox1.Text += number.Text;
}
public void doSomething(object sender, EventArgs e)
{
if (isFirstNumberSet.Equals(false)) firstNumber = int.Parse(TextBox1.Text);
else secondNumber = int.Parse(TextBox1.Text);
lastClicked = new Button();
lastClicked = (Button)sender;
isFirstNumberSet = true;
TextBox1.Text = "";
}
public void calculate(object sender, EventArgs e)
{
switch (lastClicked.ID)
{
case "ButtonPlus":
TextBox1.Text = (firstNumber + secondNumber).ToString();
isFirstNumberSet = false;
break;
case "ButtonMinus":
TextBox1.Text = (firstNumber - secondNumber).ToString();
isFirstNumberSet = false;
break;
case "ButtonDziel":
TextBox1.Text = (firstNumber / secondNumber).ToString();
isFirstNumberSet = false;
break;
case "ButtonMnoz":
TextBox1.Text = (firstNumber * secondNumber).ToString();
isFirstNumberSet = false;
break;
}
但是当我做2 + 2之类的动作时,之后我点击了“=”。我对该代码有例外:
切换(lastClicked.ID)
它说lastClicked是null,但是怎么样?点击“+”后,这应该将发件人对象保存到此变量。我错了吗?
答案 0 :(得分:1)
您的按钮变量分配不会以您期望的方式在回发之间保留。当calculate
触发你的“=”键时,lastClicked
现在在这个新的“往返”中被取消分配,因此无效。当您按下一个按钮一次,然后按下第二个按钮时,除了将值存储在发送回服务器的数据中捕获的字段中之外,没有上一个命中的记忆。
您可以探索的一种方法是将已选择的操作存储到表单上的隐藏HTML字段中,然后在点击计算例程时查询该字段。这样就无需尝试持久保存“lastClicked”按钮。
在您的aspx中,在您的表单中,您可以添加:
<asp:HiddenField id="Operation" runat="server" />
然后,在你的代码隐藏中响应你的一个操作员按钮:
Operation.Value = "Plus"; // or "+" or whatever is appropriate
然后在下一次旅行中将其发送回客户端,然后在响应“=”按钮单击时调用calculate
方法时将其作为发送回服务器的数据的一部分:
public void calculate(object sender, EventArgs e){
switch(Operation.Value){
case "Plus";
// do the "PLUS" thing
// and so on
... (snip)...
}