Это событие должно возбуждаться при каждой попытке изменить какое-либо из свойств. Очевидно, это должно происходить в ветвях set всех свойств класса.
¨ Измените алгоритмы ветвей set всех свойств класса Man. Например, в свойство ID добавьте код:
if (PropertyChanged != null)
PropertyChanged (this, new PropertyChangedEventArgs ("ID"));
¨ Добейтесь мгновенной реакции всех связанных сущностей на изменение свойств в любом из элементов управления, расположенных на фоме.
¨ Добавьте в форму копию ErrorProvider и подключите ее к списку.
¨ Попробуйте в ячейку DataGridView, где отображено поле Age, ввести неприемлемое значение и нажмите клавишу Tab. Возникает исключение, которое нам следует обработать.
¨ Добавьте обработчик события DataError. Для этого создайте делегата:
gridMen.DataError += new DataGridViewDataErrorEventHandler (gridMen_DataError);
¨ Затем его задание (метод обработки события).
void gridMen_DataError (object sender, DataGridViewDataErrorEventArgs e)
{
MessageBox.Show (string.Format(
"Action: {0}\r\n\r\nCell ({1},{2}) data has wrong format",
e.Context, e.RowIndex, e.ColumnIndex));
}
¨ Повторите опыт с ошибочным вводом. Вы должны увидеть сообщение такого вида.
¨ Измените порядок следования колонок, как было показано в предыдущем параграфе.
Создайте новую форму с именем FormGridTable и вставьте в нее элементы (как показано на рисунке): DataGridView с именем gridGoods, две метки (Label с именами lblID и lblPrice), два TextBox (с именами tID и tPrice), флажок CheckBox с именем chkAvailable и кнопку выхода с именем bExit.
Рассмотрим логику работы новой формы. Элемент DataGridView мы собираемся привязать к данным некоторой таблицы (DataTable). Заметьте, что таблица DataTable размещена в памяти, а DataGridView (тоже таблица) располагается на форме и отображает данные той таблицы, которая в памяти. Такой способ привязки также считается сложным (Complex DataBinding). Кроме того, мы собираемся задействовать привязку типа Simple DataBinding. Для этой цели привяжем свойства Text элементов типа TextBox к текущим данных некоторых колонок таблицы DataTable.
Понятие текущая строка таблицы реализуется объектом класса CurrencyManager или BindingSource (Framewok 2.0). Они умеют следить за перемещением фокуса в DataGridView и определяют (с помощью свойства Current) отображение соответствующей строки в таблице DataTable. Заметьте, что сейчас мы не увидим этих объектов, так как они скрыты в глубинах механизма DataBinding.
Добавьте в класс формы реакцию на событие Load и метод BindToTable. Вызовите его в FormGridTable_Load.
private void BindToTable()
{
DataTable dt = new DataTable("Goods");
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name");
dt.Columns.Add("Price", typeof(decimal));
dt.Columns.Add("Available", typeof(bool));
dt.Rows.Add(0, "Shoes", 20.0m, true);
dt.Rows.Add(1, "West", 30.5m, false);
dt.Rows.Add(2, "Shirt", 6.2m, true);
dt.Rows.Add(3, "Pant", 16.4m, false);
gridGoods.DataSource = dt;
tID.DataBindings.Add("Text", dt, "ID", true, DataSourceUpdateMode.OnPropertyChanged);
}
Сначала мы задаем схему таблицы товаров (с именем Goods). Схема таблицы, как вы помните, определяется множеством и типами данных ее колонок. Затем мы наполняем таблицу записями, иначе, строками (объектами класса DataRow). После этого мы включаем два механизма привязки данных (Complex и Simple). Последний позволяет следить за значением колонки ID текущей строкой таблицы. Запустите приложение и проверьте эти механизмы в работе.
Несмотря на установку режима отслеживания OnPropertyChanged, мы не замечаем оперативности (прыткости) процесса слежения. Это объясняется инертностью DataGridView. Он призван работать с записями таблиц базы данных, которые должны обеспечивать откат к старым значениям в случае ошибок ввода.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.