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

Возбуждаемое уведомление (а, проще, событие) должно сопровождаться двумя параметрами: ссылкой на источник события и информацией о нем. Ее роль выполняет имя изменяемого свойства, которое (в соответствии со стандартом обработки события — делегатным типом) следует погрузить в объект класса PropertyChangedEventArgs.

Итак, мы добились того, что изменение свойства StateCode для любого объекта класса Customer запустит событие PropertyChanged с зарегистрированным в системе делегатным типом PropertyChangedEventHandler. На это событие откликнутся все элементы управления формы, связанные с объектом cust класса Customer. Таких элементов немного, а точнее, один — TextBox с именем tCustomer.

Начальная установка свойства StateCode для объекта cust равна null и мы видим, что код штата пуст. Мы видим, что свойство Code (тоже код штата) изменяется по мере перемещения по строкам DataGridView, а также при выборе строки в выпадающем списке. Для замыкания всех связей, а именно: свойств Code и StateCode (разных объектов), осталось соединить (двусторонней связью) выпадающий список и объект cust. Это можно сделать таким образом.

comboStates.DataBindings.Add ("SelectedValue", cust, "StateCode", true);

Заметьте, что SelectedValue списка — это не что иное, как Code. Если в данный момент вы запустите приложение, то оно будет вести себя по-прежнему. Но добавив анонимного (или обычного) делегата, мы добъемся желаемого поведения связанных элементов формы.

comboStates.SelectedIndexChanged += delegate (object sender, EventArgs e)

{

cust.StateCode = comboStates.SelectedValue.ToString();

};

Кстати, а вы знали о наличии сорок шестого штата США, Federated States of Micronesia?

Привязка к данным динамической коллекции (ArrayList)

ArrayList — это обобщенная коллекция, способная хранить объекты произвольного типа. Нам важно, что она не генерирует событие об изменении свойтв своих элементов (PropertyChange notification), поэтому сложное связывание с ней обладает ограниченной функциональностью. Убедимся в этом.

Создайте новую форму с именем FormGridList, ассоциируйте ее с гиперссылкой linkGridList главного окна приложения и вставьте в нее элементы, как показано на рисунке: DataGridView с именем gridMen, метку (Label) с именем lblManName, окно редактирования TextBox с именем tManName и список ListBox с именем listBox.

Введите в проект уже надоневший вам класс Man (с помощью команды Add►Class). Мы собираемся заполнить ArrayList объектами класса Man, а затем привязать свойства некоторых элементов управления формы к полям данных класса Man, точнее к полям объекта класса Man, являющегося текущим в коллекции ArrayList.

public class Man

{

private uint id;

private string name;

private int age;

private bool degree;

private static int maxName=20, maxAge=70;

public Man()

{

id = 0;

name = "N/A";

age = 0;

degree = false;

}

public Man(uint id, string name, int age, bool degree)

{

this.id = id;

this.name = name;

this.age = age;

this.degree = degree;

}

}

Так как механизм DataBinding предпочитает работать только с public-свойствами объектов, то введите в класс Man четыре свойства: ID, Name, Age и Degree. Свойство Age разработайте так, чтобы оно выбрасывало исключение типа ArgumentOutOfRangeException при попытке задать возраст вне диапазона (0, maxAge). Свойство Name должно укорачивать длинные имена до maxName. Не забудьте обработать случаи value == null || value.Length == 0.

public uint ID

{

get { return id; }

set { id = value; }

}

public string Name

{

get { return name; }

set

{

if (value == null || value.Length == 0)

value = "N/A";

else if (value.Length > maxName)

value = value.Remove(maxName);

name = value;

}

}

public int Age

{

get { return age; }

set

{

if (value < 0 || maxAge < value)

throw new ArgumentOutOfRangeException(

string.Format("\nAge must be within (0,{0})\n", maxAge));

else

age = value;

}

}

public bool Degree

{

get { return degree; }

set { degree = value; }