Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 15:

Стандартные элементы управления

Элемент спискового представления ListView

В Проводнике Windows используется именно этот элемент управления для отображения информации текущего каталога. Он может отражать подробную информацию в разных формах, определяемых свойством View типа одноименного перечисления System.Windows.Forms.View, которое содержит значения

  • Details - информация представлена в табличной форме (режим Таблица в Проводнике)
  • LargeIcon - элементы представлены полноразмерными значками с подписями под ними (режим Эскизы страниц в Проводнике)
  • List - элементы представлены столбцом иконок с надписями справа (режим Список в Проводнике)
  • SmallIcon - элементы представлены малыми значками с подписями под ними (режим Значки в Проводнике)
  • Tile - элементы представлены потоком полноразмерных значков с подписями справа и некоторой дополнительной информацией. Только для Windows XP и семейства Windows Server 2003 (режим Плитка в Проводнике)

При установке View=Details свойство Columns класса ColumnHeaderCollection должно содержать коллекцию объектов типа ColumnHeader, которые определяют заголовок таблицы. Эти объекты можно создавать по отдельности, затем добавлять к коллекции с помощью метода Add() свойства Columns, либа сразу сразу использовать перегрузку этого метода, задавая в нем нужные аргументы. Свойство Text определяет название заголовка столбца.

При установке View=Details свойство Items класса ListViewItemCollection содержит коллекцию объектов типа ListViewItem, которые представляют отдельные строки в таблице. Каждая строка, в свою очередь, является коллекцией SubItems типа ListViewSubItemCollection, состоящей из отдельных объектов типа ListViewSubItem, каждый из которых имеет набор свойств, определяющих атрибуты содержания и формы. Эти дополнительные объекты определяют ячейки таблицы в соответствующей строке. Строки могут маркироваться значками SmallImageList и LargeImageList типа ImageList.

В качестве иллюстрации создадим расширение класса ListView, которое будет отображать список файлов текущего каталога наподобия Проводника Windows.

Вначале нужно извлечь файл значка Folder.ico из библиотечного архива Visual Studio 2005 (или взять из прилагаемого каталога Source данной работы)


и добавить его к проекту командой Project/Add Existing Item


Не забудьте пометить в свойствах этого файла параметр Build Action как Embedded Resource.

using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
    
using System.Diagnostics;// Для класса Process
    
namespace Test
{
    // Расширение библиотечного класса ListView
    // для отображения файлов текущего каталога
    class DirectoryListView : ListView
    {
        public DirectoryListView()  // Конструктор
        {
            // Добавляем столбцы к ListView с нужной атрибутикой
            this.Columns.Add("Имя", 150, HorizontalAlignment.Left);
            this.Columns.Add("Размер", 100, HorizontalAlignment.Right);
            this.Columns.Add("Тип", 100, HorizontalAlignment.Left);
            this.Columns.Add("Изменен", 150, HorizontalAlignment.Left);
    
            // Заготавливаем две коллекции для значков файлов
            this.SmallImageList = new ImageList();
            this.LargeImageList = new ImageList();
            this.SmallImageList.ImageSize = new Size(16, 16);// По умолчанию
            this.LargeImageList.ImageSize = new Size(32, 32);
        }
    
        // Базовое поле для свойства
        string strDirectory;
    
        public string Directory // Свойство
        {
            // Аксессоры
            get { return strDirectory; }
            set
            {
                // Принимаем текущий каталог
                strDirectory = value;
    
                // Очищаем коллекции строк и значков
                this.Items.Clear();
                this.SmallImageList.Images.Clear();
                this.LargeImageList.Images.Clear();
    
                // Загружаем иконку каталога
                Icon icon = new Icon(this.GetType(), "Resource.Folder.ico");
                this.SmallImageList.Images.Add(icon);// Индекс значка 0
                this.LargeImageList.Images.Add(icon);// Индекс значка 0
    
                // Создаем объект DirectoryInfo для текущего каталога
                DirectoryInfo dirInfo = new DirectoryInfo(strDirectory);
    
                // Формируем информацию о подкаталогах
                foreach (DirectoryInfo dir in dirInfo.GetDirectories())
                {
                // Создаем объект строки таблицы и первую ячейку "Имя"
                ListViewItem item = new ListViewItem(dir.Name);
                // Позиционируем строку на добавленный значок
                item.ImageIndex = 0;
                item.Tag = "dir";   // Пометили
                item.SubItems.Add("");// Вторая ячейка "Размер"
                item.SubItems.Add("Папка");// Третья ячейка "Тип"
                // Четвертая ячейка "Изменен"
                item.SubItems.Add(dir.LastAccessTime.ToString());
    
                Items.Add(item);// Добавили в коллекцию
                }
    
                int imageIndex = 1; // Счетчик индексов значков
    
                // Формируем информацию о файлах
                foreach (FileInfo file in dirInfo.GetFiles())
                {
                // Создаем объект строки таблицы и первую ячейку "Имя"
                ListViewItem item = new ListViewItem(file.Name);
                // Комбинируем полный путь к файлу
                string path = Path.Combine(file.DirectoryName, file.Name);
                // Получаем значок, ассоциированный с типом файла
                icon = Icon.ExtractAssociatedIcon(path);
                // Добавляем значек в коллекцию иконок элемента ListView
                this.SmallImageList.Images.Add(icon);// Индекс значка imageIndex
                this.LargeImageList.Images.Add(icon);// Индекс значка imageIndex
                // Позиционируем строку на добавленный значок
                item.ImageIndex = imageIndex++;
    
                // Вторая ячейка "Размер" с форматом
                string str = String.Format("{0},{1} КБ", 
                        file.Length / 1024, file.Length % 1024);
                item.SubItems.Add(str);
    
                // Третья ячейка "Тип"
                string extension = Path.GetExtension(path).ToUpper() == 
			".EXE" ?
                        "Программа" : "Документ";
                item.SubItems.Add(extension);
    
                // Четвертая ячейка "Изменен"
                item.SubItems.Add(file.LastWriteTime.ToString());
    
                Items.Add(item);// Добавили в коллекцию
                }
            }
        }
    
        // Переопределяем обработчик класса Control нажатия кнопки мыши
        protected override void OnMouseDown(MouseEventArgs e)
        {
        base.OnMouseDown(e);
    
        // Циклически меняем свойство View на одно из 5 значений перечисления
        // Для смены представления задействуем правую кнопку мыши
        if (e.Button == MouseButtons.Right)
          this.View = (View)(((int)this.View + 1) % 5);// Деление по модулю 5
        }
    
        // Переопределяем обработчик класса ListView активации его элемента
        // с помощью двойного щелчка левой кнопки мыши или клавиши Enter
        protected override void OnItemActivate(EventArgs e)
        {
        base.OnItemActivate(e);
    
        if ((string)SelectedItems[0].Tag == 
		"dir")// Используем введенную ранее метку
            {
                // При щелчке на папке входим в нее
                this.Directory = Path.Combine(this.Directory, 
			SelectedItems[0].Text);
            }
            else
            {
                // Иначе безопасно запускаем программу, 
                // ассоциированную с выделенным файлом или файлами
                foreach (ListViewItem item in this.SelectedItems)
                {
                    try
                    {
                        Process.Start(Path.Combine(this.Directory, item.Text));
                    }
                    catch { } // Ничего не делаем
                }
            }
        }
    }
    
    // Класс приложения
    class MyClass : Form
    {
        public MyClass()    // Конструктор
        {
            this.Text = "Отображение содержимого каталога";
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            // Замыкаем размеры
            this.MaximizeBox = false;
            this.StartPosition = FormStartPosition.CenterScreen;
            this.Width *= 2;    // Увеличили ширину формы
            // Внедряем в сборку ресурс иконки формы
            this.Icon = new Icon(GetType(), "Resource.1.ICO");
    
            // Создаем экземпляр расширения класса ListView
            DirectoryListView myList = new DirectoryListView();
            // Привязываем к форме
            myList.Parent = this;
            // Разварачиваем на всю форму
            myList.Dock = DockStyle.Fill;
            // Устанавливаем режим "Таблица"
            myList.View = View.Details;
            // Устанавливаем текущим корневой каталог
            myList.Directory = "C:\\";
        }
    }
    
    // Запуск
    class Program
    {
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new MyClass());
        }
    }
}
Листинг 15.9 . Просмотр текущего каталога

Результат выполнения программы примера будет таким


Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?