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

}

Как и в предыдущем случае, создайте метод BindToList, вызовите его при загрузке формы. В теле этого метода мы создадим динамическую коллекцию ссылок на объекты класса Man в памяти.

ArrayList list = new ArrayList ();

list.Add (new Man (0, "Mr. Zero Ill", 30, true));

list.Add (new Man (1, "Mrs. One Hill", 19, false));

list.Add (new Man (2, "Dr. Two Bills", 60, true));

list.Add (new Man (3, "MP. Tree Evils", 50, true));

Этот список настроен на хранение произвольных объектов, поэтому он будет работать медленнее, чем типизированная коллекция объектов. Мы рассмотрим такую коллекцию позже, а сейчас привяжем элементы управления к полям данных списка. Привязку свойств объектов класса Man, хранящихся в списке ArrayList называют "binding to a property on an item in a list" — привязкой к свойству текущего элемента списка. Но сначала осуществите уже знакомое вам сложное связывание.

¨  Привяжите DataGridView с именем gridMan к списку list                                 — Complex DataBinding

¨  Привяжите ListBox с именем listBox к списку list                                            — Complex DataBinding

Затем осуществите (тоже знакомое) простое связывание.

¨  Привяжите TextBox с именем tManName к полю Name                          — Simple DataBinding

gridMen.DataSource = list;

listBox.DataSource = list;

tManName.DataBindings.Add ("Text", list, "Name");

Класс Man в рассматриваемом сценарии привязки данных часто называют business object (мне почему-то не нравится этот термин, но вы должны его знать). Может быть, все, что связано с экономикой, вызывает горькие воспоминания у тех, кто пережил Перестройку, а может быть, потому, что экономические термины выглятят глупо в области дискретной математики и программирования.

Для удобства заполнения данных списка ListBox класс Man должен иметь свою собственную версию виртуального метода ToString. Добавьте такой метод в класс Man.

public override string ToString() { return name + "; Age: " + age; }

Если вы справились с этим заданием и проверили работу механизма привязки данных, то должны были заметить недостатки в его поведении. Так, при изменении данных в DataGridView список типа ListBox их не отслеживает и не отображает. Однако изменения в привязанном к нему списке ArrayList прошли успешно. Это подтверждается значением другого связанного элемента TextBox tManName. Причина — отсутствие уведомлений об изменениях в коллекции объектов ArrayList.

Другим недостатком является неестественный порядок отображения колонок в DataGridView — он не совпадает с порядком перечисления свойств класса Man. Для того, чтобы иметь возможность управления множеством колонок и порядком их следования, надо до привязки данных установить свойство AutoGenerateColumns = false, задать желаемое множество колонок, а затем привязать данные к DataGridView. Введите изменения, как показано ниже.

private void FormGridList_Load (object sender, EventArgs e)

{

SetColumns ();

BindToList ();

}

private void SetColumns ()

{

gridMen.AutoGenerateColumns = false;

gridMen.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

DataGridViewTextBoxColumn colID = new DataGridViewTextBoxColumn ();

colID.DataPropertyName = "ID";

colID.HeaderText = "ID";

DataGridViewTextBoxColumn colName = new DataGridViewTextBoxColumn ();

colName.DataPropertyName = "Name";

colName.HeaderText = "Name";

DataGridViewTextBoxColumn colAge = new DataGridViewTextBoxColumn ();

colAge.DataPropertyName = "Age";

colAge.HeaderText = "Age";

DataGridViewCheckBoxColumn colDegree = new DataGridViewCheckBoxColumn (false);

colDegree.DataPropertyName = "Degree";

colDegree.HeaderText = "Degree";

gridMen.Columns.AddRange (new DataGridViewColumn[] { colID,colName,colAge,colDegree });

}

Обратите внимание на два момента.