2008-12-12 9 views
13

J'ai une table de base de données (nommées rubriques) qui comprend les champs suivants:Populate TreeView de DataBase

  1. TopicId
  2. Nom
  3. parentId

et en les utilisant que je veux remplir un TreeView dans C#. Comment puis je faire ça ?

Merci à l'avance ...

Répondre

12

Il sera probablement quelque chose comme ça. Donnez plus de détails sur ce que vous voulez exactement faire si vous en avez besoin de plus.

//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

Pas tout à fait.

Les arbres sont généralement mieux traités en ne chargeant pas tout ce que vous pouvez en même temps. Vous devez donc obtenir le nœud racine (ou le sujet) qui n'a pas de parentID. Ensuite, ajoutez-les au nœud racine des arbres, puis pour chaque nœud que vous ajoutez, vous devez obtenir ses enfants.

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

ce code fonctionne parfaitement pour moi, vérifier que je pense que ça va vous aider :)

;

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

poste Vieux, mais très utile. Quoi qu'il en soit, comment puis-je obtenir la valeur lorsque le nœud est cliqué? À votre santé, – 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); 
    } 
}