手順 5: NumericUpDown コントロールの Enter イベント ハンドラーの追加
この時点では、NumericUpDown コントロールの数値の入力が適切ではありません。これを修正するには、Enter イベント ハンドラーを追加します。
NumericUpDown コントロールの動作を確認するには
プログラムを実行し、ゲームを開始します。sum NumericUpDown コントロールで、0 (ゼロ) の横のカーソルが点滅します。
「3」と入力すると、30 と表示されます。さらに「5」と入力すると 350 と表示されますが、その後すぐに 100 に変わります。
この問題を修正する前に、状況をまとめておきましょう。まず、「3」と入力したときに 0 が消えない理由について考えます。また、350 が 100 に変わる理由と、変わるまでに少し時間がかかる理由についても考えてみます。
注意
この動作は適切ではないように見えますが、このように動作するのには理由があります。[Start] ボタンをクリックすると、ボタンの Enabled プロパティが False に設定され、ボタンが淡色表示になり使用できなくなります。プログラムは TabIndex の値が次に小さいコントロール (sum NumericUpDown コントロール) を探し、そのコントロールにフォーカスを切り替えます。Tab キーを使用して NumericUpDown コントロールに移動すると、カーソルはそのコントロールの先頭に自動的に移動します。これが原因で、入力した数値が右ではなく左から入力されます。MaximumValue プロパティの値 (100 に設定されています) を超える数値を入力すると、入力した数値が最大値に置き換えられます。
NumericUpDown コントロールの Enter イベント ハンドラーを追加するには
この不適切な動作が発生しないようにしてプログラムを使用しやすくするには、それぞれの NumericUpDown コントロールの Enter イベントに対するイベント ハンドラーを追加します。[プロパティ] ダイアログ ボックスの [イベント] ページを使用して、sum NumericUpDown コントロールに対する answer_Enter という Enter イベント ハンドラーを追加します。
[プロパティ] ダイアログ ボックス
コードは次のようになります。
Private Sub answer_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles sum.Enter ' Select the whole answer in the NumericUpDown control. Dim answerBox As NumericUpDown = TryCast(sender, NumericUpDown) If answerBox IsNot Nothing Then Dim lengthOfAnswer As Integer = answerBox.Value.ToString().Length answerBox.Select(0, lengthOfAnswer) End If End Sub
private void answer_Enter(object sender, EventArgs e) { // Select the whole answer in the NumericUpDown control. NumericUpDown answerBox = sender as NumericUpDown; if (answerBox != null) { int lengthOfAnswer = answerBox.Value.ToString().Length; answerBox.Select(0, lengthOfAnswer); } }
最初は複雑に思えるかもしれませんが、順番に見ていけば簡単に理解できます。まず、メソッドの先頭の部分 (C# の場合は object sender、Visual Basic の場合は sender As System.Object) を見てください。これは、メソッド内で sender を使用するときはいつでも、Enter イベントが発生している NumericUpDown コントロールを参照することを意味します。したがって、メソッドの 1 行目で、sender が単なるオブジェクトではなく、具体的には NumericUpDown コントロールであることを指定しています (NumericUpDown コントロールはいずれもオブジェクトですが、オブジェクトがすべて NumericUpDown コントロールであるとは限りません)。次の行では、answerBox がオブジェクトから NumericUpDown コントロールに正常に変換 (キャスト) されたかどうかを確認しています。正常に変換されなかった場合は、値が null (C#) または Nothing (Visual Basic) になります。3 行目では、NumericUpDown コントロールに現在表示されている答えの長さを確認しています。4 行目は、NumericUpDown コントロールに答えを選択するように指示する行です。これにより、ユーザーがコントロールに移動したときに、このイベントが発生し、答えが選択されます。ユーザーが入力を開始するとすぐに、前の答えが消去されて新しい答えに置き換えられます。
このイベント ハンドラーの準備ができたら、Windows フォーム デザイナーに移動し、difference NumericUpDown コントロールを選択します。[プロパティ] ダイアログ ボックスの [イベント] ページに移動し、下にスクロールして Enter イベントを見つけ、追加したイベント ハンドラーを選択します。
product および quotient の各 NumericUpDown コントロールに対して、同じ操作を実行します。
プログラムを保存し、実行します。不適切な動作が発生しなくなります。
続行または確認するには
チュートリアルの次の手順に進むには、「手順 6: 減算問題の追加」を参照してください。
チュートリアルの前の手順に戻るには、「手順 4: CheckTheAnswer() メソッドの追加」を参照してください。