Заполнить TreeView из базы данных - PullRequest
14 голосов
/ 12 декабря 2008

У меня есть таблица базы данных (названная Темы), которая включает в себя следующие поля:

  1. topicId
  2. имя
  3. ParentID

и, используя их, я хочу заполнить TreeView в c #. Как я могу это сделать?

Заранее спасибо ...

Ответы [ 6 ]

13 голосов
/ 12 декабря 2008

Это, вероятно, будет что-то вроде этого. Дайте более подробную информацию о том, что именно вы хотите сделать, если вам нужно больше.

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

 }
7 голосов
/ 12 декабря 2008

Не совсем.

Деревья обычно обрабатываются лучше всего, не загружая все, что вы можете сразу. Таким образом, вам нужно получить корневой узел (или тему), у которого нет 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);
}
6 голосов
/ 11 апреля 2011
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 ParentID=@parentID", 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);
    }
}
6 голосов
/ 04 января 2011

этот код отлично работает для меня, проверьте его, я думаю, он поможет вам:)

;

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;
}
5 голосов
/ 04 декабря 2009

Если нет больших объемов данных, то нецелесообразно подключать базу данных, извлекать данные и снова и снова добавлять к узлу дерева для дочерних / подузлов. Это можно сделать за одну попытку. Смотрите следующий образец:
http://urenjoy.blogspot.com/2009/08/display-hierarchical-data-with-treeview.html

1 голос
/ 09 июля 2018

Этот код отлично работает для меня. Думаю, это может быть полезно для тех, кто хочет отображать иерархические данные в виде дерева. Пока, я думаю, это самое простое. Пожалуйста, проверьте это и подтвердите, если это поможет вам.

Ссылка: https://techbrij.com/display-hierarchical-data-with-treeview-in-asp-net

C # код:

 //dtTree  should be accessible in both page load and AddNodes()
    //DocsMenu is the treeview Id
          DataTable dtTree = new DataTable(); 
//declare your connection string
                protected void Page_Load(object sender, EventArgs e)
                {
                    //DataTable dtTree = new DataTable();
                    using (con)
                    {
                        con.Open();

                        string sQuery = "Select topicId,parentid,name from tbl_topicMaster";
                        SqlCommand cmd = new SqlCommand(sQuery, con);
                        cmd.CommandType = CommandType.Text;
                        SqlDataAdapter da = new SqlDataAdapter(cmd);
                        da.Fill(dtTree);
                        da.Dispose();
                        con.Close();
                    }

                    AddNodes(-1, DocsMenu.Nodes);
                }




                void AddNodes(int id, TreeNodeCollection tn)
                {
                    foreach (DataRow dr in dtTree.Select("parentid= " + id))
                    {
                        TreeNode sub = new TreeNode(dr["name"].ToString(), dr["topicId"].ToString());
                        tn.Add(sub);
                        AddNodes(Convert.ToInt32(sub.Value), sub.ChildNodes);
                    }
                }

код aspx:

<asp:TreeView ID="DocsMenu" runat="server" ImageSet="BulletedList" 
        NodeIndent="15"  >  
                    <HoverNodeStyle Font-Underline="True" ForeColor="#6666AA" />
                    <NodeStyle Font-Names="Tahoma" Font-Size="8pt" ForeColor="Black" HorizontalPadding="2px"  
                        NodeSpacing="0px" VerticalPadding="2px"></NodeStyle>  
                    <ParentNodeStyle Font-Bold="False" />  
                    <SelectedNodeStyle BackColor="#B5B5B5" Font-Underline="False" HorizontalPadding="0px"  
                        VerticalPadding="0px" />
                                 </asp:TreeView> 
...