Đang nạp dữ liệu ...
CMS - MENU
HỌC TẬP

Sửa thông tin bài viết Tạo cây phân cấp nhưng không giới hạn về số cấp

17 Tháng Mười Hai 2008 - Ngô Thanh Tùng
Lượt xem: 8.427     Phản hồi: 6

Theo yêu cầu của bạn ngainamtuocngheo@yahoo.com:
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:

 


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

        }

    }

}

 

Download SourceCode



BÌNH LUẬN:
Copyright © by ASP.NET VIETNAM
Contact us: ngothanhtung.it@gmail.com