- •230100.1 «Вычислительные машины, комплексы, системы и сети»
- •230100.3 «Автоматизированные системы обработки информации и управления»
- •230105.4 «Программное обеспечение вычислительной техники
- •Содержание пояснительной записки
- •Проверка правильности данных на уровне ячейки таблицы
- •Проверка правильности данных на уровне строки таблицы
- •Использование xml-сериализации для сохранения и загрузки наборов данных
- •Дополнительные средства навигации и редактирования для таблицы с набором данных
- •Автоматизация действий при добавлении нового элемента данных
- •Сортировка данных
- •Поиск по шаблону
Проверка правильности данных на уровне ячейки таблицы
Для проверки правильности следует определить событие 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;
