手順 5: NumericUpDown コントロールの Enter イベント ハンドラーの追加

このチュートリアルの第 5 部では、クイズ問題の解答の入力が少し楽になるように Enter イベント ハンドラーを追加します。 このコードは、クイズの受け手が選択して別の値の入力を開始するとすぐに、各 NumericUpDown コントロールの現在の値を選択し、クリアします。

注意

このトピックは、コーディングの基本概念に関するチュートリアル シリーズの一部です。 チュートリアルの概要については、「チュートリアル 2: 制限時間ありの計算クイズの作成」を参照してください。

既定の動作を確認するには

  1. プログラムを実行し、クイズを開始します。

    加算問題の NumericUpDown コントロールで、カーソルが 0 (ゼロ) の横で点滅します。

  2. 3」と入力すると、コントロールが 30 を示すことに注意してください。

  3. 5」と入力すると 350 と表示されますが、その後すぐに 100 に変わります。

    この問題を修正する前に、状況をまとめておきましょう。 「3」を入力したときに 0 が消えなかった理由、および 350100 にすぐに変化しなかった理由を検討します。

    この動作は不適切に見えますが、コードのロジックからすると当然です。 [Start] ボタンをクリックすると、Enabled プロパティが False に設定され、ボタンは淡色表示になり使用できません。 プログラムは、加算問題の NumericUpDown コントロールである、次に小さい TabIndex 値を持つコントロールに現在の選択 (フォーカス) を変更します。 Tab キーを使用して NumericUpDown コントロールに移動すると、カーソルはそのコントロールの先頭に自動的に移動します。このため、入力した数値が右ではなく左から入力されます。 100 に設定されている、MaximumValue プロパティの値を超える数を指定すると、入力した数はそのプロパティの値に置き換えられます。

NumericUpDown コントロールの Enter イベント ハンドラーを追加するには

  1. フォームの最初の NumericUpDown コントロール ("sum") を選択し、次に、[プロパティ] ダイアログ ボックスでツール バーの [イベント] アイコンをクリックします。

    [プロパティ] ダイアログ ボックスの [イベント] タブには、フォーム上で選択した項目に対して応答 (処理) できるイベントがすべて表示されます。 NumericUpDown コントロールを選択したため、そのコントロールに関係のあるすべてのイベントが一覧に表示されます。

  2. Enter イベントをクリックし、「answer_Enter」と入力して、Enter キーを押します。

    [プロパティ] ダイアログ ボックス
    [プロパティ] ダイアログ ボックス

    sum NumericUpDown コントロールの Enter イベント ハンドラーを追加し、そのハンドラーに answer_Enter という名前を付けます。

  3. answer_Enter イベント ハンドラーのメソッドに、次のコードを追加します。

    ''' <summary> 
    ''' Modify the behavior of the NumericUpDown control
    ''' to make it easier to enter numeric values for
    ''' the quiz.
    ''' </summary> 
    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 = TryCast(sender, NumericUpDown)
    
        If answerBox IsNot Nothing Then
            Dim lengthOfAnswer = 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 と呼ばれる、イベントが発生しているオブジェクトを参照します。 この場合、sender オブジェクトは NumericUpDown コントロールです。 したがって、メソッドの 1 行目で、sender が汎用オブジェクトではなく、具体的に NumericUpDown コントロールであると指定します。 (NumericUpDown コントロールはいずれもオブジェクトですが、オブジェクトがすべて NumericUpDown コントロールであるとは限りません)。NumericUpDown コントロールはこのメソッドで answerBox と名付けられます。これは、sum NumericUpDown コントロールだけではなく、フォームのすべての NumericUpDown コントロールに使用されるためです。 このメソッドで answerBox 変数を宣言するため、そのスコープはこのメソッドにのみ適用されます。 つまり、変数はこのメソッド内でのみ使用できます。

    次の行では、answerBox がオブジェクトから NumericUpDown コントロールに正常に変換 (キャスト) されたかどうかを確認しています。 変換が成功しなかったときは、変数は null (C#) または Nothing (Visual Basic) の値になります。 3 行目は NumericUpDown コントロールに表示される解答の長さを取得し、4 行目はこの長さに基づいてコントロールの現在の値を選択します。 これで、クイズの受け手がコントロールを選択すると、Visual Studio がこのイベントを発生させ、現在の解答が選択されます。 クイズの受け手が別の解答の入力を開始するとすぐに、前の解答がクリアされて新しい解答に置き換えられます。

  4. Windows フォーム デザイナーで、difference NumericUpDown コントロールを選択します。

  5. [プロパティ] ダイアログ ボックスの [イベント] ページで、Enter イベントまでスクロールし、行の末尾にあるドロップダウン矢印をクリックし、追加した answer_Enter イベント ハンドラーを選択します。

  6. product および quotient の各 NumericUpDown コントロールに対して、前の手順を繰り返します。

  7. プログラムを保存し、実行します。

    NumericUpDown コントロールを選択すると、既存の値が自動的に選択され、別の値を入力を開始するとクリアされます。

続行または確認するには