2017-07-16 18 views
-1

入力されたユーザーの値を取得しようとしていますが、数秒で数えられますが、何か入力して開始ボタンをクリックすると、正しい文字列ではありません。私はグーグルとグーグルしていると入力を取得する方法を把握することはできませんし、解析し、intとそれからカウントダウンに変換しながら、もちろんタイマーを介してラベルを更新します。 私はまだ構文のまわりで私の頭をラップするアプリケーションを慰めるために使用してい...C#入力文字列エラー

using System; 
using System.Windows.Forms; 

namespace Countdown { 

    public partial class Form1 : Form 
    { 

     int seconds; string user; int test = 30; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void tmrCountdown_Tick(object sender, EventArgs e) 
     { 
      lblDisplay.Text = test.ToString(); 

      if (test > 1) 
      { 
       lblDisplay.Text = test.ToString() + " Seconds Remaining"; 
      } 
      else if (test == 1) 
      { 
       lblDisplay.Text = test.ToString() + " Second Remaining"; 
      } 
      else 
      { 

       tmrCountdown.Stop(); 
      } 
      test--; 
     } 

     public void btnStart_Click(object sender, EventArgs e) 
     { 
      int test = int.Parse(txtBoxInput.Text); 

      tmrCountdown.Start(); 
     } 

     private void txtBoxInput_TextChanged(object sender, EventArgs e) 
     { 

     } 

    } 

} 

エラーである「int型のテスト= int.Parse(txtBoxInput.Text);」

+0

何かが始まる前は、(数字はカウントダウンされませんが)数字は機能しますが、もちろん文字/記号でエラーになります。これを行うためのより正しいメソッドがありますか、私は良いプラクティスを学ぼうとしています。私の学習スピードを向上させるために、何か簡単なものをコード化しようとします。 –

+0

'int'も' TryParse'メソッドを持っています。それを見てください。今は入力を整数に変換できると仮定していますが、これは必ずしも当てはまりません。 'int.TryParse'がfalseを返す場合、今のようにキャッチされない例外を作成するのではなく、エラーメッセージをユーザに表示します。 – oerkelens

答えて

0

変更Parseに直接グローバルクラスレベルの変数を使用して解析することはできませんどのような値で見ます:

public void btnStart_Click(object sender, EventArgs e) 
{ 
    if (int.TryParse(txtBoxInput.Text, out test)) 
     // We succeed in parsing, so we continue with the timer 
     tmrCountdown.Start(); 
    else { 
     // We failed in parsing 

     // Let's put keyboard focus on the problem text box... 
     if (txtBoxInput.CanFocus) 
     txtBoxInput.Focus(); 

     // ... and report what's been happened 
     MessageBox.Show($"'{txtBoxInput.Text}' is not a valid integer value", 
         Application.ProductName, 
         MessageBoxButtons.OK, 
         MessageBoxIcon.Warning);  
    } 
} 
+0

お互いありがとう、私はどのようにどのように必要なチェックを忘れて、今私はタイマーのループを修正する必要があります現在の数字は0にとどまるかもしれない入力に関係なくint test = 0; hmm –

+0

@Liam Vallance:かなり正しいです。ローカル変数ではなく 'test'フィールドを使うべきです(私は' int test = 0; 'を落としました)。 –

+0

これはうまくいきました。特に、私が尋ねたすべての質問で、あなたにすべてのことを教えてくれてありがとう。私はスニペットプログラムで学んだことをすべて将来も私を助けるために保っています:) –

0

コードには2つの問題があります。

最初は、無効な入力からコードを保護しないという事実です。 txtBoxInputに何かを入力しなかった場合、または整数に変換できないテキストを入力した場合、無効な文字列フォーマット例外が発生します。

2番目の問題は変数テストです。ボタンのクリックの中でローカルに宣言し、コンパイルエラーが発生していないことを前提にして、タイマーTickイベントで使用しているのと同じ名前でグローバルクラスレベルの変数を設定していないとします。

したがって、ユーザー入力を処理する必要があるたびにTryParseを使用してください。これにより、問題が発生した場合に例外が発生することはありませんが、trueまたはfalseが返されます。最後にボタンクリック内のint型テスト変数を再宣言していませんが、TryParseにTryParse

の出力
public void btnStart_Click(object sender, EventArgs e) 
{ 
    // Try to convert the input in an integer. If this succeed you have 
    // the global variable _test_ set to converted text 
    if(!Int32.TryParse(txtBoxInput.Text, out test) 
     MessageBox.Show("Invalid input. Please type a number!"); 
    else 
     tmrCountdown.Start(); 
} 
0

int test=Convert.ToInt32(txtBoxInput.Text); 
tmrCountdown.Interval = test*1000; //have to multiply to 1000 since timer interval value is in milliseconds. 
tmrCountdown.Start(); 

はちょうどあなたトンに整数を入れて、あなたのボタンでこのコードを試してみてくださいextbox