PDA

View Full Version : [C#] Tạo cây phân cấp nhưng không giới hạn về số cấp



TuấnDương
17-03-2011, 09:49 AM
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);
}
}
}