Писал тут тесты к статье и оказалось, что встроенные в TreeView средства сортировки дико тормозят.
Если использовать только встроенную сортировку по строкам (ххх.Sorted = false), то еще куда не шло (хотя тоже мало пригодно для больших деревьев).
Если же воспользоваться возможностью подключения внешнего компарера (xxx.TreeViewNodeSorter = new MyComparer()), то жутчайшие тормоза начинаются на совсем смешных объемах.
Причем ручная реализация сортировки робатает даже значительно быстрее нежели встроенная. Причем код имеет смехотворный размер:
/// <summary>
/// Рекурсивная сортировка веток TreeView.
/// </summary>
/// <param name="rootNodes">Коллекция веток подлежащая сортировке</param>
private static void SortTreeNodes(
TreeNodeCollection rootNodes,
IComparer<TreeNode> comparer)
{
int count = rootNodes.Count;
if (count == 0)
return;
// Копируем содержимое коллекции подветок в массив,
// сортируем этот массв, очищаем коллекцию и копируем
// подвекти обратно в коллекцию.
TreeNode[] nodeArray = new TreeNode[count];
rootNodes.CopyTo(nodeArray, 0);
Array.Sort<TreeNode>(nodeArray, comparer);
rootNodes.Clear();
rootNodes.AddRange(nodeArray);
// Сортируем все подветки
foreach (TreeNode node in nodeArray)
SortTreeNodes(node.Nodes, comparer);
}
В общем, дарю идею и надеюсь, что информация дойдет до тех кто занимается ВинФормсами.

... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Здравствуйте, 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>В общем, дарю идею и надеюсь, что информация дойдет до тех кто занимается ВинФормсами.
Здравствуйте, Commandor16, Вы писали:
C>Здравствуйте, VladD2,
C>Ваш код наверняка быстрый, но, если честно, я просто не знаю какой второй параметр нужно подставить в функию. Если ответите, то буду премного благодарен и если надо то же помогу если потребуется.
class MSBuildTreeViewNodeSorter : IComparer, IComparer<TreeNode>
{
#region IComparer Members
public int Compare(object x, object y)
{
return Compare((TreeNode)x, (TreeNode)y);
}
#endregion
#region IComparer<TreeNode> Members
// Вот тут должна быть собственная процедура сравнения.
public int Compare(TreeNode x, TreeNode y)
{
if (x.Tag != null && y.Tag == null)
return 1;
if (x.Tag == null && y.Tag != null)
return -1;
return x.Text.CompareTo(y.Text);
}
public bool Equals(TreeNode x, TreeNode y)
{
return Compare(x, y) == 0;
}
public int GetHashCode(TreeNode obj)
{
return obj.Text.GetHashCode();
}
#endregion
}
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Здравствуйте, Commandor16, Вы писали:
C>Мне надо сделать универсальный компонент: TreeView + XmlView + ToolsStrip + ContextMenuStrip с внутренним редактированием xml (copy, paste, cut, insert, dragdrop ...) и все это за малый срок...
Прикольно, три месяца назад сочинял Design Spec на похожую тему. Может кто знает контролы для редактирования XML and related для WinForms?
... << RSDN@Home 1.1.4 stable rev. 510>>