5단계: NumericUpDown 컨트롤에 대한 Enter 이벤트 처리기 추가

이 자습서의 5단계에서는 퀴즈 문제의 답을 좀 더 쉽게 입력할 수 있도록 Enter 이벤트 처리기를 추가합니다. 이 코드에서는 퀴즈를 푸는 사람이 NumericUpDown 컨트롤을 선택하고 다른 값을 입력하는 즉시 각 NumericUpDown 컨트롤의 현재 값을 선택하고 지웁니다.

참고

이 항목은 기본 코딩 개념에 대해 설명하는 자습서 시리즈의 일부입니다. 자습서에 대한 개요는 자습서 2: 시간이 지정된 수학 퀴즈 만들기를 참조하세요.

기본 동작을 확인하려면

  1. 프로그램을 실행하고 퀴즈를 시작합니다.

    더하기 문제의 NumericUpDown 컨트롤에서 0 옆에 커서가 깜박이고 있습니다.

  2. 3을 입력하면 컨트롤에 30이 표시됩니다.

  3. 5를 입력하면 350이 나타나지만 잠시 후 100으로 변경됩니다.

    이 문제를 해결하려면 먼저 무엇이 문제인지 알아야 합니다. 즉, 3을 입력했을 때 0이 사라지지 않는 이유와 350이 잠시 나타났다가 100으로 변경되는 이유가 무엇인지 알아야 합니다.

    이 동작은 예기치 않은 동작으로 보일 수 있지만 코드의 논리를 보면 그럴만한 이유가 있습니다. 시작 단추를 선택하면 단추의 Enabled 속성이 False로 설정되어 단추가 흐리게 표시되고 사용할 수 없게 됩니다. 프로그램에서는 현재 선택 항목(포커스가 있는 항목)을 TabIndex 값이 그 다음으로 가장 낮은 컨트롤(더하기 문제의 NumericUpDown 컨트롤)로 변경합니다. Tab 키를 사용하여 NumericUpDown 컨트롤로 이동하면 커서가 자동으로 컨트롤의 시작 부분에 놓이게 되어 숫자를 입력하면 오른쪽이 아닌 왼쪽에서 입력됩니다. 100으로 설정된 MaximumValue 속성 값보다 큰 값으로 숫자를 지정할 경우, 입력하는 숫자가 이 속성 값으로 대체됩니다.

NumericUpDown 컨트롤에 대한 Enter 이벤트 처리기를 추가하려면

  1. 폼에서 이름이 "sum"인 첫 번째 NumericUpDown 컨트롤을 선택한 다음 속성 대화 상자에서 도구 모음의 이벤트 아이콘을 선택합니다.

    속성 대화 상자의 이벤트 탭에 폼에서 선택하는 항목에 대해 응답(처리)할 수 있는 모든 이벤트가 표시됩니다. 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);
        }
    }
    

    이 코드는 복잡하게 보일 수 있지만 차근차근 살펴보면 쉽게 이해할 수 있습니다. 먼저 메서드의 맨 위를 살펴보면 object sender(Visual C#) 또는 sender As System.Object(Visual Basic)가 있습니다. 이 매개 변수는 이벤트를 발생시킨 개체, 즉 이벤트 전송자를 참조합니다. 이 코드에서는 전송자 개체가 NumericUpDown 컨트롤입니다. 따라서 메서드의 첫 번째 줄에서 해당 전송자가 단순히 일반 개체가 아니라 NumericUpDown 컨트롤임을 명시적으로 지정합니다. 모든 NumericUpDown 컨트롤은 개체이지만 모든 개체가 NumericUpDown 컨트롤은 아닙니다. 이 메서드에서 NumericUpDown 컨트롤의 이름은 answerBox입니다. 이 이름은 sum NumericUpDown 컨트롤뿐 아니라 폼의 모든 NumericUpDown 컨트롤에 사용되기 때문입니다. 이 메서드에 answerBox 변수를 선언하기 때문에 변수 범위가 이 메서드로만 한정됩니다. 다시 말해 이 메서드 내에서만 이 변수를 사용할 수 있습니다.

    다음 줄에서는 answerBox가 개체에서 NumericUpDown 컨트롤로 성공적으로 변환(캐스팅)되었는지 여부를 확인합니다. 변환에 실패할 경우 변수 값은 null(C#) 또는 Nothing(Visual Basic)입니다. 세 번째 줄은 NumericUpDown 컨트롤에 표시되는 답의 길이를 가져오고, 네 번째 줄은 이 길이를 기준으로 컨트롤의 현재 값을 선택합니다. 이제 퀴즈를 푸는 사람이 컨트롤을 선택하면 Visual Studio에서 이 이벤트를 발생시키고 현재 답이 선택됩니다. 퀴즈를 푸는 사람이 다른 답을 입력하기 시작하면 이전 답이 지워지고 새 답으로 대체됩니다.

  4. Windows Forms 디자이너에서 difference NumericUpDown 컨트롤을 선택합니다.

  5. 속성 대화 상자의 이벤트 페이지에서 Enter 이벤트로 스크롤하여 행 끝의 드롭다운 화살표를 선택한 다음 방금 추가한 answer_Enter 이벤트 처리기를 선택합니다.

  6. product 및 quotient NumericUpDown 컨트롤에 대해 이전 단계를 반복합니다.

  7. 프로그램을 저장한 후 실행합니다.

    NumericUpDown 컨트롤을 선택하면 기존 값이 자동으로 선택되고 다른 값을 입력하기 시작하면 기존 값이 지워집니다.

계속하거나 검토하려면