Два наследника формы TwoLists
Построим по указанной технологии двух наследников формы TwoLists. Дадим им имена: TwoLists_Strings и TwoLists_Books. Они будут отличаться тем, что первый из них будет заполнять левый список строками, а второй - "настоящими объектами" класса Book. Второй список при открытии форм будет оставаться пустым и служить для хранения выбора, сделанного пользователем. Оба наследника будут также задавать обработчики события Click для командных кнопок, завершающих работу с этими формами. На рис. 24.6 показана наследуемая форма, открытая в дизайнере форм.
![](image/dva-naslednika-formy-twolists_1.jpg)
Рис. 24.6. Наследуемая форма, открытая в дизайнере
Обратите внимание на значки, сопровождающие все наследуемые элементы управления. В классе TwoLists_Strings добавлены поля:
string[] source_items; string[] selected_items; const int max_items = 20;
В конструктор класса добавлен код, инициализирующий массивы:
source_items = new string[max_items]; selected_items = new string[max_items]; InitList1();
Вызываемый в конструкторе закрытый метод класса InitList заполняет массив source_items - источник данных - строками, а затем передает эти данные в левый список формы. По-хорошему, следовало бы организовать заполнение списка формы из базы данных, но я здесь выбрал самый примитивный способ:
void InitList1() { //задание элементов источника и инициализация списка формы source_items[0] ="Бертран Мейер: Методы программирования"; //аналогично заполняются другие элементы массива //перенос массива в список ListBox1 int i = 0; while (source_items[i] != null) { this.listBox1.Items.Add(source_items[i]); i++; } //this.listBox1.DataSource = source_items; }
Закомментирована альтернативная возможность заполнения списка формы, использующая свойство DataSource. Когда форма откроется, ее левый список будет заполнен, пользователь сможет выбрать из списка понравившиеся ему книги и перенести их в правый список. Зададим теперь обработчики события Click для командных кнопок ("Сохранить выбор" и "Не сохранять"):
private void button3_Click(object sender, System.EventArgs e) { int i =0; foreach(string item in listBox2.Items) { selected_items[i] = item; Debug.WriteLine(selected_items[i]); i++; } this.Hide(); } private void button4_Click(object sender, System.EventArgs e) { foreach(string item in listBox2.Items) { Debug.WriteLine(item); } this.Hide(); }
Оба они в Debug-версии проекта выводят данные о книгах, выбранных пользователем, и скрывают затем форму. Но первый из них сохраняет результаты выбора в поле selected_items.
Второй наследник TwoLists_Books устроен аналогично, но хранит в списке не строки, а объекты класса Book. Приведу уже без комментариев соответствующие фрагменты кода:
Book[] source_items; Book[] selected_items; const int max_items = 20;
Код, добавляемый в конструктор:
source_items = new Book[max_items]; selected_items = new Book[max_items]; InitList1();
Метод InitList1 скорректирован для работы с книгами:
void InitList1() { //задание элементов источника и инициализация списка формы Book newbook; newbook = new Book("Бертран Мейер", "Методы программирования",3,1980); source_items[0] =newbook; //остальные элементы массива заполняются аналогичным //образом //перенос массива в список ListBox1 int i = 0; while (source_items[i] != null) { this.listBox1.Items.Add(source_items[i]); i++; } }
Обработчики событий Click командных кнопок, завершающих работу с формой, имеют вид:
private void button3_Click(object sender, System.EventArgs e) { int i =0; foreach(object item in listBox2.Items) { selected_items[i] = (Book)item; selected_items[i].PrintBook(); i++; } this.Hide(); } private void button4_Click(object sender, System.EventArgs e) { Book book; foreach(object item in listBox2.Items) { book = (Book)item; book.PrintBook(); } this.Hide(); }
Класс Book определен следующим образом:
public class Book { //поля string author, title; int price, year; public Book(string a, string t, int p, int y) { author = a; title = t; price = p; year = y; } public override string ToString() { return( title + " : " + author); } public void PrintBook() { Debug.WriteLine("автор:" + author + " название: " + title + " цена: " + price.ToString() +" год издания: " + year.ToString()); } }
Обратите внимание, что в классе, как и положено, переопределен метод ToString, который задает строку, отображаемую в списке.
В завершение проекта нам осталось спроектировать главную форму. Сделаем ее в соответствии с описанным ранее шаблоном кнопочной формой (рис. 24.7).
![](image/dva-naslednika-formy-twolists_1.gif)
Рис. 24.7. Главная кнопочная форма проекта
Обработчики событий Click вызывают соответствующую форму для работы либо со списком, хранящим строки, либо со списком, хранящим объекты. На рис. 24.8 показана форма, хранящая строки, в процессе работы с ней.
![](image/dva-naslednika-formy-twolists_2.gif)
Рис. 24.8. Форма TwoLists_Strings в процессе работы