0

タイプ「人」のオブジェクトがあります。このような各オブジェクトには、ManagerID と呼ばれるプロパティがあります。

私のデータベースでは、データは次のようになります。

ID、名前、ManagerId

データベースデータを使用してasp.netにツリーを構築する必要があります。ツリーは次のようになります。

John
Lee
David
  William
  Ernest
    Johan
      Red
    George
    Gabriel
      Albert
      Don
        Gabi
  Marry
Helen
......etc

マネージャーの下のツリーに人が表示され、サブレベルごとに増分が増加します。

次に、リストに人をロードします。

List<People> lst = loadPeople();

リストをツリーに変換するにはどうすればよいですか? ありがとうございました。

4

2 に答える 2

1

「トップ」マネージャーが最初に追加されることが重要であるため、マネージャーを持たない人は ManagerID = 0 を持っていると仮定して、リストを ManagerID で並べ替えることができます。親の場合、人は「トップ」マネージャーであり、彼にはマネージャーがなく、ツリービューのルートに追加します。

このようなもの :

protected void Page_Load(object sender, EventArgs e)
{
  List<People> pplList = LoadPeople();

  foreach (People person in pplList.OrderBy(pp => pp.ManagerID))
  {
    IEnumerable<TreeNode> nodes = Extensions.GetItems<TreeNode>(TreeViewPeople.Nodes, item => item.ChildNodes);
    TreeNode parent = nodes.FirstOrDefault(nn => nn.Value.Equals(person.ManagerID.ToString()));         
    TreeNode newNode = new TreeNode(person.Name, person.ID.ToString());
    if (parent == null)
      TreeViewPeople.Nodes.Add(newNode);
    else
      parent.ChildNodes.Add(newNode);          
  }
}

ここから取得したすべてのツリー ノードを返す GetItems メソッドを次に示します。

  public static class Extensions
  {
    public static IEnumerable<T> GetItems<T>(this IEnumerable collection, Func<T, IEnumerable> selector)
    {
      Stack<IEnumerable<T>> stack = new Stack<IEnumerable<T>>();
      stack.Push(collection.OfType<T>());

      while (stack.Count > 0)
      {
        IEnumerable<T> items = stack.Pop();
        foreach (var item in items)
        {
          yield return item;

          IEnumerable<T> children = selector(item).OfType<T>();
          stack.Push(children);
        }
      }
    }
  }
于 2012-08-28T10:34:21.780 に答える