地区在数据库中是用递归存储的,如下id pid name
1 0 中国
2 1 北京
3 1 上海
4 2 XXX区想用TreeView显示如下:-中国
----北京
--------XXX区
----上海我已经在数据库用函数返回了如下的数据集,而且不用TreeView,可通过前面加空格形成一个‘假树’,但如果用TreeView怎么实现呢?id pid name degree
1 0 中国 01
2 1 北京 0102
3 1 上海 0103
4 2 XXX区 0204我的想法是通过 degree 字段来得知该结点是哪个结点的子结点,如:北京 0102 可通01得知他的上级为中国,而XXX区的上级为北京。
怎么样写该算法?
我写了半天没写出来,特来求助!
1 0 中国
2 1 北京
3 1 上海
4 2 XXX区想用TreeView显示如下:-中国
----北京
--------XXX区
----上海我已经在数据库用函数返回了如下的数据集,而且不用TreeView,可通过前面加空格形成一个‘假树’,但如果用TreeView怎么实现呢?id pid name degree
1 0 中国 01
2 1 北京 0102
3 1 上海 0103
4 2 XXX区 0204我的想法是通过 degree 字段来得知该结点是哪个结点的子结点,如:北京 0102 可通01得知他的上级为中国,而XXX区的上级为北京。
怎么样写该算法?
我写了半天没写出来,特来求助!
int i;
TreeNode GetParent(TreeNode tnParent,int id)
{
if ((int)tnParent.Tag == id)
{
return tnParent;
}
int i;
TreeNode tn;
for (i = 0 ; i < tnParent.Nodes.Count; ++i)
{
tn = GetParent(tnParent.Nodes[i],id);
if (null != tn)
{
return tn;
}
}
return null;
}
//分别将数据整理为多级后,逐级调用该方法。
void AddData(TreeView tv,DataSet ds)
{
int i,j;
TreeNode tn,tnChild;
for (i = 0 ; i < ds.Tables[0].Rows.Count; ++i)
{
for (j = 0 ; j < tv.Nodes.Count; ++j)
{
tn = GetParent(tv.Nodes[j],ds.Table[0].Rows[i]["parentid"]);
if (tn ! =null)
{
tnChild = tn.Nodes.Add(ds.Tables[0].Rows[i]["name"].ToString());
tnChild.Tag = tn.Nodes.Add(ds.Tables[0].Rows[i]["id"];
continue;
}
}
}
}
{
DataView dvTree = new DataView(ds.Tables[0]);
dvTree.RowFilter = "[ParentID] = " + ParentID;
foreach(DataRowView Row in dvTree)
{
if(pNode == null)
{
TreeNode Node = treeView1.Nodes.Add(Row["ProjectName"].ToString());
AddTree(Int32.Parse(Row["ProjectID"].ToString()),Node);
}
else
{
TreeNode Node = pNode.Nodes.Add(Row["ProjectName"].ToString());
AddTree(Int32.Parse(Row["ProjectID"].ToString()),Node);
}
}
}
//过滤ParentID,得到当前的所有子节点
myDataView.RowFilter = "[Parent_NO] = " + Parent_NO;
foreach(DataRowView Row in myDataView)
{ if(pNode == null)
{ //添加根节点
TreeNode Node = treeView1.Nodes.Add(Row["Unit_Name"].ToString().Trim());
Node.Tag = Row["Unit_ID"].ToString().Trim();
AddTree(Int32.Parse(Row["Unit_NO"].ToString()),Node); //再次递归
}
else
{ //添加当前节点的子节点
TreeNode Node = pNode.Nodes.Add(Row["Unit_Name"].ToString().Trim());
Node.Tag = Row["Unit_ID"].ToString().Trim();
AddTree(Int32.Parse(Row["Unit_NO"].ToString()),Node); //再次递归
}
}
1 中国 0 1
2 北京 1 2
3 上海 1 3
4 XXX区 2 null(没有下级)这种方式好管理!
递归函数即可!无级别限制.public void BuildTree(string ParentID,TreeNode td)
{
TreeNode tempNode=null;
string selectString=null;
string tabString=null;
string textString=null;
string ChildIdString=null; selectString="PARENTID='"+ParentID+"'";
DataRow[] dataRows=treeDataSet.Tables[0].Select(selectString); foreach(DataRow dr in dataRows)
{
tempNode=new TreeNode();
tabString=dr["BK_C_BM"].ToString();
textString=dr["BK_C_MC"].ToString();
ChildIdString=dr["CHILDID"].ToString();
tempNode.Tag=tabString;
tempNode.Text=textString;
tempNode.ImageIndex=1;
tempNode.SelectedImageIndex=2;
td.Nodes.Add(tempNode);
BuildTree(ChildIdString,tempNode); }
}
调用的时候传递"0"参数,把"中国"加进去,然后递归调用,用
ChildIdString=dr["CHILDID"].ToString();取得当前记录的子记录,去递归.如中国的childid='1',找到上海和北京....以此类推...
你那种数据库存储方式,在数据库设计的角度来说不是一种好的方法。
用递归表存储是最好的!(纯属讨论)
1 0 中国 01
2 1 北京 0102
3 1 上海 0103
4 2 XXX区 0204其中degree字段是我通过自编的一个数据库函数计算出来的,用处就是前台程序能过过该字段的结构来动态地生成一颗树形结构。
楼上各位都是直接编程生成树的,而我想通过degree来生成树该怎么做呀?
int PreIDLength=0;
TreeNode PreNode=new TreeNode();
dataTable1.DefaultView.Sort="degree";
treeView1.Nodes.Add(PreNode);
for(int i=0;i<dataTable1.Rows.Count;i++)
{
TreeNode trnAdd=new TreeNode();
trnAdd.Text=dataTable1.DefaultView[i]["name"].ToString().Trim();
int IDLength=dataTable1.DefaultView[i]["degree"].ToString().Trim().Length;
for(int j=0;j<=(PreIDLength-IDLength)/2;j++)
{
PreNode=PreNode.Parent;
}
PreNode.Nodes.Add(trnAdd);
PreIDLength=dataTable1.DefaultView[i]["degree"].ToString().Trim().Length;
PreNode=trnAdd;
}