Чтение онлайн

на главную - закладки

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:

У элемента управления ListBox большое число событий, с некоторыми из которых мы встретимся при рассмотрении примеров. Перейдем теперь к рассмотрению примеров работы с этим элементом управления и, как обещано, построим некоторый шаблон, демонстрирующий работу с двумя списками, когда пользователь может переносить данные из одного списка в другой и обратно. На рис. 24.4 показано, как выглядит форма, реализующая данный шаблон.

Рис. 24.4. Шаблон

формы для обмена данными двух списков

На форме показаны два списка — listBox1 и listBox2, между которыми расположены две командные кнопки. Обработчик события Click первой кнопки переносит выбранную группу элементов одного списка в конец другого списка, (если включено свойство Sorted, то автоматически поддерживается сортировка списка). Переносимые элементы удаляются из первого списка. Вторая кнопка реализует операцию переноса всех элементов списка. Направление переноса — из левого списка в правый и обратно — задается заголовками (">", ">>") или ("<", "«"), изображенными на кнопках. Заголовки меняются автоматически в обработчиках события Enter, возникающих при входе в левый или правый списки — listBox1 или listBox2. Еще две командные кнопки, как следует из их заголовков, предназначены для закрытия формы с сохранением или без сохранения результатов работы пользователя. Таково общее описание шаблона. А теперь рассмотрим реализацию. Начнем с обработчиков события Enter наших списков:

private void listBox1_Enter(object sender, System.EventArgs e)

{

/*** Событие Enter у списка возникает при входе в список ***/

button1.Text = ">"; button2.Text =">>";

}

private void listBox2_Enter(object sender,

System.EventArgs e)

{

/*** Событие Enter у списка возникает при входе в список ***/

button1.Text = "<"; button2.Text ="<<";

}

Посмотрим, как устроены обработчики события Click для командных кнопок, осуществляющих перенос данных между списками:

private void button1_Click(object sender, System.EventArgs e)

{

/* Обработчик события Click кнопки "> <"

* Выборочный обмен данными между списками

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

if(button1.Text == ">")

MoveSelectedItems(listBox1, listBox2);

else

MoveSelectedItems(listBox2, listBoxi);

}

private void button2_Click(object sender, System.EventArgs e)

{

/* Обработчик события Click кнопки ">> <<"

* Перенос всех данных одного списка в конец другого списка

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

if (button2.Text == ">>")

MoveAllItems(listBox1, listBox2);

else

MoveAllItems(listBox2, listBox1);

}

Обработчики

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

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******************/

Поделиться:
Популярные книги

Запечатанный во тьме. Том 1. Тысячи лет кача

NikL
1. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 1. Тысячи лет кача

Старая дева

Брэйн Даниэль
2. Ваш выход, маэстро!
Фантастика:
фэнтези
5.00
рейтинг книги
Старая дева

Наследник 2

Шимохин Дмитрий
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Наследник 2

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Крещение огнем

Сапковский Анджей
5. Ведьмак
Фантастика:
фэнтези
9.40
рейтинг книги
Крещение огнем

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Адвокат вольного города 7

Кулабухов Тимофей
7. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Адвокат вольного города 7

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Пустоцвет

Зика Натаэль
Любовные романы:
современные любовные романы
7.73
рейтинг книги
Пустоцвет

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV

Город драконов

Звездная Елена
1. Город драконов
Фантастика:
фэнтези
6.80
рейтинг книги
Город драконов

Взлет и падение третьего рейха (Том 1)

Ширер Уильям Лоуренс
Научно-образовательная:
история
5.50
рейтинг книги
Взлет и падение третьего рейха (Том 1)

Скандальная свадьба

Данич Дина
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Скандальная свадьба