Изменения в исходном тексте программы

Подключение списка изображений к дереву

Создав и заполнив список изображений, подключите его к дереву просмотра дисков и каталогов. Для этого отредактируйте свойство ImageList элемента управления treeView1, присвоив ему ссылку на список изображений imageList1 (рис. 14).

Рис. 14. Подключили список изображений к дереву

Теперь для отображения значков в узлах дерева нам необходимо изменить исходный текст методов DriveTreeInit и GetDirs. Напомним, что первый из этих методов инициализирует дерево, а второй — добавляет к узлу дерева список каталогов.

Обратите внимание на конструктор класса TreeNode, создающий узлы дерева внутри тела цикла foreach:

public void DriveTreeInit()
{
string[] drivesArray = Directory.GetLogicalDrives();
treeView1.BeginUpdate();
treeView1.Nodes.Clear();
foreach(string s in drivesArray)
{
TreeNode drive = new TreeNode(s, 0, 0);
treeView1.Nodes.Add(drive);
GetDirs(drive);
}
treeView1.EndUpdate();
}

Этот конструктор имеет три параметра. Про первый параметр мы уже рассказывали — он задает текст надписи для узла дерева. Теперь настало время рассказать и про два остальных параметра.

Если к элементу управления TreeView подключен список изображений, то второй и третий параметры конструктора класса TreeNode задают индексы изображений для узла дерева. При этом второй параметр определяет изображение невыделенного узла дерева, а третий — выделенного.

Что касается метода DriveTreeInit, то расположенный в нем конструктор создает узлы, отображающий только дисковые устройства. В любом состоянии (как выделенном, так и невыделенном) нам необходимо отображать один и тот же значок дискового устройства, имеющий в нашем случае индекс 0. Поэтому второй и третий параметры конструктора передают нулевые значения.

Другое дело — метод GetDirs:

public void GetDirs(TreeNode node)
{
DirectoryInfo[] diArray;
node.Nodes.Clear();
string fullPath = node.FullPath;
DirectoryInfo di = new DirectoryInfo(fullPath);

try
{
diArray = di.GetDirectories();
}
catch
{
return;
}
foreach (DirectoryInfo dirinfo in diArray)
{
TreeNode dir = new TreeNode(dirinfo.Name, 1, 2);
node.Nodes.Add(dir);
}
}

Здесь конструктору класса TreeNode, размещенному внутри оператора цикла foreach, через второй и третий параметры мы передаем индексы значков закрытой и открытой папки, соответственно. В результате при отображении дерева папки, которые выделил пользователь, выделяются своим обозначением (рис. 15).

Рис. 15. Дерево со значками дисковых устройств и папок

Что же касается дисковых устройств, то все они отображаются одним и тем же значком.

К сожалению, среди многочисленных классов библиотеки Microsoft .NET Framework нам не удалось найти ни одного, позволяющего получить физические параметры дисковых устройств. Поэтому мы не смогли использовать отдельные значки для НГМД, сменных устройств памяти и устройств CD-ROM.

Тем не менее, средства Microsoft .NET Framework позволяют программам C# обращаться к программному интерфейсу OC Win32 API, поэтому после соответствующей доработки приложения можно будет использовать разные значки для изображения устройств внешней памяти разного типа.