}
Как и в предыдущем случае, создайте метод 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 });
}
Обратите внимание на два момента.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.