Visual C++: работаем со списком ListView
Кроме "списка строк" ListBox существует "список-коллекция" ListView
, позволяющий отображать данные в одном из пяти стандартных для современных графических операционок представлений.
Добавим на пустую форму Windows Forms список ListView
, выровняем его по форме (свойство Dock = Fill
).
На форму также добавлен список иконок ImageList
с 3 картинками, соответствующими типам объектов списка. Типы эти могут быть любыми, например, "Ёжики", "Крысы" и "Тараканы" ничем не хуже других. Подготовим 3 квадратных картинки с соответствующими типам жыивотными и добавим их в ImageList
в указанном порядке.
Также понадобится стандартное меню MenuStrip
, предусмотрим в нём разделы Список и Вид. В меню Список содержится подменю Добавить с элементами, соответствующими 3 типам объектов, а также пункты Удалить и Выход. Меню Вид предназначено для переключения между 5 стандартными видами списка (см. свойство View). Соответственно, оно содержит пункты Большие иконки, Малые иконки, Детали, Список, Мозаика:
меню приложения
Если выделить список в конструкторе формы и нажать треугольничек в правом верхнему углу, мы увидим ссылки на все его основные сущности:
быстрое редактирование основных свойств списка ListView
Во-первых, у списка имеются элементы типа данных ListViewItem
. В редакторе коллекции можно добавить предустановленные элементы и назначить им свойства. Добавим один элемент, допустим, HedgeHog_Admin
(свойство Text
).
Во-вторых, у списка может быть несколько столбцов с заголовками (ColumnHeader
). Они видны в режиме просмотра Детали и, возможно, Мозаика. По умолчанию есть один столбец, отображающий свойство Text
элементов, можно создать дополнительные. Добавим в редакторе коллекции столбцы Элемент (Name=Element
, Text=Элемент
) и Дата (Name=DateTime
, Text=Дата
), назначим им нужную ширину Width
в пикселах, например, в 120
и 100
соответственно.
В-третьих, список позволяет создать несколько групп (свойство Groups
), которые будут логически объединять элементы по нужному программисту критерию. Создадим 3 группы с заголовками (свойство Header
), соответствующими 3 нашим типам объектов, то есть "Ёжики", "Крысы" и "Тараканы".
Здесь же можно поставить наш imageList1
на свойства LargeImage
и SmallImage
списка listView1
.
Теперь, вызвав редактор коллекции ListViewItem
("Изменить элементы") щёлкнем на многоточии справа от свойства SubItems
и в редакторе коллекции ListViewSubItem
добавим подэлемент со свойствами Name = DateTime
, Text = 01.01.1970 00:00:00
(чтобы у предустановленного ёжика-админа тоже была дата создания, соответствующая началу эпохи Unix :) Ну и назначим предустановленному элементу Group=Ёжики
, раз группы уже созданы.
Для добавления элемента в список создадим в пользовательской части класса формы Form1.h
(после директивы #pragma endregion
) метод AddItem
:
private: System::Void AddItem (String ^text, int icon) { ListViewItem ^lvi = gcnew ListViewItem(); lvi->Text = text; lvi->ImageIndex = icon; //Создать элемент, назначить текст и иконку ListViewItem::ListViewSubItem ^lvsi = gcnew ListViewItem::ListViewSubItem(); lvsi->Text = DateTime::Now.ToString(); lvi->SubItems->Add(lvsi); //Добавили подэлемент с текущей датой/временем lvi->Group = listView1->Groups[icon]; //Добавили эл-т в группу, соотв.-ю номеру иконки listView1->Items->Add(lvi); //Положили элемент в контейнер }
По пунктам подменю "Добавить" запрограммируем создание объекта каждого из 3 видов:
int cnt = listView1->Items->Count + 1; AddItem("HedgeHog_"+Convert::ToString(cnt),0);
Аналогично для остальных 2 пунктов, назначив строки "Rat_
" и "Tarakan_
" вместо "HedgeHog_
" и номера 1
, 2
вместо 0
.
По пункту меню Удалить просмотрим коллекцию выделенных элементов SelectedItems
и удалим её элементы из списка:
while (listView1->SelectedItems->Count>0) { ListViewItem ^ item = listView1->SelectedItems[0]; listView1->Items->Remove (item); }
Выделить несколько элементов списка можно при зажатой клавише Ctrl
, это в него встроено.
Пункты меню Вид переключают стандартные представления объектов списка, например, для пункта "Большие иконки" код будет таким:
listView1->View = View::LargeIcon;
Для остальных пунктов меню Вид просто поставьте SmallIcon
, Details
, List
, Tile
вместо LargeIcon
. Лучше, конечно, если эти 5 пунктов будут взаимозависимы и на выбранном пункте будет ставиться свойство Checked = True
, а на остальных False
, для простоты пока этого делать не будем.
Осталось запрограммировать пункт Выход и пример готов:
Application::Exit();
Разумеется, на его основе можно сделать гораздо больше, если понимать, что ListView
- готовый шаблон для стандартных представлений любых списочных данных, скажем, предусмотрев типы объектов "Диск", "Папка" и "Файл" на его основе можно написать Проводник.
Для сортировки всего списка ListView
по первому столбцу достаточно поставить его свойство Sorting = Ascending
(ну или Descending
, если нужно по убыванию), а вот для нескольких столбцов при виде "Детали" сортировка по клику на заголовке столбца от этого не появится, её нужно программировать отдельно, в нашем случае подойдёт обработчик события ColumnClick
списка, готовый пример для сортировки есть вот тут в msdn, можно его приспособить для нашего случая.
Скачать этот проект Visual C++ в архиве .zip (21 Кб)
28.09.2015, 15:29 [13779 просмотров]