我想用一个treeview显示一个树形结构,数据是动态绑定的,     
结点的结构是0--根结点,00--0的子结点,01--0的子结点,001--00的子结点,如下所示     
|-0     
|--00     
|----001     
问题是只能生成到2层的结点,第3层的结点不能生成,如果用递归调用的话就有错误(集合已修改;可能无法执行枚举操作。 ),我觉得问题的关键是我不知道如何获得该treeview的所有结点集合.请各位高手指教!用其他的方法(如用xml等做)也行,麻烦写点示例代码.     
代码如下:     
public void bindTreeNode(DataSet tempds,TreeNodeCollection mynodes)     
        {                
            ArrayList org=new ArrayList();     
            for (int i = 0; i < tempds.Tables["tb"].Rows.Count; i++)     
            {     
                org.Add(new OrgNode(tempds.Tables["tb"].Rows["Org_num"].ToString(), tempds.Tables["tb"].Rows["Org_Name"].ToString()));     
            }     
            foreach(OrgNode tempNode in org)     
            {     
                if(tempNode.ID=="0")     
                    trvOrg.Nodes.Add(tempNode);     
                foreach (OrgNode tn in mynodes)///如果用递归则出问题在这里(集合已修改;可能无法执行枚举操作。 )             {     
                    if ((tempNode.ID.Length - tn.ID.Length) == 1)     
                    {     
                        if (tn.ID == tempNode.ID.Substring(0, tn.ID.Length))     
                            tn.ChildNodes.Add(tempNode);     
                        //bindTreeNode(tempds,tn.ChildNodes);///递归调用///?????????????????????????????????                   }     
                }                    
            }     
        }
注:OrgNode是TreeNode的子类

解决方案 »

  1.   

     public void InitNavigationTree(TreeNodeCollection tncCurrent, string sParentID)
        {
            DataView dvw = new DataView();
            TreeNode nodTemp;        string strTxt = "SELECT * FROM table WHERE ParentNum='" + sParentID + "' ";
            DataSet ds = sqldata.GetDS(strTxt);
            dvw.Table = ds.Tables[0];
            foreach (DataRowView drv in dvw)
            {
                nodTemp = new TreeNode();
                nodTemp.Value = drv["ID"].ToString();
                nodTemp.Text = drv["Name"].ToString();
                nodTemp.ToolTip = drv["XZQH"].ToString();
                tncCurrent.Add(nodTemp);
                InitNavigationTree(nodTemp.ChildNodes, nodTemp.Value);
            }    }
      

  2.   

            for (int i = 0; i < tempds.Tables["tb"].Rows.Count; i++)
            {
                Node newNode = new Node();
                newNode.Tag = Convert.ToString(dsWorkName.Tables["tb"].Rows[i]["Org_num"]);
                newNode.Text = Convert.ToString(dsWorkName.Tables["tb"].Rows[i]["Org_Name"]);            Node node = utreeTask.Find(newNode.Tag.ToString().Substring(newNode.Tag.ToString().Length-1));
                if (node !=null)
                {
                    node.Nodes.Add(newNode);
                }
                else
                {
                    org.Nodes.Add(newNode);
                }
            }
            org.ExpandAll();
      

  3.   

    楼上的高手,这是我按照你的代码修改后的代码.运行的结果是把所有的三级结点也加为2层结点了.不知道我有没有理解错误tempds = dboper.getBinding(sql, "tb");
                for (int i = 0; i < tempds.Tables["tb"].Rows.Count; i++)
                {
                    TreeNode newNode = new TreeNode();
                    newNode.Value = Convert.ToString(tempds.Tables["tb"].Rows[i]["Org_num"]);
                    newNode.Text = Convert.ToString(tempds.Tables["tb"].Rows[i]["Org_Name"]);                TreeNode node = trvOrg.FindNode(newNode.Value.ToString().Substring(newNode.Value.ToString().Length - 1));
                    if (node != null)
                    {
                        node.ChildNodes.Add(newNode);
                    }
                    else
                    {
                        trvOrg.Nodes.Add(newNode);
                    }
                }
                trvOrg.ExpandAll();
      

  4.   

    tempds   =   dboper.getBinding(sql,   "tb"); 
                            for   (int   i   =   0;   i   <   tempds.Tables["tb"].Rows.Count;   i++) 
                            { 
                                    TreeNode   newNode   =   new   TreeNode(); 
                                    newNode.Value   =   Convert.ToString(tempds.Tables["tb"].Rows[i]["Org_num"]); 
                                    newNode.Text   =   Convert.ToString(tempds.Tables["tb"].Rows[i]["Org_Name"]);                                 TreeNode   node   =   trvOrg.FindNode(newNode.Value.ToString().Substring(0,newNode.Value.ToString().Length   -   1)); 
                                    if   (node   !=   null) 
                                    { 
                                            node.ChildNodes.Add(newNode); 
                                    } 
                                    else 
                                    { 
                                            trvOrg.Nodes.Add(newNode); 
                                    } 
                            } 
                            trvOrg.ExpandAll();
      

  5.   

    不好意思,把Substring的參數寫漏了一個
      

  6.   

    保证N级
      
      private void dispTree(int id)
        {
            string sql = "select * from _IB";
            DataSet dt = DAL.DbHelperSQL.Query(sql);
            ArrayList arr = new ArrayList();
            TreeNode[] nodes=new TreeNode[dt.Tables[0].Rows.Count];
            for (int i = 0; i < dt.Tables[0].Rows.Count; i++)
            {
                arr.Add(dt.Tables[0].Rows[i]["IB_ID"].ToString());
                nodes[i] = new TreeNode();
                nodes[i].Text = dt.Tables[0].Rows[i]["IB_Name"].ToString();
                if (dt.Tables[0].Rows[i]["IB_class"].ToString() != "0")
                {
                    int fartherid = arr.LastIndexOf(dt.Tables[0].Rows[i]["IB_class"].ToString());
                    nodes[fartherid].ChildNodes.Add(nodes[i]);
                }
                else
                {
                    TreeView1.Nodes.Add(nodes[i]);
                }
            }
        }
      

  7.   

    非常感谢各位高手,特别是nj_1st_excellence,用你的方法已经解决了