Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб раб5.doc
Скачиваний:
1
Добавлен:
21.11.2019
Размер:
782.85 Кб
Скачать

1.5. Проверка данных, вводимых

пользователем

Как правило, через интерфейс пользователи передают приложениям различную информацию. Проверка вводимых данных гарантирует, что пользователю разрешается продолжить работу с программой только после ввода данных, отвечающих заданным параметрам. Предположим, что в группе полей для ввода адреса есть поле почтового индекса. Прежде чем принять введенное в это поле значение, следует удостовериться, что пользователь ввел именно пять символов, причем все пять - цифры. Проверка введенных пользователем данных уменьшает вероятность ошибки ввода и повышает устойчивость приложения.

На этом занятии вы научитесь применять события для проверки пользовательского ввода и передачи фокуса ввода другим формам и узнаете, как выполнить проверку на уровне полей (когда поля проверяются по мере их заполнения) или на уровне формы (когда все поля проверяются одновременно). Вы также научитесь задавать диапазон допустимых значений при помощи свойств элемента управления и применять компонент ErrorProvider для отображения пользователю сообщений с описанием допущенной им ошибки.

Разработчик вправе указать один из двух типов проверки вводимой информации: на уровне поля и на уровне формы. Проверка на уровне формы выполняется после того, как пользователь заполнит все поля формы. Предположим, что пользователь должен заполнить поля для ввода имени, адреса и номера телефона, а затем щелкнуть ОК. Если задана проверка на уровне формы, все поля формы проверяются одновременно после щелчка кнопки ОК.

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

Проверка на уровне поля

В ряде случаев необходимо проверять данные сразу же после их ввода, что позволяет осуществлять проверку полей по мере их заполнения

Применение свойств элемента управления TextBox

Чаще всего для приема данных от пользователя применяется элемент управления TextBox. Некоторые из его свойств позволяют ограничивать диапазон значений, вводимых в текстовое поле, например:

MaxLength

PasswordChar

Readonly

Multiline

MaxLength

Свойство MaxLength ограничивает число символов, которые можно ввести в текстовое поле. Если пользователь попытается ввести больше символов, чем задано свойством MaxLength, текстовое поле не примет избыточные символы, а пользователь услышит звуковой сигнал. С помощью этого свойства удобно создавать поля для ввода значений фиксированной длины, например почтовых индексов.

PasswordChar

Свойство PasswordChar позволяет скрывать от посторонних глаз значение, вводимое во время выполнения. Например, если сделать значением свойства PasswordChar звездочку (*), текстовое поле будет отображать все вводимые пользователем символы как звездочки. Этот прием обычно используют для защиты паролей в окнах входа.

Для замены пароля вы можете назначить любой допустимый символ, например точку с запятой или знак «&». Независимо от назначенного символа, свойство Text всегда содержит то значение, которое реально ввел пользователь.

ReadOnly

Свойство ReadOnly определяет, разрешено ли пользователю редактировать значение текстового поля. Если это свойство установлено в true, пользователю не удастся изменить отображаемый в поле текст, в противном случае значение текстового поля можно редактировать, как обычно.

Multiline

Свойство Multiline определяет, одна или много строк в поле. Если оно установлено в true, пользователь может вводить многострочный текст, завершая строки символом возврата каретки. Введенные строки сохраняются в виде строкового массива в наборе Text Box. Lines. Чтобы получить нужную строку, следует указать ее индекс в массиве.

Применение событий для проверки на уровне поля

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

Key Down

KeyPress

KeyUp

События KeyDown и KeyUp

Нажатие и освобождение любой клавиши сопровождается генерацией события KeyDown и KeyUp соответственно. Источником событий является элемент управления, обладающий фокусом ввода. Элемент управления, генерировавший событие, передает сведения о нажатой (или отпущенной) клавише (или сочетании клавиш) через экземпляр класса KeyEventArgs — класса, описывающего сочетание клавиш. В сигнатуре метода, обрабатывающего событие KeyDown или KeyUp, должен быть параметр типа KeyEventArgs.

Чаще всего события KeyDown и KeyUp используют, чтобы определить, нажаты ли клавиши Alt, Ctrl или Shift. Результат передается обработчику соответствующего события через ссылку на экземпляр класса KeyEventArgs. Его свойства Ait, Ctrl и Shift возвращают значения типа Boolean, указывающие, были ли нажаты соответствующие клавиши. Значение True свидетельствует о том, что клавиша была нажата, а false — о том, что нет. Ниже показан пример обработчика события KeyUp, проверяющего нажатие клавиши Alt:

private void textBox1_KeyUp(object sender,

System.Windows.Forms.KeyEventArgs e)

{

if (e.Alt == true)

MessageBox.Show("The ALT key is still down");

}

Свойство KeyEventArgs.KeyCode позволяет определить, какая именно клавиша спровоцировала событие. Это свойство возвращает код нажатой или отпущенной клавиши (соответственно при событиях KeyDown или KeyUp). Ниже показан пример простого обработчика события, отображающего сообщение с кодом нажатой клавиши:

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)

{ MessageBox.Show(e. KeyCode.ToString()); }

Keypress

Когда пользователь нажимает клавишу, которой соответствует значение ASCII, генерируется событие KeyPress. К этим клавишам относятся все алфавитно-цифровые клавиши (a— z, A— Z, 0—9), а также ряд специальных клавиш, таких, как Enter и Backspace. Если при нажатии клавиши или их комбинации не генерируется ASCII-символ, событие KeyPress также не генерируется. К таким клавишам относятся клавиши -модификаторы Ctrl и Alt, а также все функциональные клавиши.

Это событие очень удобно для перехвата нажатия клавиш и проверки соответствующих символов. При генерации события KeyPress обработчик получает экземпляр класса KeyEventArgs, свойство Key EventArgs. Key Code которого содержит ASCII-символ клавиши, нажатие которой спровоцировало это событие. Чтобы проверить, например, была ли нажата цифра, достаточно проверить свойство KeyChar в обработчике события KeyPress.

Проверка вводимых символов

Тип данных Char поддерживает несколько статических [Shared (static)] методов, удобных для проверки символов, переданных событием KeyPress:

Char.IsDigit

Char.IsLetter

Char. IsLetterOrDigit

Char. Is Punctuation

Char.IsLower

Char.IsUpper

Все они проверяют символы и возвращают булевы значения. Что проверяет каждый метод — легко догадаться по его имени. Функция Char.IsDigit возвращает true, если переданный ей символ является цифрой, и false в любом другом случае; Char.IsLower возвращает true, если ее аргументом является буква в нижнем регистре, и false в противном случае; сходным образом работают остальные методы. Вот пример применения метода Char.IsDigit для проверки нажатия цифр на клавиатуре:

private void textBox1_KeyPress (object sender,

System. Windows. Forms. KeyPressEventArgs e)

{

if (Char. IsDigit(e. KeyChar) == true)

MessageBox.Show("You pressed a number key");

}

Работа с фокусом ввода

Объект, обладающий фокусом, способен получать пользовательский ввод, осуществляемый мышью или через клавиатуру. На форме может быть несколько элементов управления, но в каждый момент времени фокус ввода только у одного из них.

Элемент управления, обладающий фокусом, всегда находится на активной форме приложения.

У каждого элемента управления есть метод Focus, который передает фокус ввода вызвавшему его элементу управления. Метод Focus возвращает булево значение, свидетельствующее об успешной или неудачной передаче фокуса. Деактивированные или невидимые элементы управления не получают фокус ввода. Определить, способен ли данный элемент управления получить фокус ввода, позволяет его свойство CanFocus: если оно возвращает true, элемент управления может получить фокус, а если false — нет.

// Проверить, может ли TextBox1 получить фокус,

// и, если да, передать ему фокус.

if (textBox1.CanFocus == true)

textBox1.Focus();

События, связанные с передачей фокуса, генерируются в следующем порядке:

1. Enter

1. GotFocus

3. Leave

4. Validating

5. Validated

6. LostFocus

События Enter, Leave генерируются, когда фокус переходит к элементу управления (но еще не получен им) и покидает его. События GotFocus и LostFocus генерируются при получении и потере фокуса элементом управления. В принципе, эти события можно применять для проверки вводимых значений на уровне поля, однако события Validating и Validated лучше подходят для этой цели.

События Validating и Validated

Проще всего проверить вводимые данные при помощи события Validating, генерируемого перед потерей фокуса элементом управления. Это событие генерируется, только если у элемента управления, который получит фокус следующим, свойство Causes Validation установлено в true. Поэтому, если значение элемента управления предполагается проверять при помощи события Validating, для элемента управления, который получит фокус следующим, свойство CausesValidation следует установить в true. Кроме того, использование события Validating требует, чтобы свойство CausesValidation у проверяемого элемента управления было установлено в true. У всех элементов управления, созданных во время разработки, свойство CausesValidation установлено в true по умолчанию, обычно исключение составляет лишь кнопка Help.

Событие Validating позволяет выполнять довольно сложную проверку значений элементов управления. Обработчик этого события способен, например, проверять соответствие введенного значения некоторому весьма специфическому формату или запрещать передачу фокуса другому элементу управления, пока пользователь не введет какое-либо значение.

Событие Validating включает экземпляр CancelEventArgs — класса с единственным свойством Cancel. Если введенное значение не отвечает заданным параметрам, проверив свойство Cancel в обработчике события Validating, можно отменить дальнейшую обработку этого события и вернуть фокус исходному элементу управления.

Событие Validated генерируется после успешной проверки значения элемента управления и позволяет выполнить некоторые действия в зависимости от результатов проверки.

Ниже показан пример обработчика события Validating, который не разрешает передать фокус следующему элементу управления, пока пользователь не введет значение в поле TextBoxl.

private void textBox1_Validating(object sender,

System. ComponentModel. CancelEventArgs e)

{

// Проверить значение TextBoxl

if (textBoxt.Text == "")

{// Если поле TextBoxl пусто, зернуть ему фокус

e. Cancel = true;

}

Применение события Validating для проверки текстового поля

1. Поместите на форму текстовое поле.

2. Создайте для него обработчик события Validating, устанавливающий свойство e. Cancel в true, чтобы прервать проверку и вернуть фокус текстовому полю.

3. Для всех элементов управления, которые не должны генерировать событие Validating, установите свойство Causes Validation в false.

Проверка на уровне формы

Проверка на уровне формы позволяет одновременно проверить все поля формы.

Для подобной проверки обычно применяют процедуру, которая вызывается, когда пользователь готов открыть другую форму; более совершенный способ — обработка на уровне формы события, связанного с клавиатурой.

Ниже показан пример метода, выполняющего проверку на уровне формы. По щелчку кнопки btnValidate этот метод проверяет, все ли текстовые поля формы заполнены. Если обнаружено пустое поле, метод передает ему фокус.

private void btnValidate_Click(object sender, System. EventArgs e)

{

// Проверить все элементы управления формы в цикле.

foreach (System. Windows. Forms. Control aControl in this. Controls)

{

// Если этот элемент управления - текстовое поле,

// проверить, не пусто ли оно.

if (aControl is System. Windows. Forms. TextBox && aControl. Text ==””

{// Если обнаружено пустое текстовое поле,

// передать ему фокус и выйти из метода.

aControl. Focus();

return;

}

}

}

Обработка событий клавиатуры на уровне формы

Обработка связанных с клавиатурой событий на уровне формы — более сложная методика, чем показанная только что. Централизованная обработка событий, связанных с клавиатурой, позволяет управлять вводом данных в любое поле формы.

Например, можно написать метод, активирующий командные кнопки только после заполнения всех полей формы и выполняющий определенные действия в зависимости от того, какие клавиши нажимаются.

Обработку событий на уровне формы реализуют с применением событий KeyPress , KeyDown и KeyUp. Форма автоматически генерирует события клавиатуры, только если на ней нет активированных или видимых элементов управления, в противном случае эти события генерирует элемент управления, получающий фокус.

Чтобы заставить форму автоматически генерировать события клавиатуры, следует установить ее свойство KeyPreview в true — в результате форма будет генерировать эти события прежде элемента управления, получившего фокус. Предположим, что событие KeyPress обрабатывается и формой, и размещенным на нем текстовым полем, а свойство KeyPreview формы установлено в true. При нажатии клавиши форма первой генерирует событие KeyPress, поэтому ее обработчик этого события исполняется первым, и только после его завершения будет исполнен обработчик события KeyPress текстового поля.

Оповещение пользователя об ошибках ввода

Если пользователь ввел в поле недопустимое значение, необходимо оповестить его об этом и дать возможность исправить ошибку. Существует много способов уведомления об ошибках ввода. Если ошибка очевидна и ее не требуется пояснять, можно ограничиться звуковым сигналом.

Примечание В Visual C# нет встроенных методов, отвечающих за подачу звуковых сигналов.

Привлечь внимание пользователя к ошибке можно и по-другому, изменив цвет фона или текста элемента управления (при помощи его свойств BackColor и ForeColor соответственно). Например, выделить текстовое поле с недопустимым значением, задав для него красный фон через свойство BackColor.

Чтобы вывести более информативное описание ошибки, воспользуйтесь методом MessageBox.Show, отображающим небольшое модальное окно с сообщением.

Поскольку это окно — модальное, пользователю не удастся просто игнорировать его и продолжить работу с программой. Вот пример вызова метода Message Box. Show;

MessageBox.Show("That value is not valid for this control");

Компонент ErrorProvider

Компонент ErrorProvider предоставляет удобный способ оповещения пользователей о допущенных ими ошибках ввода. Он позволяет задать для каждого элемента управления формы текст сообщения, отображаемого при вводе недопустимого значения. Если для элемента управления задан текст сообщения об ошибке, то при возникновении ошибки рядом с ним появится соответствующий значок, а если навести на него указатель мыши, отобразится всплывающая подсказка с заданным сообщением. Компонент ErrorProvider расположен в секции Windows Forms панели Toolbox.

Отображение сообщений об ошибках

Метод SetError компонента ErrorProvider позволяет вывести сообщение об ошибке рядом с элементом управления. Этот метод принимает имя элемента управления и текст сообщения об ошибке в качестве параметров; вызывают его так:

// Предполагается существование элемента управления nameTextBox

// и компонента ErrorProvider с именем myErrorProvider.

myErrorProvider.SetError(nameTextBox, "Name cannot be left blank!");

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

Сообщение об ошибке разрешается задавать и во время проектирования Если изучить окно Properties после добавления на форму компонента ErrorProvider, нетрудно заметить, что у каждого элемента управления появилось новое свойство Error on х, где х — имя экземпляра ErrorProvider. Во время проектирования значение этого свойства задают через окно Properties, во время выполнения заданное таким образом значение отображается как сообщение об ошибке для данного элемента, Ряд свойств компонента ErrorProvider определяет способ отображения сообщения об ошибке. Свойство Icon задает значок, отображаемый после элемента управления. Одна форма может содержать несколько экземпляров ErrorProvider, например один, отображающий сообщения об ошибках, а другой — предупреждения, при этом каждому экземпляру ErrorProvider разрешается назначить собственный значок. Другое свойство этого компонента — BlinkStyle — заставляет значок мигать, частоту мигания определяет свойство BlinkRate.

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

1. Создайте форму и добавьте к ней компонент ErrorProvider — он появится в области компонентов.

2. Установите в true свойство CausesValidation элемента управления, который должен выводить сообщения об ошибках, если это еще не сделано.

3. Добавьте к обработчику события Validating этого элемента управления код, проверяющий введенное в него значение. При помощи метода SetError установите текст сообщения, которое отображается, если при проверке введенного обнаружится ошибка. Вот пример обработчика, использующего экземпляр компонента ErrorProvider с именем my Error Provider; этот обработчик проверяет текстовое поле pswordTextBox:

private void pswordTextBox_Validating(object sender,

System.ComponentModel.CancelEventArgs e)

{

// Проверить введенное значение,

if (pswordTextBox.Text == "")

{// Задать текст сообщения об ошибке ввода.

myErrorProvider. Set Error (pswordTextBox, "Password cannot be blank!");

}

else

{

// Если введено допустимое значение, очистить текст сообщения:

// поскольку ошибки нет, сообщение не выводится.

myErrorProvider.SetError{pswordTextBox, "");

}

}

Преобразование типов

Для преобразования типов используются следующие методы:

// преобразование текста в целое число int balance = Convert.ToInt32(textBox1.Text); // преобразование целого числа в текст textBox1.Text = Convert.ToString(balance);

Процесс создания приложения заключается в выполнении следующих шагов:

1. Создать интерфейс приложения (перетащить все необходимые компоненты, настроить их свойства).

2. Настроить обработку событий необходимых компонент.