Thursday, January 16, 2014

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:

 

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

No comments:

Post a Comment