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.
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? –
@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
@Dany; por favor, cambie esta línea con esta ds.Relations.Add ("Children", dtbl1.Columns ["Id"], dtbl1.Columns ["ParentId"]); –