原来我生成目录树的方法是把表中的数据按某个条件读出来,然后在程序中通过递归生成目录树,如果节点超过1000个,速度会非常慢。最近找到一个好的方法:
假如目录树的表结构如下:
ID ID
父ID PID
节点名称 Text
第一步:查询数据。查询数据时,要使用Oracle自己的递归,语法如下:
SELECT ID,PID,TEXT FROM TABLETREE START WITH ID='0' CONNECT BY PID=PRIOR ID
如果有其它的条件可以在最后加上Where条件,递归的起始条件(Start With)可以有多个用And连接,如:(ID='0' And Text='aaa') 递归的条件也可以是多个,条件之间也用And连接。
用Oracle递归的特点是:查询的结果完全按照树节点从上到下的顺序排列。这样我们可以只遍历一次就能生成目录树了。
第二步:生成树目录。假设查询结构放在名字为table的DataTable里。
TreeNode parentNode = new TreeNode();
DataRow row = table.Rows[0];
TreeNode node = new TreeNode();
node.Tag = row["ID"].ToString();
node.Text = row["Text"].ToString();
_mainTree.Nodes.Add(node);
parentNode = node;
if(table.Rows.Count>0)
{
for(int i=1;i<table.Rows.Count;i++)
{
row = table.Rows[i];
string strPID = row["PID"].ToString();
node = new TreeNode();
node.Tag = row["ID"].ToString();
node.Text = row["Text"].ToString();
while(strPID != parentNode.Tag.ToString())
{
parentNode = parentNode.Parent;
}
parentnode.Nodes.Add(node);
parentnode = node;
}
}