less is more

文章數(4) 回應數(12) 引用數(0)

[ASP.NET]動態TreeView 結合資料庫產生節點

2008/12/3 14:19 | 閱讀數 : 21490 我要推薦 | 文章分類 : Asp.Net 訂閱

現在來介紹TreeView 結合資料庫產生節點

顯示畫面如下:

 

 

 

 

 

 

資料庫表格,「很簡單只要3個欄位就ok

 

 

 

 

 

 

Id:      系統自動產生

ParentId:父節點的idnull代表第一層

Ntext:   節點顯示名稱

 

程式架構:

Step1: TreeView資料來源,連結資料庫

Step2: 建立DataSet: idParentId Relations

Step3: 產生新節點,並判斷是否為第一層,是的話直接新增到TreeView,並且利用DataSet. Relations建立子節點

Step4:  完成

 

 

        private void buildTree()
        {
            OleDbConnection dbCon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +   Server.MapPath("siteMap.mdb"));
            dbCon.Open();

            OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM SiteMap", dbCon);
            DataSet ds = new DataSet();
            adapter.Fill(ds);
   
            ds.Relations.Add("NodeRelation", ds.Tables[0].Columns["Id"], ds.Tables[0].Columns["ParentId"]);

            foreach (DataRow dbRow in ds.Tables[0].Rows)
            {

                if (dbRow.IsNull("ParentId"))
                {
                    TreeNode newNode = CreateNode(dbRow["NText"].ToString(), dbRow["ID"].ToString(), true);
                    TreeView1.Nodes.Add(newNode);
                    PopulateSubTree(dbRow, newNode);
                  
                }

            }
        }

 

          ///產生子節點

        private void PopulateSubTree(DataRow dbRow, TreeNode node)
        {
           
            foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation"))
            {

              TreeNode childNode = CreateNode(childRow["NText"].ToString(), childRow["ID"].ToString(), true);
     
                node.ChildNodes.Add(childNode);
                PopulateSubTree(childRow, childNode);

            }
        }

 

 

 

          ///節點屬性設定

        private TreeNode CreateNode(string text, string id, bool expanded)
        {
            TreeNode node = new TreeNode(); ;
            node.Text = text;
            node.Value = id;
            node.Expanded = true;
            return node;
        }
    }

 

 

 

 


  • topcat 2008/12/3 下午 02:43 回覆

    # re: [ASP.NET]動態TreeView 結合資料庫產生節點

    剛好小喵也有一篇是講TreeView,是用遞迴的方式來展開樹,用VB.NET撰寫的例子,也提供大家參考

    http://www.dotblogs.com.tw/topcat/archive/2008/03/05/1234.aspx

    ^_^

  • evan 2008/12/3 下午 03:19 回覆

    # re: [ASP.NET]動態TreeView 結合資料庫產生節點

    遞迴的方式---不錯喔

    也算是另外一種好方法

  • kevin 2009/5/26 上午 12:51 回覆

    # re: [ASP.NET]動態TreeView 結合資料庫產生節點

    不好意思

    可以請問一下最後那個code是寫在哪裡呢?

    謝謝

  • Shino 2009/9/15 下午 08:54 回覆

    # re: [ASP.NET]動態TreeView 結合資料庫產生節點

    請問,為什麼我自行新增的一個DATASET,會在「ds.Relations.Add("NodeRelation", ds.Tables[0].Columns["Id"], ds.Tables[0].Columns["ParentId"]);」這行出現錯誤 -- 這些資料行目前沒有唯一的值。

    這是我自行產生的DATASET寫法:
    for (int i = 0; i < allData.Rows.Count; i++)
    {
    dr = dt.NewRow();
    dr["Id"] = allData.Rows[i]["myID"].ToString();
    dr["ParentId"] = allData.Rows[i]["myParentID"].ToString();
    dr["NText"] = allData.Rows[i]["myID"].ToString();
    dt.Rows.Add();
    }

  • dabbiedance 2012/1/18 下午 09:51 回覆

    # re: [ASP.NET]動態TreeView 結合資料庫產生節點

    有用有推~

    貓大的範例我搞了兩天還搞不定

    您的範例我十分鐘就OK了... @@"

     

  • topcat 2012/1/19 下午 07:59 回覆

    # re: [ASP.NET]動態TreeView 結合資料庫產生節點

    to dabbiedance :

    搞兩天還搞不定??

    是C#的關係嗎?

    還是遞迴

    ^.^a
     

  • 程式新手 2012/2/8 上午 10:00 回覆

    # re: [ASP.NET]動態TreeView 結合資料庫產生節點

    我改寫到 sql server 可是會出現錯誤?? 想問看看 可以看出哪裡有問題嗎?
    "父資料行和子資料行沒有型別相符的資料行 "

    protected void Page_Load(object sender, EventArgs e)
    {
    if (!IsPostBack)
    {
    buildTree();
    }
    }
    private void buildTree()
    {

    SqlConnection dbCon = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
    dbCon.Open();
    SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM [web].[dbo].[SiteMap]", dbCon);
    SqlDataAdapter da = new SqlDataAdapter();
    DataSet ds = new DataSet();
    adapter.Fill(ds);
    ds.Relations.Add("NodeRelation",ds.Tables[0].Columns["Id"], ds.Tables[0].Columns["ParentId"]);

    foreach (DataRow dbRow in ds.Tables[0].Rows)
    {
    if (dbRow.IsNull("ParentId"))
    {
    TreeNode newNode = new TreeNode(dbRow["Ntext"].ToString(), dbRow["Id"].ToString());
    newNode.PopulateOnDemand =true;
    TreeView1.Nodes.Add(newNode);
    PopulateSubTree(dbRow, newNode);

    }
    }
    }
    ///產生子節點
    private void PopulateSubTree(DataRow dbRow, TreeNode node)
    {

    foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation"))
    {
    TreeNode childNode = CreateNode(childRow["Ntext"].ToString(), childRow["Id"].ToString(), true);
    node.ChildNodes.Add(childNode);
    PopulateSubTree(childRow, childNode);
    }
    }

    ///節點屬性設定
    private TreeNode CreateNode(string text, string id, bool expanded)
    {
    TreeNode node = new TreeNode(); ;
    node.Text = text;
    node.Value = id;
    node.Expanded = true;
    return node;
    }
    }



    Web.config

    <add name="ConnectionString"
    connectionString="Data Source=xxx.xxx.xx.xx;Initial Catalog=weberp;Persist Security Info=True;User ID=xx;Password=xx" providerName="System.Data.OleDb"/>



    資料庫內容
    web資料庫 建一個資料表 SiteMap
    SELECT [Id]
    ,[ParentId]
    ,[Ntext]
    FROM [weberp].[dbo].[SiteMap] 欄位結構 如文章一樣


    不知道哪位大大隻到哪裡有問題

  • 程式新手 2012/2/8 上午 10:10 回覆

    # re: [ASP.NET]動態TreeView 結合資料庫產生節點

    資料庫是這個 上面的 有打錯
    看錯資料庫

    資料庫內容
    web資料庫 建一個資料表 SiteMap
    SELECT [Id]
    ,[ParentId]
    ,[Ntext]
    FROM [erp].[dbo].[SiteMap]

  • 程式新手 2012/2/8 上午 10:11 回覆

    # re: [ASP.NET]動態TreeView 結合資料庫產生節點

    資料庫是這個 上面的 有打錯
    看錯資料庫

    資料庫內容
    web資料庫 建一個資料表 SiteMap
    SELECT [Id]
    ,[ParentId]
    ,[Ntext]
    FROM [web].[dbo].[SiteMap]

    刪錯 拍謝

  • billy 2012/11/19 下午 03:58 回覆

    # re: [ASP.NET]動態TreeView 結合資料庫產生節點

    不好意思,請教一個問題.

    我有參考你的方式寫了一個treeview.

    但是我的table資料筆數差不多有2000筆.

    當我在執行時,感覺速度有點慢,

    不曉得有什麼方式可以改善速度的問題呢?

    謝謝!

標題 *
名稱 *
Email (將不會被顯示)
Url
回應
登入後使用進階評論
Please add 1 and 2 and type the answer here: