2013-05-28 189 views
1

我在asp.net的學習階段,所以決定做一個在線計算器。問題是當我做一個計算1 + 5 =它根本沒有提供任何輸出。我試過調試。保持變量值

Click button 1 : 
       first value = 1; 
click button + : 
       first value = null; 
click button 5 : 
       first value = 5 
click button = 
       NOTHING :) 

這裏是我的C#代碼:

public partial class _Default : System.Web.UI.Page 
{ 
    string firstOperand; 
    string secondOperand; 
    string Operator; 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    protected void btnOff_Click(object sender, EventArgs e) 
    { 
     txtScreen.Enabled = false; 
     ClearVariables(); 
    } 
    protected void btnOn_Click(object sender, EventArgs e) 
    { 
     txtScreen.Enabled = true; 
     ClearVariables(); 
    } 
    private void ClearVariables() 
    { 
     firstOperand = ""; 
     secondOperand = ""; 
     Operator = ""; 
    } 
    protected void Operand(string value) 
    { 
     if (value == null) return; 
     try 
     { 
      txtScreen.Text = value; 
      if (firstOperand == null) 
      { 
       firstOperand = value; 
      } 
      else 
      { 
       if (Operator == null) 
       { 
        firstOperand.Insert(firstOperand.Length, value); 
       } 
       else 
       { 
        secondOperand.Insert(secondOperand.Length, value); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
     } 

    } 
    protected void Num1_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = Num1.Text; 
     Operand(Num1.Text); 

    } 
    protected void Num2_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = Num2.Text; 
     Operand(Num2.Text); 
    } 
    protected void Num3_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = Num3.Text; 
     Operand(Num3.Text); 

    } 
    protected void Num4_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = Num4.Text; 
     Operand(Num4.Text); 
    } 
    protected void Num5_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = Num5.Text; 
     Operand(Num5.Text); 
    } 
    protected void Num6_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = Num6.Text; 
     Operand(Num6.Text); 

    } 
    protected void Num7_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = Num7.Text; 
     Operand(Num7.Text); 
    } 
    protected void Num8_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = Num8.Text; 
     Operand(Num8.Text); 
    } 
    protected void Num9_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = Num9.Text; 
     Operand(Num9.Text); 
    } 
    protected void Num0_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = Num0.Text; 
     Operand(Num0.Text); 
    } 


    protected void btnClr_Click(object sender, EventArgs e) 
    { 
     txtScreen.Text = ""; 
     ClearVariables(); 
    } 
    protected void OpDiv_Click(object sender, EventArgs e) 
    { 
     if (firstOperand != null) 
     { 
      txtScreen.Text = ""; 
      Operator = OpDiv.Text; 

     } 
    } 
    protected void OpMul_Click(object sender, EventArgs e) 
    { 
     if (firstOperand != null) 
     { 
      txtScreen.Text = ""; 
      Operator = OpMul.Text; 

     } 
    } 
    protected void OpSub_Click(object sender, EventArgs e) 
    { 
     if (firstOperand != null) 
     { 
      txtScreen.Text = ""; 
      Operator = OpSub.Text; 

     } 
    } 
    protected void OpAdd_Click(object sender, EventArgs e) 
    { 
     if (firstOperand != null) 
     { 
      txtScreen.Text = ""; 
      Operator = OpAdd.Text; 

     } 
    } 
    protected void OpEqual_Click(object sender, EventArgs e) 
    { 
     if (firstOperand == null && Operator == null) 
     { 
      return; 
     } 
     else if (firstOperand != null && Operator != null && secondOperand == null) 
     { 
      secondOperand = firstOperand; 
     } 
     else 
     { 
      double num1; 
      double num2; 
      try 
      { 
       num1 = Double.Parse(firstOperand); 
       num2 =Double.Parse(secondOperand); 
       { 
        switch (Operator) 
        { 
         case "+": 
          num1 += num2; 
          firstOperand = num1.ToString(); 
          txtScreen.Text = firstOperand; 
          break; 
         case "-": 
          num1 -= num2; 
          firstOperand = num1.ToString(); 
          txtScreen.Text = firstOperand; 
          break; 
         case "/": 
          if (num2 == 0) 
          { 
           txtScreen.Text = "Divison by zero"; 

          } 
          else 
          { 
           num1 /= num2; 
           firstOperand = num1.ToString(); 
           txtScreen.Text = firstOperand; 
          } 
          break; 
         case "*": 
          num1 *= num2; 
          firstOperand = num1.ToString(); 
          txtScreen.Text = firstOperand; 
          break; 
         default: txtScreen.Text = "Invalid Operation"; 

          break; 

        } 
       } 
      } 
      catch (Exception ex) 
      { 
       txtScreen.Text = "Not a valid Number"; 
       ClearVariables(); 
      } 
     } 
     ClearVariables(); 
    } 
    protected void OpDot_Click(object sender, EventArgs e) 
    { 
     if (firstOperand != null) 
     { 
      if (Operator == null) 
      { 
       firstOperand.Insert(firstOperand.Length, "."); 
      } 
      else 
      { 
       secondOperand.Insert(secondOperand.Length, "."); 
      } 
     } 
    } 
} 

有人能解釋發生了什麼事?以及如何解決相同的問題。

感謝

+4

你有沒有通過您的代碼加強在所有...?任何異常,錯誤?在你的'Operand'函數中,你可以捕獲(Exception ex)',但不要對異常做任何事情。如果出現問題,我會在「catch」塊中打印。你很難通過查看你的代碼來判斷問題是什麼,使用調試器可能會幫助你更多。 – tnw

+0

我注意到諸如'txtScreen.Text = Num1.Text'這樣的語句是多餘的,看看Operand()是如何做到這一點的。我很好奇txtScreen.Text屬性是否分配了正確的字符串(例如,「6」)?如果您在OpEqual_Click()中轉到該分配,是firstOperand ==「6」?或者是Double.Parse的問題? – DonBoitnott

+0

沒有更多異常和值被正確指定。 – Zigma

回答

2

好的。這裏很簡單,您的價值在回傳時令人耳目一新。所以只需將值保存在viewstate中即可。 在此之前,請減少您的代碼行。

你有

protected void Num5_Click(object sender, EventArgs e) 
{ 
    txtScreen.Text = Num5.Text; 
    Operand(Num5.Text); 
} 

角落找尋10這樣的活動。所以首先要成爲一個單一的事件像

protected void Num_Click(object sender, EventArgs e) 
{ 
    Button btn = (Button)sender; 
    txtScreen.Text = btn.Text; 
    Operand(btn.Text); 
} 

,併爲每個數字鍵的操作數方法現在

分配此事件爲Click事件做出類似

private void Operand(string value) 
    { 

    if(ViewState["FirstOperand"] == null) 
     ViewState["FirstOperand"] = value; 
    else if(ViewState["SecondOperand"] == null) 
     ViewState["SecondOperand"] = value; 

    } 

同樣降低你的代碼添加,分,多,分操作員點擊事件,因爲我剛剛顯示數字按鈕點擊事件上面。 ,並在ViewState [「Operator」]中設置運算符值。

最後在您的OpEqual_Click事件中。像

if(ViewState["FirstOperand"] != null) 
firstOperand = ViewState["FirstOperand"].ToString(); 


if(ViewState["SecondOperand"] != null) 
secondOperand = ViewState["SecondOperand"].ToString(); 

if(ViewState["Operator"] != null) 
Operator = ViewState["Operator"].ToString(); 

希望initally設置第一和第二個操作數這有助於

+0

用於將代碼簡化爲近似1/10的+1:P代碼像魅力一樣工作 – Zigma

1

在我看來,你的問題是在你的ASP.Net環境和/或你的IDE,而不是在你的代碼。我不知道ASP.Net很好,但我知道C#和我注意到這兩個奇怪的事實:

  • 你調試顯示firstOperand被重置爲null或每一個事件之後,當前操作數。

  • 但是,你的代碼從未firstOperandnull。它確實將它設置爲clearVariables中的空字符串(""),但與空("" != null)不同。

因此,我必須結束不是你的代碼的其他的東西被設置firstOperand爲null。最合乎邏輯的來源是你的執行/調試環境,當它初始化執行時,或者當它調用一個新的Page,Class,Method等等時,它會將所有的對象和字符串變量重置爲null(對於任何變量)。

當然,您不希望它爲每個按鈕單擊都這樣做,所以我必須假定您的環境/設置中存在導致此問題的錯誤。

希望別人誰知道ASP.Net更好的話,我可以解釋休息...

+0

+1,好的觀察。 – Zigma

0

是最後我找到了它。

這是sessions的問題。每次點擊按鈕,新會話都會調用並重置所有值。所以我們需要在會話中添加值並恢復它。

像:

Session["Calc"] = firstOperand + ","; 
Session["Calc"] += secondOperand + ","; 
Session["Calc"] += Operator + ","; 

,並在頁面加載:

try 
    { 
     var Data = Session["Calc"].ToString().Split(','); 
     if(Data[0] != "") 
      firstOperand = Data[0]; 
     if (Data[1] != "") 
     Operator = Data[1]; 
     if (Data[2] != "") 
     secondOperand = Data[2]; 
    } 
    catch(Exception ex) 
    { 
    } 

這不是一個很好的解決方案,我認爲(還在學習ASP :))。我可以使用if條件,因爲項目的數量固定爲3.