首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取treeView中的节点级别?

如何获取treeView中的节点级别?
EN

Stack Overflow用户
提问于 2011-08-17 01:38:22
回答 3查看 5.2K关注 0票数 0

我正在使用来自另一个网站的代码:

How can I model this class in a database?

我在每个目标记录中都有一个名为"Rank“的字段。它告诉我位置是什么。例如:

代码语言:javascript
复制
Objective "Geometry": Rank1
|_Objective "Squares": Rank1
|_Objective "Circles": Rank2
|_Objective "Triangle": Rank3
  |_Objective "Types": Rank1
Objectve "Algebra": Rank2
Objective "Trigonometry": Rank3

这个排名告诉我节点的顺序。但我想要得到所有的排名:因为第三个职位将是:

代码语言:javascript
复制
Objective "Geometry": Rank1
|_Objective "Squares": Rank1   -> 1.1
|_Objective "Circles": Rank2
|_Objective "Triangle": Rank3
  |_Objective "Types": Rank1   -> 1.3.1
Objectve "Algebra": Rank2
Objective "Trigonometry": Rank3    -> 3

我正在使用LINQ to SQL。我该怎么做呢?

代码语言:javascript
复制
    <TreeView Name="treeView1">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type data:Objective}" ItemsSource="{Binding Path=Objectives}" >
                <TextBlock Text="{Binding Name}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
EN

回答 3

Stack Overflow用户

发布于 2011-08-17 02:44:49

我不确定我是否理解了你想要什么,但是递归遍历树并为对象分配等级是非常简单的。下面是我快速编写的一些代码:

代码语言:javascript
复制
    public void Test()
    {
        Objective math = Init();
        RankObjective("", math);
        System.Console.ReadLine();
    }

    private void RankObjective(string rank, Objective objective)
    {
        int count = 1;
        if (!String.IsNullOrEmpty(rank))
            Console.WriteLine(objective.Name + ": " + rank);
        foreach (Objective child in objective.Objectives)
        {
            string newRank = String.IsNullOrEmpty(rank) ? count.ToString() : rank + "." + count.ToString();
            RankObjective(newRank, child);
            count++;
        }
    }

    private Objective Init()
    {
        Objective math = new Objective("Math");
        Objective geometry = new Objective("Geometry");
        geometry.Objectives.Add(new Objective("Squares"));
        geometry.Objectives.Add(new Objective("Circles"));
        Objective triangle = new Objective("Triangle");
        triangle.Objectives.Add(new Objective("Types"));
        geometry.Objectives.Add(triangle);
        math.Objectives.Add(geometry);
        math.Objectives.Add(new Objective("Algebra"));
        math.Objectives.Add(new Objective("Trigonometry"));
        return math;
    }

使用这个类:

代码语言:javascript
复制
public class Objective
{
    public Objective(string name)
    {
        Name = name;
        Objectives = new List<Objective>();
    }

    public string Name { get; set; }
    public List<Objective> Objectives { get; set; }
}

输出:

代码语言:javascript
复制
Geometry: 1
Squares: 1.1
Circles: 1.2
Triangle: 1.3
Types: 1.3.1
Algebra: 2
Trigonometry: 3
票数 1
EN

Stack Overflow用户

发布于 2011-08-17 02:46:58

从下面这样的东西开始:

代码语言:javascript
复制
void main()
{
    foreach(Node root in nodeCollection)
    {
        this.Recursion(root, 1);
    }
}

void Recursion(Node n, int depth)
{
    node.Depth = depth;
    foreach(Node child in n.Children)
    {
        this.Recursion(child, depth++);
    }
}

这将为您提供每个节点的深度(当然,您必须将字段node添加到类中)。

票数 0
EN

Stack Overflow用户

发布于 2011-08-17 03:20:56

到目前为止,实现这一点的最简单方法是在模型或视图模型中。例如,在Node类中,您可以实现以下属性:

代码语言:javascript
复制
public Collection<Node> Siblings { /* see below */ }

public Collection<Node> Children { get; set; }

public Node Parent { get; set; }

public int Position 
{ 
   get 
   { 
      return (Parent == null) 
         ? 0  // I don't like magic numbers, but I don't want to make this an int? either
         : Siblings.IndexOf(this) + 1; 
   }
}

public string Rank
{
    get
    {
       return (Parent == null)
          ? Position.ToString()
          : Parent.Rank + "." + Position.ToString();
    }
}

通常,实现Siblings属性的最简单方法是

代码语言:javascript
复制
public Collection<Node> Siblings 
{ 
   get 
   { 
      return (Parent == null)
         ? null
         : Parent.Children;
   }
}

如果顶层节点的集合不是节点层次结构的一部分,这就不起作用了,就像这样。您可以通过创建一个不出现在您的UI中的根Node对象来虚拟此对象-在本例中,您可以将TreeView绑定到根节点的Children属性,并像这样实现Rank

代码语言:javascript
复制
public string Rank
{
    get
    {
       if (Parent == null)
       {
          return null;
       }
       if (Parent.Parent == null)
       {
          return Position.ToString();
       }
       return Parent.Rank + "." + Position.ToString();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7082488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档