2008-12-12 51 views
13

Tengo una tabla de base de datos (llamados temas) que incluye estos campos:Rellenar TreeView la base de datos

  1. topicId
  2. nombre
  3. parentId

y usándolos Quiero llenar una TreeView en C#. Cómo puedo hacer eso ?

Gracias de antemano ...

Respuesta

12

probablemente será algo como esto. Proporcione más detalles sobre qué es exactamente lo que quiere hacer si necesita más.

//In Page load 
foreach (DataRow row in topics.Rows) 
{ 
    TreeNode node = new TreeNode(dr["name"], dr["topicId"]) 
    node.PopulateOnDemand = true; 

    TreeView1.Nodes.Add(node); 
} 
/// 
protected void PopulateNode(Object sender, TreeNodeEventArgs e) 
{ 
    string topicId = e.Node.Value; 
    //select from topic where parentId = topicId. 
    foreach (DataRow row in topics.Rows) 
    { 
     TreeNode node = new TreeNode(dr["name"], dr["topicId"]) 
     node.PopulateOnDemand = true; 

     e.Node.ChildNodes.Add(node); 
    } 

} 
6

No del todo.

Por lo general, los árboles se manejan mejor al no cargar todo lo que puede a la vez. Entonces necesita obtener el nodo raíz (o tema) que no tiene parentIDs. A continuación, agréguelos al nodo raíz de árboles y luego para cada nodo que agregue, debe obtener sus hijos.

foreach (DataRow row in topicsWithOutParents.Rows) 
{ 
    TreeNode node = New TreeNode(... whatever); 
    DataSet childNodes = GetRowsWhereParentIDEquals(row["topicId"]); 
    foreach (DataRow child in childNodes.Rows) 
    { 
     Treenode childNode = new TreeNode(..Whatever); 
     node.Nodes.add(childNode); 
    } 
    Tree.Nodes.Add(node); 
} 
5

este código funciona perfectamente para mí, comprobar que creo que le ayudará a :)

;

protected void Page_Load(object sender, EventArgs e) 
{ 
    DataSet ds = RunQuery("Select topicid,name from Topics where Parent_ID IS NULL"); 
     for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
     { 
      TreeNode root = new TreeNode(ds.Tables[0].Rows[i][1].ToString(),ds.Tables[0].Rows[i][0].ToString()); 
      root.SelectAction = TreeNodeSelectAction.Expand; 
      CreateNode(root); 
      TreeView1.Nodes.Add(root); 
     } 



} 
void CreateNode(TreeNode node) 
{ 
    DataSet ds = RunQuery("Select topicid, name from Category where Parent_ID =" + node.Value); 
    if (ds.Tables[0].Rows.Count == 0) 
    { 
     return; 
    } 
    for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
    { 
     TreeNode tnode = new TreeNode(ds.Tables[0].Rows[i][1].ToString(), ds.Tables[0].Rows[i][0].ToString()); 
     tnode.SelectAction = TreeNodeSelectAction.Expand; 
     node.ChildNodes.Add(tnode); 
     CreateNode(tnode); 
    } 

} 
DataSet RunQuery(String Query) 
{ 
    DataSet ds = new DataSet(); 
    String connStr = "???";//write your connection string here; 
    using (SqlConnection conn = new SqlConnection(connStr)) 
    { 
     SqlCommand objCommand = new SqlCommand(Query, conn); 
     SqlDataAdapter da = new SqlDataAdapter(objCommand); 
     da.Fill(ds); 
     da.Dispose(); 
    } 
    return ds; 
} 
+0

Mensaje viejo, pero muy útil. De todos modos, ¿cómo puedo obtener el valor cuando el nodo hace clic? Aclamaciones, – Haminteu

5
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
     PopulateRootLevel(); 
} 


private void PopulateRootLevel() 
{ 
    SqlConnection objConn = new SqlConnection(connStr); 
    SqlCommand objCommand = new SqlCommand(@"select FoodCategoryID,FoodCategoryName,(select count(*) FROM FoodCategories WHERE ParentID=c.FoodCategoryID) childnodecount FROM FoodCategories c where ParentID IS NULL", objConn); 
    SqlDataAdapter da = new SqlDataAdapter(objCommand); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 
    PopulateNodes(dt, TreeView2.Nodes); 
} 

private void PopulateSubLevel(int parentid, TreeNode parentNode) 
{ 
    SqlConnection objConn = new SqlConnection(connStr); 
    SqlCommand objCommand = new SqlCommand(@"select FoodCategoryID,FoodCategoryName,(select count(*) FROM FoodCategories WHERE ParentID=sc.FoodCategoryID) childnodecount FROM FoodCategories sc where [email protected]", objConn); 
    objCommand.Parameters.Add("@parentID", SqlDbType.Int).Value = parentid; 
    SqlDataAdapter da = new SqlDataAdapter(objCommand); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 
    PopulateNodes(dt, parentNode.ChildNodes); 
} 


protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e) 
{ 
    PopulateSubLevel(Int32.Parse(e.Node.Value), e.Node); 
} 

private void PopulateNodes(DataTable dt, TreeNodeCollection nodes) 
{ 
    foreach (DataRow dr in dt.Rows) 
    { 
     TreeNode tn = new TreeNode(); 
     tn.Text = dr["FoodCategoryName"].ToString(); 
     tn.Value = dr["FoodCategoryID"].ToString(); 
     nodes.Add(tn); 

     //If node has child nodes, then enable on-demand populating 
     tn.PopulateOnDemand = ((int)(dr["childnodecount"]) > 0); 
    } 
} 
Cuestiones relacionadas