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