Замедлите treeview в C#

Вот лучшая версия, в которой будут перечислены все возможные маршруты :

  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);
      }
    }
  }
9
задан torvin 13 July 2016 в 02:40
поделиться

6 ответов

Я не верю поддержкам TreeView.NET, что Вы хотите, хотя этот тип модели поддерживается DataGridView.NET (см. свойство VirtualMode DataGridView). TreeView позволит Вам потянуть свои собственные узлы, но он не позволит Вам заполнить их от некоторого виртуального хранилища.

Если возможно, Вы могли бы хотеть рассмотреть использование DataGridView для Вашего приложения. В противном случае управление узлами вручную (как joshl упоминает выше) могло бы работать, если можно обойти некоторые проблемы с обновлением экрана правильно, когда узлы расширены. За пределами этого Вы могли бы хотеть проверить некоторых сторонних поставщиков, как этот (Divelements SandGrid), который мог бы (акцент на силу) поддерживают Ваш желаемый режим работы.

Примечание: SandGrid не поддерживается Divelements с конца июля 2013.

7
ответ дан 4 December 2019 в 06:01
поделиться

Одна техника для того, чтобы улучшить производительность состоит в том, чтобы загрузить TreeNodes, поскольку пользователь разворачивает treeview. Обычно пользователь не потребует, чтобы 20 000 узлов были открыты на их экране сразу. Только загрузите уровень, который пользователь должен видеть, наряду с любой дочерней информацией, которую необходимо правильно отобразить, подразумеваемые возможности пользователю (разверните значок, если дети существуют, количества, значки, и т.д.). Поскольку пользователь разворачивает узлы, дети загрузки как раз вовремя.

Полезная подсказка от Keith: С winforms TreeView у Вас должен быть по крайней мере один дочерний узел, или он не покажет расширение [+], но затем Вы обрабатываете событие TreeNodeExpanded, чтобы удалить тот фиктивный узел и заполнить детей.

20
ответ дан 4 December 2019 в 06:01
поделиться

В нашем основном приложении WinForm у нас есть treeview, загруженный все в одном выстреле:

  • BeginUpdate ()
  • Загрузите 20 000 узлов
  • EndUpdate ()

и до сих пор производительность все еще хороша. Это - на самом деле один из нескольких компонентов, которые мы не заменяем сторонними.

Работа TreeView, по моему опыту, становится медленной при загрузке узлов (в одном выстреле, или по требованию), не называя Begin/EndUpdate (), особенно если узлы отсортированы, но если Вы называете Begin/EndUpdate () правильно, Вы не должны действительно связывать проблемы производительности с самим компонентом.

11
ответ дан 4 December 2019 в 06:01
поделиться

Существует один способ заставить TreeView работать намного лучше, и это должно создать все подузлы и сцепить их вместе и затем добавить узлы к TreeView. Если это - графическая производительность, мы говорим о.

TreeView tree = new TreeView();
TreeNode root = new TreeNode("Root");
PopulateRootNode(root); // Get all your data
tree.Nodes.Add(root);

Иначе загрузите их узел использованием узла OnTreeNodeExpanded.

5
ответ дан 4 December 2019 в 06:01
поделиться

Для больших данных в программировании Windows C#, добавил ли это быть в WPF или WinForms, я традиционно узлы динамично. Я загружаю начальный древовидный корень + дети + внуки глубоко. Когда любой узел расширен, я загружаю древовидные узлы, которые представили бы внуков расширяющегося узла, если таковые имеются.

Этот шаблон также работает хорошо с поиском данных. Если Вы действительно загружаете данные из источника тысяч или миллионов записей, Вы, вероятно, не хотите загружать их впереди. Никакой пользователь не хочет ожидать, для которого можно быть загружен, и нет причины загрузить данные, которые никогда не могут просматриваться.

Я обычно загружал внуков или данные узла правнуков по мере необходимости по фоновому потоку, затем упорядочиваю те данные назад к UI, распараллеливают и создают и добавляют узлы. Это оставляет UI быстро реагирующим. Можно визуально украсить древовидные узлы, чтобы указать, что они все еще загружаются для случая, где пользователь обгоняет IO к хранилищу данных.

1
ответ дан 4 December 2019 в 06:01
поделиться

Примечание: Этот ответ делается недействительным редактированием корреспондентом, говорящим, что он уже делает такого рода вещь, но я решил все еще отправить его для дальнейшего использования другими, ищущими по этой теме

Когда я сделал подобные вещи в прошлом, я был склонен выбирать наивный лениво загружающийся стиль.

  • Используйте TreeNode.Tag свойство для содержания ссылки, что можно использовать для поиска детей
  • Используйте TreeView.BeforeExpand событие для заполнения дочерних узлов
  • Дополнительно используйте TreeView.AfterCollapse событие для удаления их.
  • Чтобы заставить [+] / [-] поля появляться, лучший способ, которым я нашел, состоит в том, чтобы создать одноэлементный макет TreeNode это добавляется как ребенок ко всем безлюдным Узлам, и Вы проверяете на его существование прежде, чем заполнить с BeforeExpand.
7
ответ дан 4 December 2019 в 06:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: