如何根据位置为TreeNodes分配编号方案

时间:2010-06-14 22:16:31

标签: c# .net winforms controls treeview

我在Windows窗体应用程序中有一个TreeView控件,它显示我自己的TreeNode子类。我需要显示一个数字以及每个节点的文本,指示它在树中的位置,例如1表示根,1表示第一个子节点,1.2表示其第二个子节点等。我正在使用C#和.NET 2.0

我能想到的最好的方法是,在构建树之后,转到每个节点,递归地找到父节点并将父节点的兄弟节点号附加到节点文本的前面,直到到达根节点。

3 个答案:

答案 0 :(得分:2)

您可以继承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 :(得分:1)

您可以使用扩展程序,以便重用代码并获取 你想要的路径。

执行不好,但会给你一个想法。

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);
        }
    }

答案 2 :(得分:0)

编写一个递归函数来遍历树,将每个节点的父编号传递给前缀。

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字符串。