2008-12-12 123 views
13

我有一個數據庫表(命名爲主題),其中包括以下字段:填充TreeView控件從數據庫

  1. topicId
  2. parentId的

,並通過他們,我想填充在C#中的TreeView。我怎樣才能做到這一點 ?

在此先感謝...

回答

12

它可能是這樣的。如果您需要更多,請詳細說明您想要做什麼。

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

不完全。

樹木通常不會一次加載任何東西,因此處理效果最佳。所以你需要得到沒有parentID的根節點(或主題)。然後將它們添加到樹根節點,然後爲添加的每個節點獲取子節點。

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

此代碼運行完全適合我,看看我認爲這將幫助你:)

;

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

舊帖子,但非常有用。無論如何,當節點點擊時我怎麼能得到這個值?乾杯, – Haminteu 2016-03-20 07:49:32

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); 
    } 
}