2012-05-16 38 views
0

我有麻煩驗證用戶輸入,我有以下循環肯定捕捉它,但是當循環再次啓動用戶沒有機會進入一個不同的價值,所以價值是相同的,只是創建一個無限循環。檢查文本框的循環中的有效輸入或嘗試趕上c#

   private void guess_Click(object sender, EventArgs e) 
    { 


     int guessInt = 0; 

     bool pass = false; 
     int number; 
     while (pass == false) 
     { 
      if (guessInput.Text != "") 
      { 
       pass = Int32.TryParse(guessInput.Text, out number); 
       if (pass) 
       { 
        guessInt = number; 
       } 
       else 
       { 
        MessageBox.Show("You did not enter an integer, please enter a integer", "Invalid Values", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        guessInput.Text = ""; 
       } 
      } 
      else MessageBox.Show("You did not enter anything, please enter a integer", "Invalid Values", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
     guess.Enabled = false; 
     next_Guess.Enabled = true; 

     if (guessInt == randomArray[x]) 
     { 
      result.Text = ("You Win! The correct number was " + randomArray[x]); 
      right += 1; 
      correctAnswers.Text = right.ToString(); 

     } 
     else 
     { 
      result.Text = ("Sorry you lose, the number is " + randomArray[x]); 
      wrong += 1; 
      incorrectAnswers.Text = wrong.ToString(); 

     } 

     hintLabel.Enabled = false; 
     x++; 
    } 

那麼,怎樣才能在用戶有機會重新輸入值和循環重新開始或者我應該在這裏使用一個try/catch嘗試?

+0

你試圖制動用'中斷環路;',然後當用戶輸入一個不同的值再次開始循環。 – Writwick

+0

@ I.am.WritZ,如果我打破循環,特別是在失敗的嘗試期間或其他部分,我不希望在循環後繼續使用無效條目。 – programmerNOOB

+0

所以'打破'循環和'返回''空白'或者你可以維護一個'bool'來保存循環的成功/失敗。 – Writwick

回答

1
int number; 
if(string.IsNullOrEmpty(guessInput.Text)) 
{ 
    MessageBox.Show("You did not enter an integer, please enter a integer", "Invalid Values", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    return; 
} 
if(Int32.TryParse(guessInput.Text, out number)) 
{ 
    guessInt = number; 
}else 
{ 
    MessageBox.Show("You did not enter an integer, please enter a integer", "Invalid Values",  MessageBoxButtons.OK, MessageBoxIcon.Error); 
    guessInput.Text = ""; 
    return; 
} 


// when come to here you have guessInt, process it 

    guess.Enabled = false; 
    next_Guess.Enabled = true; 

    if (guessInt == randomArray[x]) 
    { 
     result.Text = ("You Win! The correct number was " + randomArray[x]); 
     right += 1; 
     correctAnswers.Text = right.ToString(); 

    } 
    else 
    { 
     result.Text = ("Sorry you lose, the number is " + randomArray[x]); 
     wrong += 1; 
     incorrectAnswers.Text = wrong.ToString(); 

    } 

    hintLabel.Enabled = false; 
    x++; 
+0

這樣做,我只需要一個嵌套,如果要覆蓋我所有的理由,謝謝! – programmerNOOB

1

看來你並不需要有一段:如果你想也驗證了空值

  int number; 

      if(guessInput.Text != "") 
      { 
       var pass = Int32.TryParse(guessInput.Text, out number); 
       if (pass) 
       { 
       guessInt = number;   
       } 
       else 
       { 
       MessageBox.Show("You did not enter an integer, please enter a integer", "Invalid Values", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       guessInput.Text = ""; 
       } 
      } 

,只是刪除了第一,如果:

  int number; 

      var pass = Int32.TryParse(guessInput.Text, out number); 
      if (pass) 
      { 
      guessInt = number;   
      } 
      else    { 
      MessageBox.Show("You did not enter an integer, please enter a integer", "Invalid Values", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      guessInput.Text = ""; 
      } 
+0

我可以玩這個,但問題是,如果輸入不是空白,它只是跳過它的一切,輸入永遠不會分配給我需要的值。 – programmerNOOB

+0

我不明白。這段代碼何時執行? – ivowiblo

+0

這是按鈕點擊方法中的一部分,用戶在文本框中輸入一個數字並按下此按鈕,並試圖驗證它。 – programmerNOOB

0

只要用戶單擊消息框上的確定,循環將再次運行而不給用戶改變值的機會。

你需要做的是僅在輸入猜測時才運行驗證。也就是說,不是有循環,而是有一些由事件觸發的代碼(例如單擊按鈕)或由winforms提供的驗證回調。

下面是一個例子,短文章中,我使用驗證回調發現: http://blog.scosby.com/post/2010/02/11/Validation-in-Windows-Forms.aspx

在該示例,請參見:

  • private void buttonSave_Click - 這就是你把你的消息框,並

  • private void textBoxNumber_Validating - 這是你將你的pass = Int32.TryParse(guessInput.Text, out number)...代碼。