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

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

Жанры

Интернет-журнал "Домашняя лаборатория", 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******************/

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

Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Шесть принцев для мисс Недотроги

Суббота Светлана
3. Мисс Недотрога
Фантастика:
фэнтези
7.92
рейтинг книги
Шесть принцев для мисс Недотроги

Хочу тебя любить

Тодорова Елена
Любовные романы:
современные любовные романы
5.67
рейтинг книги
Хочу тебя любить

Огни Аль-Тура. Желанная

Макушева Магда
3. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.25
рейтинг книги
Огни Аль-Тура. Желанная

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Сумеречный стрелок 8

Карелин Сергей Витальевич
8. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Сумеречный стрелок 8

Я до сих пор не князь. Книга XVI

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

Обыкновенные ведьмы средней полосы

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Обыкновенные ведьмы средней полосы

Метаморфозы Катрин

Ром Полина
Фантастика:
фэнтези
8.26
рейтинг книги
Метаморфозы Катрин

Идеальный мир для Социопата

Сапфир Олег
1. Социопат
Фантастика:
боевая фантастика
рпг
постапокалипсис
6.17
рейтинг книги
Идеальный мир для Социопата