2011-07-19 27 views
6

Tengo la tabla sql como a continuación. Tengo que verla en vista de árbolTreeview de la tabla sql

id parentid  name 
1  NULL  outlook 
2  1  overcast 
3  1  rainy 
4  1  sunny 
5  2  yes 
6  3  wind 
7  4  humidity 
8  6  strong 
9  6  weak 
10 7  high 
11 8   no 
12 9   yes 
13 10   no 
14 15   yes 
15 7  normal 

Quiero salida como

-Outlook

- overcast 

     - yes 

- rainy 
    - wind 
     - strong 
       - no 
     - weak 
       - yes 
-sunny 
    - humidity 

     -high 
       -no 
     -normal 
       -yes 

Sólo hay un nodo raíz 'perspectiva' viene here.then nodos secundarios y sub- nodos infantiles así.

+0

El propósito de una vista en árbol es mostrar los nodos secundarios ** solo ** cuando el usuario amplía el nodo padre. En otras palabras, simplemente debería cargar los hijos inmediatos cuando se expande el padre. Intentar cargar todo el árbol al inicio es una mala idea de diseño. Esta tabla es pequeña, por lo que no es un gran problema aquí, pero imagina que es enorme. ¿Por qué obligarías a tus usuarios a esperar a que se cargue un árbol completo? –

+0

@Jose Rui Santos señor, soy un principiante en asp.net.we puede ir para la expansión de nodo cuando se selecciona .... pero no sé cómo hacerlo ... – dhanya

+0

@Dany; por favor, cambie esta línea con esta ds.Relations.Add ("Children", dtbl1.Columns ["Id"], dtbl1.Columns ["ParentId"]); –

Respuesta

2
WITH q AS 
     (
     SELECT * 
     FROM mytable 
     WHERE ParentID IS NULL -- this condition defines the ultimate ancestors in your chain, change it as appropriate 
     UNION ALL 
     SELECT m.* 
     FROM mytable m 
     JOIN q 
     ON  m.parentID = q.ID 
     ) 
SELECT * 
FROM q 
0

Pruebe el siguiente código en el archivo aspx o ascx:

<asp:Treeview ID="TreeView1" runat="server" /> 

Y en el código subyacente para poblarlo:

private void PopulateTreeView() 
{ 
    DataSet ds = new DataSet(); //(populate the dataset with the table) 

    //Use LINQ to filter out items without a parent 
    DataTable parents = ds.Tables[0].AsEnumerable() 
     .Where(i => i.Field<object>("parentid") == DBNull.Value) 
     .CopyToDataTable(); 

    //Use LINQ to filter out items with parent 
    DataTable children = ds.Tables[0].AsEnumerable() 
     .Where(i => i.Field<object>("parentid") != DBNull.Value) 
     .OrderBy(i => i.Field<int>("parentid")) 
     .CopyToDataTable(); 

    //Add the parents to the treeview 
    foreach(DataRow dr in parents) 
    { 
     TreeNode node = new TreeNode(); 
     node.Text = dr["name"].ToString(); 
     node.Value = dr["id"].ToString(); 
     TreeView1.Nodes.Add(node); 
    } 

    //Add the children to the parents 
    foreach(DataRow dr in children) 
    { 
     TreeNode node = new TreeNode(); 
     node.Text = dr["name"].ToString(); 
     node.Value = dr["id"].ToString(); 
     TreeNode parentNode = FindNodeByValue(dr["parentid"].ToString()); 
     if(parentNode != null) 
      parentNode.ChildNodes.Add(node); 
    } 
} 

private TreeNode FindNodeByValue(string value) 
{ 
    foreach(TreeNode node in TreeView1.Nodes) 
    { 
     if(node.Value = value) return node; 
     TreeNode pnode = FindNodeRecursion(node, value); 
     if(pnode != null) return pnode; 
    } 
    return null; 
} 

private TreeNode FindNodeRecursion(TreeNode parentNode, string value) 
{ 
    foreach(TreeNode node in parentNode.ChildNodes) 
    { 
     if(node.Value = value) return node; 
     TreeNode pnode = FindNodeRecursion(node, value); 
     if(pnode != null) return pnode; 
    } 
    return null; 
} 

Puede haber una mejor manera de hacer esto y yo no lo he probado , pero debería funcionar O siempre puede probar Telerik u otra herramienta de terceros que hace que el enlace de datos para este tipo de controles sea muy fácil.