Поделиться через


Шаг 5. Добавление обработчиков событий входа для элементов управления NumericUpDown

В пятой части этого учебника вам предстоит добавить обработчики событий "Ввод", чтобы сделать ввод ответов на задачи головоломки немного удобнее.Этот код будет выделять и удалять текущее значение в каждом элементе управления NumericUpDown, как только игрок выберет элемент управления и начнет вводить другое значение.

ПримечаниеПримечание

Этот раздел входит в серию учебников, посвященных основам написания кода.Общие сведения об учебнике см. в разделе Учебное руководство 2. Создание ограниченной по времени математической головоломки.

Проверка поведения по умолчанию

  1. Запустите программу и запустите головоломку.

    В элементе управления NumericUpDown для задачи сложения курсор мигает рядом с цифрой 0.

  2. Введите 3 и обратите внимание, что в элементе управления отображается 30.

  3. Введите 5 и обратите внимание, что появляется число 350, но через мгновение оно меняется на 100.

    Перед исправлением ошибки подумайте, почему она возникла.Подумайте, почему цифра 0 не исчезла, когда вы ввели 3, и почему 350 меняется на 100, причем не сразу.

    Такое поведение может показаться странным, но оно полностью соответствует логике кода.При нажатии кнопки Запуск ее свойство Enabled принимает значение False, из-за чего кнопка становится недоступна и отображается серым цветом.Программа переводит текущее выделение (фокус) на элемент управления, имеющий следующее наименьшее значение TabIndex, т. е. элемент управления NumericUpDown для задачи сложения.Когда вы нажимаете клавишу TAB для перехода к элементу управления NumericUpDown, курсор автоматически помещается в начало элемента управления, поэтому вводимые цифры появляются слева, а не справа.При вводе числа, превышающего значение свойства MaximumValue (которому присвоено значение 100), введенное число заменяется значением этого свойства.

Добавление обработчика событий "Ввод" для элемента управления NumericUpDown

  1. Выберите первый элемент управления NumericUpDown (с именем "sum") в форме, а затем в диалоговом окне Свойства выберите на панели инструментов значок События.

    На вкладке События в диалоговом окне Свойства отображаются все события для выбранного в форме элемента, на которые можно реагировать (т. е. которые можно обрабатывать).Поскольку выбран элемент управления NumericUpDown, все перечисленные события относятся к нему.

  2. Выберите событие Ввод, введите answer_Enter и нажмите клавишу ВВОД.

    Диалоговое окно "Свойства"

    Диалоговое окно "Свойства"

    Вы только что добавили обработчик событий "Ввод" для элемента управления NumericUpDown с именем "sum" и назвали этот обработчик 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 в C# или sender As System.Object в Visual Basic.Этот параметр ссылается на объект, событие которого срабатывает. Он называется отправителем.В данном случае объектом-отправителем является элемент управления NumericUpDown.Поэтому в первой строке метода указывается, что отправителем является не просто какой-либо объект, а именно элемент управления NumericUpDown. (каждый элемент управления NumericUpDown это объект, но не каждый объект, это элемент управления NumericUpDown). Элемент управления NumericUpDown в этом методе называется answerBox, поскольку он будет использоваться для всех элементов управления NumericUpDown в форме, а не только для элемента управления NumericUpDown с именем "sum".Поскольку переменная answerBox объявлена в этом методе, ее область действия ограничена этим методом.Иными словами, эту переменную можно использовать только внутри этого метода.

    В следующей строке кода выполняется проверка, что answerBox был успешно преобразован из объекта в элемент управления NumericUpDown.Если бы преобразование завершилось неудачей, переменная имела бы значение null (C#) или Nothing (Visual Basic).Третья строка получает длину ответа, который отображается в элементе управления NumericUpDown, а четвертая строка выделяет текущее значение в элементе управления, основываясь на этой длине.Теперь, когда игрок выбирает элемент управления, Visual Studio запускает это событие, в результате чего текущий ответ выделяется.Как только игрок начинает вводить другой ответ, предыдущий ответ удаляется и заменяется новым ответом.

  4. В конструкторе Windows Forms выберите элемент управления NumericUpDown с именем difference (разность).

  5. На странице События диалогового окна Свойства прокрутите вниз до события Ввод, щелкните направленную вниз стрелку в конце строки, а затем выберите обработчик событий answer_Enter, который вы только что добавили.

  6. Повторите предыдущий шаг для элементов управления NumericUpDown с именами product и quotient (т. е. произведение и частное).

  7. Сохраните программу и запустите ее.

    При выборе элемента управления NumericUpDown существующее значение автоматически выделяется и удаляется, когда вы начинаете вводить другое значение.

Продолжить или повторить пройденный материал