0

ユーザー入力の検証に問題があります。次のループで確実にキャッチされますが、ループが再開されると、ユーザーは別の値を入力する機会がないため、値は同じであり、無限のループが作成されます。

              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の試行を使用する必要がありますか?

4

3 に答える 3

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 = "";
          }
于 2012-05-16T03:32:51.203 に答える
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++;
于 2012-05-16T03:47:47.430 に答える
0

ユーザーがメッセージボックスで[OK]をクリックするとすぐに、ユーザーに値を変更する機会を与えることなく、ループが再び実行されます。

あなたがする必要があるのは、彼らが推測を入力したときにのみ検証を実行することです。つまり、ループではなく、イベント(ボタンのクリックなど)または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)...コードを配置します。

于 2012-05-16T03:36:47.530 に答える