-2

TreeViewを備えたWindowsアプリがあり、このビューのノードを展開して子ノードにドリルダウンできるとしましょう。子がさらにある可能性があるため、そのノードを展開してさらに進むことができます。私のソースコードFoo(string fatherNode)クリックした親ノードを取得し、子を見つけて一覧表示するメソッドがあります。

このメソッドの高レベルの本体は次のようになります。

private void Foo(string fatherNode)
{
  // call some DB scripts and grab data you need to work with.
  int numberOfKids = // get it from the thing you populated from the DB call.
  for(int i = 1  to numberOfKids)
  {
     Node Child = // grab child[i] from the list we populated from DB calls
     //Add it to the treeView
  }
}

そのコードはUIアプリに適しています。ノードをクリックすると、このメソッドが1回実行され、必要なデータが収集されます。次に、上記のメソッドの便利な行を使用して別のメソッドを作成する必要があります。ファイルとしましょう。

ですから、私の頭の中では、再帰的な方法のように見えます。しかし、それでも全体像を把握することはできません。Probには2つのコレクションが必要です。1つは父親用、もう1つは子供用で、子供をループして再帰的に呼び出し、より多くの子供を取得してコレクションに追加します。

霧、私がしなければならないことのハイレベル、コレクションがどのように見えるべきか、それらに追加する場所、再帰的なメソッド呼び出しを呼び出す場所などをクリアできるかどうか疑問に思いました...そしてお願いします「ツリービュー」オブジェクトについて具体的に考えるのではなく、質問をより適切に説明するための例としてそれを使用しました。主なものは、私が投稿したFooメソッドの構造です。それが私が取り組むべきことです。

4

3 に答える 3

1

ループFoo(child)内で呼び出します。for私はそれがあなたの問題を解決すると思います。木が巨大な場合は、再発しないでください。スタックを使用します。

于 2012-08-09T18:21:45.183 に答える
1

単純なツリートラバーサルアルゴリズムを作成します。擬似コードでのDFS(深さ優先探索)の簡単な実装を次に示します。

TraverseTree(Tree t)
{
   DoSomethingWith(t); // like writing the contents of the node to the file.

   if (t == null) // leaf
    return;

   foreach(Tree child in t.Children) // recursively traverse the children.
   {
      TraverseTree(child);
   }
}

計算を実行する順序で遊ぶことができます。詳細はこちらをご覧ください

于 2012-08-09T18:21:47.910 に答える
1

ええと、他の答えの後でも、これがあなたが探しているものであるかどうかはわかりません。ただし、チェックしてください。

自己関連エンティティ(ノード)

public class MyEntity
{
    public MyEntity() { }

    public MyEntity(string Name, int ID, int? ParentID)
    {
        this.Name = Name;
        this.ID = ID;
        this.ParentID = ParentID;
    }

    public string Name { get; set; }
    public int ID { get; set; }
    public int? ParentID { get; set; }
}

樹木構築方法

    public static StringBuilder GetFamilyTree(List<MyEntity> AllTheEntities)
    {
        StringBuilder Return = new StringBuilder();

        List<MyEntity> OrderedEntities = AllTheEntities.OrderBy<MyEntity, int>(x => x.ID).ToList();

        foreach (MyEntity CurrentEntity in AllTheEntities.Where<MyEntity>(x => !x.ParentID.HasValue))
        {
            Return.AppendLine(GetEntityTree(AllTheEntities, CurrentEntity));
        }

        return Return;
    }

    public static string GetEntityTree(List<MyEntity> AllTheEntities, MyEntity CurrentEntity, int CurrentLevel = 0)
    {
        StringBuilder Return = new StringBuilder();

        Return.AppendFormat("{0}{1}", "\t".Repeat(CurrentLevel), CurrentEntity.Name);
        Return.AppendLine();

        List<MyEntity> Children = AllTheEntities.Where<MyEntity>(x => x.ParentID.HasValue && x.ParentID.Value == CurrentEntity.ID).ToList();

        if (Children != null && Children.Count > 0)
        {
            foreach (MyEntity CurrentChildEntity in Children)
            {
                Return.Append(GetEntityTree(AllTheEntities, CurrentChildEntity, CurrentLevel + 1));
            }
        }

        return Return.ToString();
    }

小さなヘルパークラス

public static class StringExtension
{
    public static string Repeat(this string text, int times)
    {
        string Return = string.Empty;

        if (times > 0)
        {
            for (int i = 0; i < times; i++)
            {
                Return = string.Concat(Return, text);
            }
        }

        return Return;
    }
}

使用法

        List<MyEntity> AllMyEntities = new List<MyEntity>();
        AllMyEntities.Add(new MyEntity("1", 1, null));
        AllMyEntities.Add(new MyEntity("1.1", 2, 1));
        AllMyEntities.Add(new MyEntity("1.1.1", 3, 2));
        AllMyEntities.Add(new MyEntity("2", 4, null));
        AllMyEntities.Add(new MyEntity("2.1", 5, 4));

        Console.Write(GetFamilyTree(AllMyEntities).ToString());

結果

1
    1.1
        1.1.1
2
    2.1
于 2012-08-09T18:52:51.350 に答える