Вот лучшая версия, в которой будут перечислены все возможные маршруты :
import { Router, Route } from "@angular/router";
constructor(private router: Router) {
}
ngOnInit() {
this.printpath('', this.router.config);
}
printpath(parent: String, config: Route[]) {
for (let i = 0; i < config.length; i++) {
let r = config[i];
console.log(parent + '/' + r.path);
if (r.children && r.path) {
this.printpath(parent + '/' + r.path, r.children);
}
}
}
Я не верю поддержкам TreeView.NET, что Вы хотите, хотя этот тип модели поддерживается DataGridView.NET (см. свойство VirtualMode DataGridView). TreeView позволит Вам потянуть свои собственные узлы, но он не позволит Вам заполнить их от некоторого виртуального хранилища.
Если возможно, Вы могли бы хотеть рассмотреть использование DataGridView для Вашего приложения. В противном случае управление узлами вручную (как joshl упоминает выше) могло бы работать, если можно обойти некоторые проблемы с обновлением экрана правильно, когда узлы расширены. За пределами этого Вы могли бы хотеть проверить некоторых сторонних поставщиков, как этот (Divelements SandGrid), который мог бы (акцент на силу) поддерживают Ваш желаемый режим работы.
Примечание: SandGrid не поддерживается Divelements с конца июля 2013.
Одна техника для того, чтобы улучшить производительность состоит в том, чтобы загрузить TreeNodes, поскольку пользователь разворачивает treeview. Обычно пользователь не потребует, чтобы 20 000 узлов были открыты на их экране сразу. Только загрузите уровень, который пользователь должен видеть, наряду с любой дочерней информацией, которую необходимо правильно отобразить, подразумеваемые возможности пользователю (разверните значок, если дети существуют, количества, значки, и т.д.). Поскольку пользователь разворачивает узлы, дети загрузки как раз вовремя.
Полезная подсказка от Keith: С winforms TreeView у Вас должен быть по крайней мере один дочерний узел, или он не покажет расширение [+], но затем Вы обрабатываете событие TreeNodeExpanded, чтобы удалить тот фиктивный узел и заполнить детей.
В нашем основном приложении WinForm у нас есть treeview, загруженный все в одном выстреле:
и до сих пор производительность все еще хороша. Это - на самом деле один из нескольких компонентов, которые мы не заменяем сторонними.
Работа TreeView, по моему опыту, становится медленной при загрузке узлов (в одном выстреле, или по требованию), не называя Begin/EndUpdate (), особенно если узлы отсортированы, но если Вы называете Begin/EndUpdate () правильно, Вы не должны действительно связывать проблемы производительности с самим компонентом.
Существует один способ заставить TreeView работать намного лучше, и это должно создать все подузлы и сцепить их вместе и затем добавить узлы к TreeView. Если это - графическая производительность, мы говорим о.
TreeView tree = new TreeView();
TreeNode root = new TreeNode("Root");
PopulateRootNode(root); // Get all your data
tree.Nodes.Add(root);
Иначе загрузите их узел использованием узла OnTreeNodeExpanded.
Для больших данных в программировании Windows C#, добавил ли это быть в WPF или WinForms, я традиционно узлы динамично. Я загружаю начальный древовидный корень + дети + внуки глубоко. Когда любой узел расширен, я загружаю древовидные узлы, которые представили бы внуков расширяющегося узла, если таковые имеются.
Этот шаблон также работает хорошо с поиском данных. Если Вы действительно загружаете данные из источника тысяч или миллионов записей, Вы, вероятно, не хотите загружать их впереди. Никакой пользователь не хочет ожидать, для которого можно быть загружен, и нет причины загрузить данные, которые никогда не могут просматриваться.
Я обычно загружал внуков или данные узла правнуков по мере необходимости по фоновому потоку, затем упорядочиваю те данные назад к UI, распараллеливают и создают и добавляют узлы. Это оставляет UI быстро реагирующим. Можно визуально украсить древовидные узлы, чтобы указать, что они все еще загружаются для случая, где пользователь обгоняет IO к хранилищу данных.
Примечание: Этот ответ делается недействительным редактированием корреспондентом, говорящим, что он уже делает такого рода вещь, но я решил все еще отправить его для дальнейшего использования другими, ищущими по этой теме
Когда я сделал подобные вещи в прошлом, я был склонен выбирать наивный лениво загружающийся стиль.
TreeNode.Tag
свойство для содержания ссылки, что можно использовать для поиска детейTreeView.BeforeExpand
событие для заполнения дочерних узловTreeView.AfterCollapse
событие для удаления их.TreeNode
это добавляется как ребенок ко всем безлюдным Узлам, и Вы проверяете на его существование прежде, чем заполнить с BeforeExpand
.