2008-12-12 9 views
13

ich eine Datenbanktabelle haben (mit dem Namen Themen), die diese Felder enthält:Populate TreeView von DataBase

  1. TopicID
  2. Name
  3. parentId

und mit ihnen Ich möchte ein bevöl Baumansicht in C#. Wie kann ich das machen ?

Vielen Dank im Voraus ...

Antwort

12

Es wird wahrscheinlich so etwas wie dieses. Geben Sie etwas genauer an, was genau Sie tun möchten, wenn Sie mehr benötigen.

6

Nicht ganz.

Bäume werden normalerweise am besten gehandhabt, indem man nicht alles auf einmal lädt. Sie müssen also den Stammknoten (oder das Thema) abrufen, der keine parentIDs enthält. Fügen Sie sie dann dem Baumstammknoten hinzu, und dann müssen Sie für jeden hinzugefügten Knoten die untergeordneten Knoten abrufen.

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

dieser Code läuft perfekt für mich, check it out ich denke, es werden Ihnen helfen :)

;

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

Alte Post, aber sehr nützlich. Wie auch immer, wie kann ich den Wert erhalten, wenn der Knoten klickt? Prost, – 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); 
    } 
}