Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metkurs_progr.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
700 Кб
Скачать
☆

Проверка правильности данных на уровне ячейки таблицы

Для проверки правильности следует определить событие CellValidating, которое возникает при выходе из текущей ячейки таблицы (при этом находится в режиме редактирования не обязательно). Вся необходимая информация о текущей ячейки передается через свойства второго параметра e: это индекс строки RowIndex, индекс столбца ColumnIndex и текущее значение ячейки ValueFormatted. Последнее свойство имеет тип object; его реальный тип зависит от типа ячейки (stringдля поля ввода, bool для ячейки флажка). Для запрета выхода из текущей ячейки достаточно положить свойство e.Cancel равным. Одновременно с этим желательно поместить в свойство ErrorText текущей строки текст с кратким описанием ошибки (непустое свойство ErrorText обеспечивает вывод значка ошибки в заголовке соответствующей строки).

Для проверки возможности преобразования содержимого строки к типу int или DateTime используется метод TryParse. Если преобразование невозможно, то в варианте для типа int и других числовых типов второй (выходной) параметр будет содержать нулевое число, а в варианте для типа DateTime– значение DateTime.MinValue.

Определите обработчик события CellValidating для таблицы dataGridView1 следующим образом:

privatevoid dataGridView1_CellValidating( object sender,

DataGridViewCellValidatingEventArgs e)

{

string err = "", s = e.FormattedValue.ToString();

switch (e.ColumnIndex)

{

case 0:// Id

case 4: // Course

case 5: // Group

int i;

if (!int.TryParse(s, outi))

err = "Строку нельзя преобразовать в число";

else

if (i < 0)

err = "Отрицательные числа не допускаются";

break;

case 1: // Surname

if (s == "")

err = "Поле \"Фамилия\" должно быть непустым";

break;

case 2: // Gender

s=s.ToUpper();

if (s != "М"&& s != "Ж")

err = "Допускаются значения \"M\" или \"Ж\"";

break;

case 3: // BirthDate

if (s == "")

break;

DateTime d;

if (!DateTime.TryParse(s, out d))

err = "Строку нельзя преобразовать в дату";

else

{

int age = DateTime.Today.Year - d.Year;

if (age< 15 || age> 50 )

err = "Текущий возраст студента " +

"должен находиться в диапазоне 15-50 лет";

}

break;

}

e.Cancel = err != "";

dataGridView1.Rows[e.RowIndex].ErrorText = err;

}

Теперь при попытке выхода из измененного поля выполняется проверка введенного в него значения, и если это значение не является допустимым, то в заголовке соответствующей строки выводится значок ошибки , при наведении на который появляется всплывающая подсказка, объясняющая причину ошибки. При наличии символа ошибки нельзя выйти из режима редактирования и, следовательно, перейти в другую ячейку таблицы (однако можно нажать клавишу <Esc>, чтобы вернуться к предыдущему, правильному значению текущего поля).

Ошибка. Выход из поля Фамилия последней строки также блокируется, что является неправильным, так как содержимое строки NewRow не соответствует никакому элементу данных.

Исправление. В начало метода dataGridView1_CellValidating вставьте следующий фрагмент

if (dataGridView1.Rows[e.RowIndex].IsNewRow)

return;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]