郁闷了一天 本来递归是很easy的!!
可是C#中的对象是 引用传递的 实在不明白错误再哪里
贴出代码 
大家可以自己生成一个DataView 
外部调用InitTreeView("0");private void InitTreeView(string orgId)
{
DataView DvOrgTree=new DataView();
DvOrgTree =DTable.Tables[0].DefaultView;
DvOrgTree.RowFilter = "UpOrgID =" + orgId;
foreach(DataRowView drv in DvOrgTree)
{
TreeNode tmpTn=new TreeNode();
tmpTn.ID=drv["OrgId"].ToString();
tmpTn.Text=drv["OrgName"].ToString();
//判断是否存在子节点
InitTreeView(tmpTn.ID);

}
}
问题是当循环到空节点的时候 返回上一级的时候 出问题了!
大家帮看看!!

解决方案 »

  1.   

    我说说我得 思路
    是用DataView 数据筛选 
    这样 用于不是太大得数据集 这样就可以减少访问数据库的次数 一次就可以了
      

  2.   

    给你一份我的吧,你试试:
    private void InitTree(TreeNodeCollection Nds,string parentId)
    {
    DataView dv=new DataView
    TreeNode tmpNd;
    string intId;
    dv.Table=ds.Tables["tree"];
    dv.RowFilter="ParentId='" + parentId + "'";
    foreach(DataRowView drv in dv)
    {
    tmpNd=new TreeNode();
    tmpNd.ID=drv["NodeId"].ToString();
    tmpNd.Text=drv["NodeName"].ToString();
    tmpNd.ImageUrl="images/"+drv["Icon"].ToString();
    rConn=new OracleConnection(cn);
    string strCounts1="select count(*) from bresource where  ParentId="+drv["NodeId"];

    OracleCommand Comm = new OracleCommand(strCounts1, rConn);
    rConn.Open();

    int nCount = Convert.ToInt32(Comm.ExecuteScalar());
    rConn.Close();
    if (nCount==0)
    tmpNd.NavigateUrl=drv["Address"].ToString();
    else
    {
    tmpNd.NavigateUrl=drv["Address"].ToString()+"?id="+drv["NodeId"].ToString();

    }
    Nds.Add(tmpNd);
    intId=drv["ParentId"].ToString();

    InitTree(tmpNd.Nodes,tmpNd.ID);
                  
    }
    }
      

  3.   

    楼上的朋友 谢谢
    我就是不想 每次都走数据库
    才考虑采用DataView
      

  4.   

    首先要把当前节点的id记住,当遇到空节点的时候,返回当前节点的父节点,然后找县一个子节点,这个时候
    id就有用了。
      

  5.   

    谢谢楼上的!
    不过我认为应该没有关系吧
    递归中 每个DataView是过程级的 所以的内存空间 肯定是不一样的!
    但是当执行到空子集中 再返回回去的时候 就发现DataView 居然是空子集的DataView