Как назначить схему нумерации для TreeNodes на основе позиции - PullRequest
3 голосов
/ 15 июня 2010

У меня есть элемент управления TreeView в приложении Windows Forms, который отображает мой собственный подкласс TreeNode. Мне нужно отобразить число вместе с текстом каждого узла, указывающим его положение в дереве, например, 1 для корня, 1.1 для его первого дочернего элемента, 1.2 для его второго дочернего элемента и т. Д. Я использую C # с .NET 2.0

Лучшее, что я могу придумать, это после того, как дерево построено, перейти к каждому узлу, рекурсивно найти родителя и добавить номер родного брата родителя в начало текста узла, пока не достигнете корня.

Ответы [ 3 ]

2 голосов
/ 15 июня 2010

Вы можете создавать подкласс TreeNode, добавлять свойства и переопределения по мере необходимости.

Или вы можете назначать номера Tag свойства при построении дерева.Алгоритм будет зависеть от того, как вы построите дерево (сверху вниз, снизу вверх и т. Д.).

Более точная информация (код) поможет сформулировать более четкий ответ.

обновление после комментария OP:

Извините, я неправильно запомнил;вам нужно переопределить TreeView вместо этого.Что-то вроде

public class MyTreeView : System.Windows.Forms.TreeView
{
  // ...

    protected override void OnDrawNode(DrawTreeNodeEventArgs e)
    {
        if (e.Node.Tag != null)
        {
            if (e.Node.Tag.GetType() == typeof(MyDataObject))
            {
                MyDataObject data = (MyDataObject)e.Node.Tag;
                e.Node.Name = data.Number + ". " + data.Name;
            }
        }
     }
}
1 голос
/ 15 июня 2010

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

Плохо реализовано, но дает представление.

public static class Extensions
    {
        public static string GetPosition(this TreeNode node)
        {
            string Result = "";
            BuildPath(node, ref Result);
            return Result.TrimStart('.');
        }
        private static void BuildPath(TreeNode node,ref string path)
        {
            path = "." + node.Index + path;
            if (node.Parent != null) 
                BuildPath(node.Parent, ref path);
        }
    }
0 голосов
/ 15 июня 2010

Напишите рекурсивную функцию для обхода дерева, передавая каждому узлу номер родителя для использования в качестве префикса.

void Traverse(TreeNode node, string parentNumber)
{
    string nodeNumber = parentNumber + node.Index.ToString();
    node.Text = nodeNumber;
    string prefix = nodeNumber + ".";
    foreach (TreeNode childNode in node.Nodes)
        Traverse(childNode, prefix);
}

Вызовите его для корневого TreeNode с пустой строкой в ​​качестве строки parentNumber.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...