Cấp bậc tác giả:

DOTNET

Tạo cây phân cấp nhưng không giới hạn về số cấp

Được viết bởi QuangIT ngày 17/06/2012 lúc 10:22 PM
Giờ tôi muốn hỏi cách làm thế nào để đưa dữ liệu trên về dạng
  • 0
  • 1506
Tải tệp tin: Click ở đây

Tạo cây phân cấp nhưng không giới hạn về số cấp


 Tôi có 1 bảng như sau:
ID | Name | ParentID 
1 | A | 0
2 | B | 0
3 | A1 | 1
4 | A11 | 3
5 | B1 | 2
6 | B2 | 2
và số cấp dc lặp không hạn chế!

Giờ tôi muốn hỏi cách làm thế nào để đưa dữ liệu trên về dạng:
A
- A1
- - A11
B
- B1
- B2
Trả lời:
Tôi tạo 1 TreeView (có tên là TreeView1) trong Winform, sau đó khởi tạo 1 DataTable để chứa dữ liệu mẫu.
Mời bạn xem qua đoạn code sau:

Viết trên Winform
using System;
 using System.Data;
 using System.Windows.Forms;
 using System.Collections;

 namespace TreeExample
 {
     public partial class Form1 : Form
     {
         public Form1()
         {
             InitializeComponent();
         }

         private readonly ArrayList totalNodes = new ArrayList();
         private void GetNodes(TreeNode node)
         {
             if (node.Nodes.Count > 0)
             {
                 foreach (TreeNode childNode in node.Nodes)
                 {
                     AddNode(node);
                     GetNodes(childNode);
                 }
             }
             else
             {
                 AddNode(node);
             }
         }

         private void GetTreeNodes(TreeView treeView)
         {
             this.totalNodes.Clear();
             foreach (TreeNode node in treeView.Nodes)
             {
                 GetNodes(node);
             }
         }

         private void AddNode(TreeNode node)
         {
             bool isExist = false;
             foreach (TreeNode treeNode in this.totalNodes)
             {
                 if (treeNode.Tag.ToString() == node.Tag.ToString())
                 {
                     isExist = true;
                     break;
                 }
             }
             if (isExist == false)
             {
                 this.totalNodes.Add(node);
             }
         }

         public void PopulateTreeView(DataTable dt, ref TreeView treeView)
         {
             DataRowCollection list = dt.Rows;
             ArrayList L = new ArrayList();
             ArrayList L1 = new ArrayList();
             ArrayList L2 = new ArrayList();

             foreach (DataRow r in list)
             {
                 L.Add(r);
                 L1.Add(r);
             }

             foreach (DataRow r in L)
             {
                 if (Convert.ToInt32(r["ParentID"]) == 0)
                 {
                     L2.Add(r);
                     TreeNode node1 = new TreeNode();
                     node1.Text = r["Title"].ToString();
                     node1.Tag = r["ID"].ToString();

                     treeView.Nodes.Add(node1);
                     L1.Remove(r);
                 }
             }
         Begin:
             while (L1.Count > 0)
             {
                 foreach (DataRow r2 in L2)
                 {
                     foreach (DataRow r1 in L1)
                     {
                         if (Convert.ToInt32(r1["ParentID"]) == Convert.ToInt32(r2["ID"]))
                         {
                             GetTreeNodes(treeView);
                             foreach (TreeNode node in totalNodes)
                             {
                                 if (node.Tag.ToString() == r1["ParentID"].ToString())
                                 {
                                     TreeNode node2 = new TreeNode();
                                     node2.Text = r1["Title"].ToString();
                                     node2.Tag = r1["ID"].ToString();
                                     node.Nodes.Add(node2);
                                 }
                             }
                             L2.Add(r1);
                             L1.Remove(r1);
                             goto Begin;
                         }
                     }
                 }
             }
         }


         private void Form1_Load(object sender, EventArgs e)
         {
             // Khởi tạo DataTable (hoặc có thể lấy từ database).
             DataTable dt = new DataTable();
             dt.Columns.Add("ID"typeof(int));
             dt.Columns.Add("Title"typeof(string));
             dt.Columns.Add("ParentID"typeof(int));

             DataRow row = dt.NewRow();
             row["ID"] = 1;
             row["Title"] = "Trang chủ";
             row["ParentID"] = 0;
             dt.Rows.Add(row);
             // 
             row = dt.NewRow();
             row["ID"] = 12;
             row["Title"] = "Quản trị";
             row["ParentID"] = 0;
             dt.Rows.Add(row);
             //
             row = dt.NewRow();
             row["ID"] = 3;
             row["Title"] = "Quản trị nội dung";
             row["ParentID"] = 12;
             dt.Rows.Add(row);
             //
             row = dt.NewRow();
             row["ID"] = 9;
             row["Title"] = "Thư viện";
             row["ParentID"] = 0;
             dt.Rows.Add(row);
             //
             row = dt.NewRow();
             row["ID"] = 65;
             row["Title"] = "Download";
             row["ParentID"] = 9;
             dt.Rows.Add(row);
             //
             row = dt.NewRow();
             row["ID"] = 40;
             row["Title"] = "Quản trị văn bản";
             row["ParentID"] = 3;
             dt.Rows.Add(row);
             //
             row = dt.NewRow();
             row["ID"] = 400;
             row["Title"] = "Quản trị tài chính";
             row["ParentID"] = 12;
             dt.Rows.Add(row);

             PopulateTreeView(dt, ref treeView1);
         }
     }
 }
 

Viết trên Webform

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Khởi tạo DataTable (hoặc có thể lấy từ database).

            DataTable dt = new DataTable();

            dt.Columns.Add("ID", typeof(int));

            dt.Columns.Add("Title", typeof(string));

            dt.Columns.Add("ParentID", typeof(int));



            DataRow row = dt.NewRow();

            row["ID"] = 1;

            row["Title"] = "Trang chủ";

            row["ParentID"] = 0;

            dt.Rows.Add(row);

            //

            row = dt.NewRow();

            row["ID"] = 12;

            row["Title"] = "Quản trị";

            row["ParentID"] = 0;

            dt.Rows.Add(row);

            //

            row = dt.NewRow();

            row["ID"] = 3;

            row["Title"] = "Quản trị nội dung";

            row["ParentID"] = 12;

            dt.Rows.Add(row);

            //

            row = dt.NewRow();

            row["ID"] = 9;

            row["Title"] = "Thư viện";

            row["ParentID"] = 0;

            dt.Rows.Add(row);

            //

            row = dt.NewRow();

            row["ID"] = 65;

            row["Title"] = "Download";

            row["ParentID"] = 9;

            dt.Rows.Add(row);

            //

            row = dt.NewRow();

            row["ID"] = 40;

            row["Title"] = "Quản trị văn bản";

            row["ParentID"] = 3;

            dt.Rows.Add(row);

            //

            row = dt.NewRow();

            row["ID"] = 400;

            row["Title"] = "Quản trị tài chính";

            row["ParentID"] = 12;

            dt.Rows.Add(row);



            PopulateTreeView(dt, ref TreeView1);

        }

    private readonly ArrayList totalNodes = new ArrayList();

    private void GetNodes(TreeNode node)
    {

        if (node.ChildNodes.Count > 0)
        {

            foreach (TreeNode childNode in node.ChildNodes)
            {

                AddNode(node);

                GetNodes(childNode);

            }

        }

        else
        {

            AddNode(node);

        }

    }



    private void GetTreeNodes(TreeView treeView)
    {

        this.totalNodes.Clear();

        foreach (TreeNode node in treeView.Nodes)
        {

            GetNodes(node);

        }

    }



    private void AddNode(TreeNode node)
    {

        bool isExist = false;

        foreach (TreeNode treeNode in this.totalNodes)
        {

            if (treeNode.Target.ToString() == node.Target.ToString())
            {

                isExist = true;

                break;

            }

        }

        if (isExist == false)
        {

            this.totalNodes.Add(node);

        }

    }



    public void PopulateTreeView(DataTable dt, ref TreeView treeView)
    {

        DataRowCollection list = dt.Rows;

        ArrayList L = new ArrayList();

        ArrayList L1 = new ArrayList();

        ArrayList L2 = new ArrayList();



        foreach (DataRow r in list)
        {

            L.Add(r);

            L1.Add(r);

        }



        foreach (DataRow r in L)
        {

            if (Convert.ToInt32(r["ParentID"]) == 0)
            {

                L2.Add(r);

                TreeNode node1 = new TreeNode();

                node1.Text = r["Title"].ToString();

                node1.Target = r["ID"].ToString();



                treeView.Nodes.Add(node1);

                L1.Remove(r);

            }

        }

    Begin:

        while (L1.Count > 0)
        {

            foreach (DataRow r2 in L2)
            {

                foreach (DataRow r1 in L1)
                {

                    if (Convert.ToInt32(r1["ParentID"]) == Convert.ToInt32(r2["ID"]))
                    {

                        GetTreeNodes(treeView);

                        foreach (TreeNode node in totalNodes)
                        {

                            if (node.Target.ToString() == r1["ParentID"].ToString())
                            {

                                TreeNode node2 = new TreeNode();

                                node2.Text = r1["Title"].ToString();

                                node2.Target = r1["ID"].ToString();

                                node.ChildNodes.Add(node2);

                            }

                        }

                        L2.Add(r1);

                        L1.Remove(r1);

                        goto Begin;

                    }

                }

            }

        }

    }

}



Nguồn bài viết: Sưu tầm

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML