/// <summary> /// Считывает описание элеметов MSBuild и заполняет ими TreeView. /// </summary> /// <param name="msBuildHelper">MsBuildProjectHelper</param> private void FillItemsView(MsBuildProjectHelper msBuildHelper) { _projectTreeView.BeginUpdate(); try { // Первый проходом считываем элементы группируя их по типам. // itemTypesMap содержит ассоциативный массив имен типов элементов // и списков элементов. ItemTypesMap itemTypesMap = InitItemTypesMap(msBuildHelper); // Сортировка в TreeView делается очень медленно. По этому запрещаем // ее и выполняем ее потом вручную. _projectTreeView.TreeViewNodeSorter = null; _projectTreeView.Sorted = false; // Очищаем TreeView. _projectTreeView.Nodes.Clear(); // Эта переменная будет содержать список корневых веток TreeView. TreeNodeCollection rootNodes = _projectTreeView.Nodes; // Для каждого типа элементов... foreach (StrTreeNodePair elem in itemTypesMap) { // ... создаем корневую TreeView-ветку... TreeNode typeNode = new TreeNode(elem.Key); rootNodes.Add(typeNode); // Эта переменная будет содержать мап путь/TreeView-веток // для этого пути. TreeMap treeMap = new TreeMap(); // Для каждого элемента данного типа... foreach (TreeNode node in elem.Value) { // ... получаем путь к фалу. string dir = Path.GetDirectoryName(node.Text); // Находим соотвествующий фолдер (TreeView-ветку его описывающую). TreeNode folder = GetParentFolder(typeNode, treeMap, dir); // Получаем имя файла... string file = Path.GetFileName(node.Text); // ... которое используем в качестве имени элемента. node.Text = file; // Назначаем иконки файлов и добавляем ветку. const int FileImageIndex = 1; node.ImageIndex = FileImageIndex; node.SelectedImageIndex = FileImageIndex; folder.Nodes.Add(node); } } // Закат солнца вручную. :) Ручная сортировка требуется в виду // диких тормозов встроенной в TreeView сортировки. // Возможно к релизу эту проблему стронят, но пока... SortTreeNodes(rootNodes, new MSBuildTreeViewNodeSorter()); } finally { // Что бы не случилось нужно разрешить отрисовку. Иначе любой глюк // приведет к непотребному виду TreeView. _projectTreeView.EndUpdate(); } }