Re: Дикие тормоза при сортировке в TreeVie
От: Commandor16  
Дата: 05.07.05 19:46
Оценка:
Здравствуйте, VladD2,

Ваш код наверняка быстрый, но, если честно, я просто не знаю какой второй параметр нужно подставить в функию. Если ответите, то буду премного благодарен и если надо то же помогу если потребуется. А то я уже замучался с TreeViewNodeSorter: никак не могу заставить его сортировать выбранную ветку дерева (сортирует все дерево). Мне надо сделать универсальный компонент: TreeView + XmlView + ToolsStrip + ContextMenuStrip с внутренним редактированием xml (copy, paste, cut, insert, dragdrop ...) и все это за малый срок...


Вы писали:

VD>Писал тут тесты к статье и оказалось, что встроенные в TreeView средства сортировки дико тормозят.


VD>Если использовать только встроенную сортировку по строкам (ххх.Sorted = false), то еще куда не шло (хотя тоже мало пригодно для больших деревьев).


VD>Если же воспользоваться возможностью подключения внешнего компарера (xxx.TreeViewNodeSorter = new MyComparer()), то жутчайшие тормоза начинаются на совсем смешных объемах.


VD>Причем ручная реализация сортировки робатает даже значительно быстрее нежели встроенная. Причем код имеет смехотворный размер:

VD>
VD>/// <summary>
VD>/// Рекурсивная сортировка веток TreeView.
VD>/// </summary>
VD>/// <param name="rootNodes">Коллекция веток подлежащая сортировке</param>
VD>private static void SortTreeNodes(
VD>    TreeNodeCollection rootNodes,
VD>    IComparer<TreeNode> comparer)
VD>{
VD>    int count = rootNodes.Count;
VD>    if (count == 0)
VD>        return;

VD>    // Копируем содержимое коллекции подветок в массив,
VD>    // сортируем этот массв, очищаем коллекцию и копируем 
VD>    // подвекти обратно в коллекцию.
VD>    TreeNode[] nodeArray = new TreeNode[count];
VD>    rootNodes.CopyTo(nodeArray, 0);
VD>    Array.Sort<TreeNode>(nodeArray, comparer);
VD>    rootNodes.Clear();
VD>    rootNodes.AddRange(nodeArray);

VD>    // Сортируем все подветки
VD>    foreach (TreeNode node in nodeArray)
VD>        SortTreeNodes(node.Nodes, comparer);
VD>}
VD>

VD>В общем, дарю идею и надеюсь, что информация дойдет до тех кто занимается ВинФормсами.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.