БлогNot. Visual C++: работаем со списком ListView

Visual C++: работаем со списком ListView

Кроме "списка строк" ListBox существует "список-коллекция" ListView, позволяющий отображать данные в одном из пяти стандартных для современных графических операционок представлений.

Добавим на пустую форму Windows Forms список ListView, выровняем его по форме (свойство Dock = Fill).

На форму также добавлен список иконок ImageList с 3 картинками, соответствующими типам объектов списка. Типы эти могут быть любыми, например, "Ёжики", "Крысы" и "Тараканы" ничем не хуже других. Подготовим 3 квадратных картинки с соответствующими типам жыивотными и добавим их в ImageList в указанном порядке.

Также понадобится стандартное меню MenuStrip, предусмотрим в нём разделы Список и Вид. В меню Список содержится подменю Добавить с элементами, соответствующими 3 типам объектов, а также пункты Удалить и Выход. Меню Вид предназначено для переключения между 5 стандартными видами списка (см. свойство View). Соответственно, оно содержит пункты Большие иконки, Малые иконки, Детали, Список, Мозаика:

меню приложения
меню приложения

Если выделить список в конструкторе формы и нажать треугольничек в правом верхнему углу, мы увидим ссылки на все его основные сущности:

быстрое редактирование основных свойств списка ListView
быстрое редактирование основных свойств списка 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 [13540 просмотров]


теги: список программирование c++/cli

показать комментарии (1)