Основы программирования на C#


Элемент управления класса ListBox - часть 2


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

private void button1_Click(object sender, System.EventArgs e) { /* Обработчик события Click кнопки "> <" * Выборочный обмен данными между списками * ListBox1 <-> ListBox2******************/ if(button1.Text == ">") MoveSelectedItems(listBox1, listBox2); else MoveSelectedItems(listBox2, listBox1); } 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 list1.SelectedItems) { list2.Items.Add(item); } list2.EndUpdate(); ListBox.SelectedIndexCollection indeces = list1.SelectedIndices; list1.BeginUpdate(); for (int i = indeces.Count -1; i>=0 ; i--) { list1.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(); }




Начало  Назад  Вперед