Читаем Интернет-журнал "Домашняя лаборатория", 2007 №9 полностью

Обработчики событий устроены достаточно просто — они вызывают соответствующий метод, передавая ему нужные аргументы в нужном порядке. Рассмотрим метод, переносящий множество отобранных пользователем элементов из одного списка в другой:

private void MoveSelectedItems(ListBox list1, ListBox list2)

{

    /*** Выделенные элементы списка list1 ****

    *** помещаются в конец списка List2 *****

    *** и удаляются из списка list1 ********/

    list2.BeginUpdate();

    foreach (object item in listl.SelectedItems)

    {

        list2.Items.Add(item);

    }

    list2.EndUpdate();

    ListBox.SelectedlndexCollection indeces = listl.Selectedlndices;

    list1.BeginUpdate();

    for (int i = indeces.Count -1; i>=0; i-)

    {

       lList1.Items.RemoveAt(indeces[i]);

    }

    list1.EndUpdate();

}

Некоторые комментарии к этому тексту. Заметьте, для добавления выделенных пользователем элементов к другому списку используется коллекция SelectedItems и метод Add, поочередно добавляющий элементы коллекции. Метод AddRange для добавления всей коллекции здесь не проходит:

list2.Items.AddRange(list1.SelectedItems);

поскольку нет автоматического преобразования между коллекциями ObjectCollection и SelectedObjectCollection.

Для удаления выделенных элементов из списка list1 используется коллекция индексов. Обратите внимание, при удалении элемента с заданным индексом из любой коллекции индексы оставшихся элементов автоматически пересчитываются. Поэтому удаление элементов происходит в обратном порядке, начиная с последнего, что гарантирует корректность оставшихся индексов.

Намного проще устроен метод, переносящий все элементы списка:

private void MoveAllItems(ListBox list1, ListBox list2)

{

   /*** Все элементы списка list1 ****

    **** переносятся в конец списка list2 ****

    **** список list1 очищается *************/

    list2.Items.AddRange(list1.Items);

    list1.Items.Clear();

}

Добавим еще одну функциональную возможность — разрешим переносить элементы из одного списка в другой двойным щелчком кнопки мыши. Для этого зададим обработчики события DoubleClick наших списков:

private void listBox1_DoubleClick(object sender,

    System.EventArgs e)

{

    /* Обработчик события Doubleclick левого списка

        * Выбранный элемент переносится в правый список

        * ListBox1 <-> ListBox2******************/

    MoveSelectedItems(listBox1, listBox2);

}

private void listBox2_DoubleClick(object sender,

    System.EventArgs e)

{

    /* Обработчик события Doubleclick правого списка

         * Выбранный элемент переносится в левый список

         * ListBox1 <-> ListBox2******************/

    MoveSelectedItems(listBox2, listBox1);

    }

Обработчики вызывают уже рассмотренные нами методы.

На этом закончим рассмотрение функциональности проектируемого образца формы. Но, скажете вы, остался не заданным целый ряд вопросов: непонятно, как происходит заполнение списков, как сохраняются элементы после завершения переноса, обработчики события Click для двух оставшихся кнопок не определены. Ничего страшного. Сделаем нашу форму родительской, возложив решение оставшихся вопросов на потомков, пусть каждый из них решает эти вопросы по-своему.


Наследование форм

Для объектного программиста форма — это обычный класс, а населяющие ее элементы управления — это поля класса. Так что создать новую форму — новый класс, наследующий все поля, методы и события уже существующей формы — не представляет никаких проблем. Достаточно написать, как обычно, одну строку:

public class NewForm: InterfacesAndDrawing.TwoLists

Нужно учитывать, что имени класса родителя должно предшествовать имя пространства имен.

Перейти на страницу:

Похожие книги