Механизм привязки данных (DataBinding), страница 9

Это событие должно возбуждаться при каждой попытке изменить какое-либо из свойств. Очевидно, это должно происходить в ветвях 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));

}

¨  Повторите опыт с ошибочным вводом. Вы должны увидеть сообщение такого вида.

¨  Измените порядок следования колонок, как было показано в предыдущем параграфе.

Привязка к данным таблицы (DataTable)

Создайте новую форму с именем 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. Он призван работать с записями таблиц базы данных, которые должны обеспечивать откат к старым значениям в случае ошибок ввода.