2017-11-28 7 views
1

データベースクエリからC#ツリービューを作成しようとしています。クエリからTreeViewを設定する

データベースはこのようなものに構成されています。

----------------------------------------------- 
| PARENT_NODE | CHILD_NODE | LEVEL | NAME  | 
----------------------------------------------- 
|  1  |  2  | 1 | name1 | 
----------------------------------------------- 
|  1  |  4  | 1 | name2 | 
----------------------------------------------- 
|  2  |  6  | 1 | name4 | 
----------------------------------------------- 
|  2  |  3  | 2 | name3 | 
----------------------------------------------- 
|  3  | null  | 3 | name5 | 
----------------------------------------------- 

はdatabseクエリを変更することはできません。

ツリービューの表現としては、このようになります。

name1 
    |---- name3 
    |  |---- name5 
name2 
    | 
    | 
name4 

私はこれと同様の問題を抱えている他のものを探すようにしました。しかし、これらの例は従うのが難しく、通常私のためには機能しません。私はそれを間違って実装したか、私の状況ではうまく動作しません。

私の最近の試みは、ループ内でループを作って子供を反復し、それらを親に関連付けることでした。しかし、代わりに何も表示されませんでした。

// Nodes 
      TreeNode rootNode = new TreeNode("root_NAME"); 
      TreeNode parent = new TreeNode(); 
      TreeNode child = new TreeNode(); 


      foreach (DataRow dr in dt.Rows) 
      { 
       if (dr["LEVEL"].ToString() == "1") 
       { 
        parent = new TreeNode(dr["NAME"].ToString()); 
        rootNode.Nodes.Add(parent); 
        //TreeView.traceTreeView.Nodes.Add(node); 
       } 
       else 
       { 
        // Search for where child_node == parent_node and add that node 

        List<TreeNode> childList = new List<TreeNode>(); 


        foreach (DataRow cr in dt.Rows) 
        { 
         if (cr["PARENT_NODE"].ToString() == dr["CHILD_NODE"].ToString()) 
         { 
          childList.Add(child = new TreeNode(cr["NAME"].ToString())); 
         } 
        } 
        TreeNode[] childArray = childList.ToArray(); 

        TreeNode node = new TreeNode(dr["NAME"].ToString(), childArray); 
        parent.Nodes.Add(node); 

       } 

      } 

誰かが私がテーブルを反復処理し、親ノードと子ノードを関連付けてツリービューに追加する方法を教えてもらえますか?

+0

ない答えを私は 'AVLのtrees'が役立つかもしれません見上げると思います。 – thanatorr

+1

'NAME'はどのノードを参照していますか?親ノードまたは子ノード?サンプルデータに基づいて変化するようです。 'LEVEL'も' name1'と 'name2'は同じレベルですが、ネストする必要があると言っているので意味がありません。 –

+0

フォームツリーはあなたがそう思っていたとは思わない。私は実際にあなたの表現に基づいて表示しようとしていることを実際に理解していません。 – Kilazur

答えて

0

以下、この問題をどのように解決するかをご説明します。

foreach (DataRow dr in dt.Rows) 
     { 
      if (!UserFunctions.IsNullOrEmpty(traceWindow.traceTreeView.Nodes.Find(dr["PARENT_NODE"].ToString(), true))) 
      { 
       // add child to parent 
       // if child_node == null -> cNode.Name(Text) = "INDATA" 
       TreeNode cNode; 
       // "JOB_NAME_IN" is a column name in the database 
       if (!string.IsNullOrEmpty(dr["JOB_NAME_IN"].ToString())) 
       { 
        cNode = new TreeNode(dr["JOB_NAME_IN"].ToString()); 
       } 
       else 
       { 
        cNode = new TreeNode(dr["INDATA"].ToString()); 
       } 
       // .Name is the key of that node. 
       // Setting it to child node allows me to search for which node is the parent of the current datarow i'm reading. 
       cNode.Name = dr["CHILD_NODE"].ToString(); 
       TreeNode[] pNode = traceWindow.traceTreeView.Nodes.Find(dr["PARENT_NODE"].ToString(), true); 

       pNode[0].Nodes.Add(cNode); 

      } 
      else 
      { 
       // There is no child, create new parent 
       // if child_node == null -> cNode.Name(Text) = "INDATA" 
       TreeNode pNode; 
       if (!string.IsNullOrEmpty(dr["JOB_NAME_IN"].ToString())) 
       { 
        pNode = new TreeNode(dr["JOB_NAME_IN"].ToString()); 
       } 
       else 
       { 
        pNode = new TreeNode(dr["INDATA"].ToString()); 
       } 
       pNode.Name = dr["CHILD_NODE"].ToString(); // Key 
       traceWindow.traceTreeView.Nodes.Add(pNode); 
      } 


     } 

私は次のように見えますIsNullOrEmptyの拡張方法作成しました注:

public static bool IsNullOrEmpty(this Array array) 
    { 
     // This is an extension of an existing function 
     // to make it work with arrays. 

     return (array == null || array.Length == 0); 
    } 
関連する問題