
Иногда по неизвестным причинам некоторые команды русскоязычной версии Windows выводят русский текст в нечитаемой кодировке, кракозябрами.
Например, команда help выводит нормальный текст:

Но при этом подсказка telnet выводит в ответ кракозябры.

Так может происходить, к примеру, если текущая кодировка консоли 866, а утилита telnet.exe почему-то выводит текст в кодировке 1251. Вывести текст в нужной кодировке поможет команда chcp, которая устанавливает нужную кодировку.
Вот так можно посмотреть текущую кодировку консоли:
c:\Documents and Settings\user>chcp Текущая кодовая страница: 866 c:\Documents and Settings\user>
А вот так можно поменять кодировку на 1251, после чего вывод подсказки telnet будет отображаться нормально:
c:\Documents and Settings\user>chcp 1251 Текущая кодовая страница: 1251 c:\Documents and Settings\user>

К сожалению, заранее угадать, в какой кодировке выводится текст, невозможно, поэтому проще попробовать установить командой chcp разные кодировки, чтобы добиться правильного отображения русского текста. Обычно используются кодировки 866 (кодировка русского текста DOS), 1251 (кодировка русского текста Windows), 65001 (UTF-8).
Иногда кракозябры можно убрать, если выбрать в свойствах окна cmd.exe шрифт Lucida Console (по умолчанию там стоит “Точечные шрифты”).
1. Универсальный декодер – конвертер кириллицы.
Последнее обновление: 15.01.2024
TreeView представляет визуальный элемент в виде дерева. Дерево содержит узлы, которые представляют объекты .
Узлы могут содержать другие подузлы и могут находиться как скрытом, так и в раскрытом состоянии. Все узлы содержатся в свойстве .
Если мы нажем в панели Свойств на свойство Nodes, то нам откроется окно редактирования узлов TreeView:

В этом окне мы можем добавить новые узлы, создать для них подузлы, удалить уже имеющиеся, настроить свойства узлов. Рассмотрим некоторые свойства, которые
мы здесь может установить:
: фоновый цвет узла
: если равно true, то данный узел будет отмечен флажком
: шрифт узла
: цвет шрифта
: текст узла
: получает или задает индекс изображения, выводимого для данного узла
: получает или задает индекс изображения для данного узла
: получает или задает индекс изображения для данного узла в выбранном состоянии
: получает или задает индекс изображения, выводимого для данного узла в выбранном состоянии
: получает или задает индекс изображения состояния (например установленного или снятого флажка,
указывающего состояние элемента): тег узла
И затем все добавленные узлы мы сможем увидеть в приложении на форме:

Кроме данных свойств, управляющих визуализацией, элемент TreeNode имеет еще ряд важных свойств, которые мы можем использовать к коде:
: первый дочерний узел
: последний дочерний узел
: возвращает следующий сестринский узел по отношению к текущему
: возвращает следующий видимый узел по отношению к текущему
: возвращает предыдущий сестринский узел по отношению к текущему
: возвращает предыдущий видимый узел по отношению к текущему
: возвращает коллекцию дочерних узлов
: возвращает родительский узел для текущего узла
: возвращает объект TreeView, в котором определен текущий узел
Программное управление узлами
Рассмотрим программное добавление и удаление узлов:
TreeNode tovarNode = new TreeNode("Товары");
// Добавляем новый дочерний узел к tovarNode
tovarNode.Nodes.Add(new TreeNode("Смартфоны"));
// Добавляем tovarNode вместе с дочерними узлами в TreeView
treeView1.Nodes.Add(tovarNode);
// Добавляем второй очерний узел к первому узлу в TreeView
treeView1.Nodes[0].Nodes.Add(new TreeNode("Планшеты"));
// удаление у первого узла второго дочернего подузла
treeView1.Nodes[0].Nodes.RemoveAt(1);
// Удаление узла tovarNode и всех его дочерних узлов
treeView1.Nodes.Remove(tovarNode);Скрытие и раскрытие узлов
Для раскрытия узлов к объекту TreeNode применяется метод , а для скрытия – метод :
// раскрытие узла tovarNode.Expand(); // раскрытие не только узла, но и всех его дочерних подузлов tovarNode.ExpandAll(); // скрытие узла tovarNode.Collapse();
Добавление чекбоксов
Чтобы добавить чекбоксы к узлам дерева, надо у TreeView установить свойство CheckBoxes = true:
treeView1.CheckBoxes = true;
TreeNode smartNode = new TreeNode("Смартфоны");
smartNode.Checked = true;
treeView1.Nodes.Add(smartNode);
treeView1.Nodes.Add(new TreeNode("Планшеты"));
treeView1.Nodes.Add(new TreeNode("Ноутбуки"));
Добавление изображений
Для добавления изображений нам нужен компонент ImageList, в котором имеется несколько картинок. Добавим эти картинки к узлам:
// установка источника изображений
treeView1.ImageList = imageList1;
TreeNode argentinaNode = new TreeNode { Text = "Аргентина", ImageIndex=0, SelectedImageIndex=0 };
treeView1.Nodes.Add(argentinaNode);
TreeNode braziliaNode = new TreeNode { Text = "Бразилия", ImageIndex = 1, SelectedImageIndex=1 };
treeView1.Nodes.Add(braziliaNode);
TreeNode chilieNode = new TreeNode { Text = "Чили", ImageIndex = 2, SelectedImageIndex=2 };
treeView1.Nodes.Add(chilieNode);
TreeNode columbiaNode = new TreeNode { Text = "Колумбия", ImageIndex = 3, SelectedImageIndex=3 };
treeView1.Nodes.Add(columbiaNode);При установке изображений надо учитывать, что если мы не установим свойство SelectedImageIndex для каждого узла,
то в качестве картинки для выделенного узла по умолчанию будет использоваться первое изображение из ImageList.
TreeView. Практический пример
Выполним небольшую задачу с TreeView. А именно попробуем сделать примитивный интерфейс на подобие проводника. Для этого добавим
на форму элемент TreeView. А в файле кода формы пропишим следующий код:
namespace HelloApp
{ public partial class Form1 : Form { TreeView treeView1; public Form1() { InitializeComponent(); treeView1 = new(); treeView1.Dock = DockStyle.Fill; Controls.Add(treeView1); treeView1.BeforeSelect += treeView1_BeforeSelect; treeView1.BeforeExpand += treeView1_BeforeExpand; // заполняем дерево дисками FillDriveNodes(); } // событие перед раскрытием узла void treeView1_BeforeExpand(object? sender, TreeViewCancelEventArgs e) { e.Node?.Nodes.Clear(); try { if (Directory.Exists(e.Node?.FullPath)) { string[] dirs = Directory.GetDirectories(e.Node.FullPath); foreach (string dir in dirs) { TreeNode dirNode = new TreeNode(new DirectoryInfo(dir).Name); FillTreeNode(dirNode, dir); e.Node.Nodes.Add(dirNode); } } } catch (Exception) { } } // событие перед выделением узла void treeView1_BeforeSelect(object? sender, TreeViewCancelEventArgs e) { e.Node?.Nodes.Clear(); try { if (Directory.Exists(e.Node?.FullPath)) { string[] dirs = Directory.GetDirectories(e.Node.FullPath); foreach (string dir in dirs) { TreeNode dirNode = new TreeNode(new DirectoryInfo(dir).Name); FillTreeNode(dirNode, dir); e.Node.Nodes.Add(dirNode); } } } catch (Exception) { } } // получаем все диски на компьютере private void FillDriveNodes() { try { foreach (DriveInfo drive in DriveInfo.GetDrives()) { TreeNode driveNode = new TreeNode { Text = drive.Name }; FillTreeNode(driveNode, drive.Name); treeView1.Nodes.Add(driveNode); } } catch (Exception) { } } // получаем дочерние узлы для определенного узла private void FillTreeNode(TreeNode driveNode, string path) { try { string[] dirs = Directory.GetDirectories(path); foreach (string dir in dirs) { TreeNode dirNode = new TreeNode(); dirNode.Text = dir.Remove(0, dir.LastIndexOf("\\") + 1); driveNode.Nodes.Add(dirNode); } } catch (Exception) { } } }
}
TreeView имеет ряд событий, которые позволяют нам управлять деревом. Наиболее важные из них:
BeforeSelect / AfterSelect: срабатывает перед / после выбора узла дереваBeforeExpand / AfterExpand: срабатывает перед / после раскрытия узла дереваBeforeCollapse / AfterCollapse: срабатывает перед / после скрытия узла дерева
В вышеприведенном коде мы заблаговременно перед раскрытием или выбором наполняем выбранный узел дочерними подузлами,
благодаря чему у нас появляется видимость, что узлы заполнены.



