public void builderTree(ModelItem modelItem)
        {
            if (modelItem.Children == null) //没有孩子直接加节点
            {
                TreeNode newnode = new TreeNode(modelItem.DisplayName);  //节点文字
                treeView1.SelectedNode.Nodes.Add(newnode);
            }
            else //有孩子,把它加上然后选中它,开始递归
            {
                TreeNode newnode2 = new TreeNode(modelItem.DisplayName);  //节点名称
                treeView1.SelectedNode.Nodes.Add(newnode2);
                treeView1.SelectedNode = newnode2;  //它有孩子就把它做为当前选中                foreach (var ModelItem2 in modelItem.Children)
                {
                    builderTree(ModelItem2);         //然后递归搞
                }
                //treeView1.SelectedNode = newnode2;                //估计问题在这里,就是递归完了之后 当前选中节点被改变了,不知道如何选回去
                
            }
        }
现在的样子是~~~

解决方案 »

  1.   


     /// <summary>
            /// 递归查询绑定到treeview
            /// </summary>
            /// <param name="prevNode"></param>
            protected void ForEachTree(TreeNode prevNode)
            {
                try
                {
                    DataView dv = getDt().DefaultView;
                    dv.RowFilter = prevNode == null ? "ParentId is null" : "ParentId = '" + prevNode.Value + "'";//根节点
                    foreach (DataRowView item in dv)//循环节点集合
                    {
                        TreeNode tn = new TreeNode();
                        tn.Text = item["FolderName"].ToString(); //存放节点名称
                        tn.Value = item["FolderId"].ToString();//存放节点ID
                        if (prevNode == null)
                        {
                            tn.ImageUrl = "../img/base.gif";
                            tn.Target = "RightFrame";
                            tn.SelectAction = TreeNodeSelectAction.SelectExpand;
                            tn.PopulateOnDemand = true;
                            TreeView1.Nodes.Add(tn);//添加至根节点 
                        }
                        else
                        {
                            tn.ImageUrl = "../img/folder.gif";
                            tn.SelectAction = TreeNodeSelectAction.SelectExpand;
                            prevNode.ChildNodes.Add(tn);//添加至子结点
                        }
                        ForEachTree(tn);
                    }
                }
                catch (Exception ex)
                {
                    NR.Error.Log.LogType(ex.ToString());
                }
            }
            //得到数据列表
            protected DataTable getDt()
            {
                DataTable dt = new DataTable();
                NRBLL.Folder folder = new Asiastar.NRBLL.Folder();
                dt = folder.FN_GetByFolderId().Tables[0];
                return dt;
            }
      

  2.   


    public void builderTree(ModelItem modelItem)
            {
               treeView1.Nodes.Clear();//你错误的地方 没有写这个
               if (modelItem.Children == null) //没有孩子直接加节点
                {
                    TreeNode newnode = new TreeNode(modelItem.DisplayName);  //节点文字
                    treeView1.SelectedNode.Nodes.Add(newnode);
                }
                else //有孩子,把它加上然后选中它,开始递归
                {
                    TreeNode newnode2 = new TreeNode(modelItem.DisplayName);  //节点名称
                    treeView1.SelectedNode.Nodes.Add(newnode2);
                    treeView1.SelectedNode = newnode2;  //它有孩子就把它做为当前选中                foreach (var ModelItem2 in modelItem.Children)
                    {
                        builderTree(ModelItem2);         //然后递归搞
                    }
                    //treeView1.SelectedNode = newnode2;                //估计问题在这里,就是递归完了之后 当前选中节点被改变了,不知道如何选回去
                    
                }
            }
      

  3.   


    不行啊~~提示treeView1.SelectedNode 为空。所以treeView1.SelectedNode.Nodes.Add(newnode);就报错
      

  4.   


    //这是我以前写的你拿去参考下
              this.tvwBookType.Nodes.Clear();
                //创建根节点
                TreeNode node = this.tvwBookType.Nodes.Add("AllBook");            //查询所有的图书类型
                 booktypelist = booktypebll.SelectBookType();//获取数据源
                foreach (BookType type in booktypelist)
                {
                   TreeNode rootnode = node.Nodes.Add(type.BookTypeName);
                    //添加跟节点
                     this.tvwBookType.SelectedNode = node;
                     //鼠标停留在节点上显示的节点的文本值
                     node.ToolTipText = type.Re;
                    rootnode.Tag = type.BookTypeId;
                }
                this.tvwBookType.ExpandAll();
      

  5.   

    自己别编程递归啊!这么山寨的写法很不OO。
    咱当年也山寨过,现在主流啦。当文档微软会告诉你treeview支持的数据源要派生自HierarchicalDataSourceControl, 实现IHierarchicalDataSource接口。
    实现这个接口就得了。
    using System; 
    using System.Data; 
    using System.Web.UI; 
    using System.Collections;namespace ITCOA_CMS.DAL
    {
        /// <summary>
        /// HierarchicalDataSet 一个实现了IHierarchicalDataSource接口的类
        /// </summary>
        public class HierarchicalDataSet : HierarchicalDataSourceControl, IHierarchicalDataSource
        {
            DataSet dataSet;
            string idColumnName;
            string parentIdColumnName;
            /// <summary>
            /// 构造函数 
            /// dataset是放数据的容器 
            /// idColumnName是指定做为主键的数据表列名 
            /// parentIdColumnName是指定下做为外键的 父id 的数据表列名,用来明确结点的父子关系 
            /// </summary>
            /// <param name="dataSet"></param>
            /// <param name="idColumnName"></param>
            /// <param name="parentIdColumnName"></param>
            public HierarchicalDataSet(DataSet dataSet, string idColumnName, string parentIdColumnName)
            {
                this.dataSet = dataSet.Copy();
                this.idColumnName = idColumnName;
                this.parentIdColumnName = parentIdColumnName;
            }        /// <summary>
            /// 从未使用过的事件,由于treeview的数据源更新后,要做的工作太多,不使用此事件了
            /// 有变化就完全重新绑定treeview数据源
            /// </summary>
            public event EventHandler DataSourceChanged;        /// <summary>
            /// 完成 GetHierarchicalView 方法
            /// 实现 对数据源的子结点过滤
            /// </summary>
            /// <param name="viewPath"></param>
            /// <returns></returns>
            protected override HierarchicalDataSourceView GetHierarchicalView(string viewPath)
            {
                return new DataSourceView(this, viewPath);
            }        #region 支持的一些方法
            /// <summary>
            /// 得到父结点
            /// </summary>
            /// <param name="row"></param>
            /// <returns></returns>
            public DataRowView GetParentRow(DataRowView row)
            {
                dataSet.Tables[0].DefaultView.RowFilter = String.Format("{0} = {1}", idColumnName, row[parentIdColumnName].ToString());
                DataRowView parentRow = dataSet.Tables[0].DefaultView[0];
                //dataSet.Tables[0].DefaultView.RowFilter = "";
                return parentRow;
            }        /// <summary>
            /// 得到某子结点的viewPath
            /// </summary>
            /// <param name="viewPath"></param>
            /// <param name="row"></param>
            /// <returns></returns>
            string GetChildrenViewPath(string viewPath, DataRowView row)
            {
                return viewPath + "\\" + row[idColumnName].ToString();
            }        /// <summary>
            /// 是否有子结点
            /// </summary>
            /// <param name="row"></param>
            /// <returns></returns>
            bool HasChildren(DataRowView row)
            {
                dataSet.Tables[0].DefaultView.RowFilter = String.Format("{0} = '{1}'", parentIdColumnName, row[idColumnName]);
                bool hasChildren = dataSet.Tables[0].DefaultView.Count > 0;
                //dataSet.Tables[0].DefaultView.RowFilter = "";
                return hasChildren;
            }        /// <summary>
            /// 得到父结点的viewPath
            /// </summary>
            /// <param name="viewPath"></param>
            /// <returns></returns>
            string GetParentViewPath(string viewPath)
            {
                return viewPath.Substring(0, viewPath.LastIndexOf("\\"));
            }
            #endregion        #region 私有类,实现进一步的接口
            /// <summary>
            /// 实现一个HierarchicalDataSet 类中的 GetHierarchicalView 方法要求的 HierarchicalDataSourceView 类的实现
            /// </summary>
            class DataSourceView : HierarchicalDataSourceView
            {
                HierarchicalDataSet hDataSet;
                string viewPath;            /// <summary>
                /// 生成一个DataSourceView
                /// </summary>
                /// <param name="hDataSet"></param>
                /// <param name="viewPath"></param>
                public DataSourceView(HierarchicalDataSet hDataSet, string viewPath)
                {
                    this.hDataSet = new HierarchicalDataSet(hDataSet.dataSet, hDataSet.idColumnName, hDataSet.parentIdColumnName);
                    this.viewPath = viewPath;
                }            /// <summary>
                /// 完成HierarchicalDataSourceView 类的 Select方法
                /// </summary>
                /// <returns></returns>
                public override IHierarchicalEnumerable Select()
                {
                    return new HierarchicalEnumerable(hDataSet, viewPath);
                }
            }        /// <summary>
            /// 实现 HierarchicalDataSourceView 类中派生出的类 DataSourceView 中必须要满足的 Select 方法的返回值接口IHierarchicalEnumerable
            /// 也就是迭代的方法要在这里实现
            /// </summary>
            class HierarchicalEnumerable : IHierarchicalEnumerable
            {
                /// <summary>
                /// 传入的HierarchicalDataSet
                /// </summary>
                HierarchicalDataSet hDataSet;
                /// <summary>
                /// 传入的viewPath
                /// </summary>
                string viewPath;            /// <summary>
                /// 生成一个HierarchicalEnumerable
                /// </summary>
                /// <param name="hDataSet"></param>
                /// <param name="viewPath"></param>
                public HierarchicalEnumerable(HierarchicalDataSet hDataSet, string viewPath)
                {
                    this.hDataSet = new HierarchicalDataSet(hDataSet.dataSet, hDataSet.idColumnName, hDataSet.parentIdColumnName);
                    this.viewPath = viewPath;
                }            public IHierarchyData GetHierarchyData(object enumeratedItem)
                {
                    DataRowView row = (DataRowView)enumeratedItem;
                    return new HierarchyData(hDataSet, viewPath, row);
                }            /// <summary>
                /// 对数据源做过滤
                /// 实现迭代
                /// </summary>
                /// <returns></returns>
                public IEnumerator GetEnumerator()
                {
                    if (viewPath == "")
                        hDataSet.dataSet.Tables[0].DefaultView.RowFilter = String.Format("{0} is null", hDataSet.parentIdColumnName);
                    else
                    {
                        string lastID = viewPath.Substring(viewPath.LastIndexOf("\\") + 1);
                        hDataSet.dataSet.Tables[0].DefaultView.RowFilter = String.Format("{0} = '{1}'", hDataSet.parentIdColumnName, lastID);
                    }                IEnumerator i = hDataSet.dataSet.Tables[0].DefaultView.GetEnumerator();
                    //hDataSet.dataSet.Tables[0].DefaultView.RowFilter = "";
                    return i;
                }
            }        /// <summary>
            /// 实现IHierarchyData接口的HierarchyData类
            /// 一个结点
            /// 对于数据库来说
            /// 相当于一个纪录集中的行
            /// </summary>
            class HierarchyData : IHierarchyData
            {
                HierarchicalDataSet hDataSet;
                DataRowView row;
                string viewPath;            public HierarchyData(HierarchicalDataSet hDataSet, string viewPath, DataRowView row)
                {
                    this.hDataSet = new HierarchicalDataSet(hDataSet.dataSet, hDataSet.idColumnName, hDataSet.parentIdColumnName);
                    this.viewPath = viewPath;
                    this.row = row;
                }            /// <summary>
                /// 得到某行(结点)的所有子结点的迭代集
                /// </summary>
                /// <returns></returns>
                public IHierarchicalEnumerable GetChildren()
                {
                    return new HierarchicalEnumerable(hDataSet, hDataSet.GetChildrenViewPath(viewPath, row));
                }            /// <summary>
                /// 得到父结点
                /// </summary>
                /// <returns></returns>
                public IHierarchyData GetParent()
                {
                    return new HierarchyData(hDataSet, hDataSet.GetParentViewPath(viewPath), hDataSet.GetParentRow(row));
                }            /// <summary>
                /// 当前结点是否有孩子
                /// </summary>
                public bool HasChildren
                {
                    get
                    {
                        return hDataSet.HasChildren(row);
                    }
                }            /// <summary>
                /// 对成员的包装
                /// </summary>
                public object Item
                {
                    get
                    {
                        return row;
                    }
                }            public string Path
                {
                    get
                    {
                        return viewPath;
                    }
                }            public string Type
                {
                    get
                    {
                        return typeof(DataRowView).ToString();
                    }
                }
            }
            #endregion
        }
    }
      

  6.   

    用时很简单啦  
                  DataSet theAllAClass = 得到的树状表;
                DAL.HierarchicalDataSet dataSource = new DAL.HierarchicalDataSet(theAllAClass,"ID", "PARENT_ID"); 
                this.TreeView1.DataSource = dataSource;
                this.TreeView1.DataBind();
     
      

  7.   

    动态加载吗 可以这样
    SqlConnection Conn = new SqlConnection(connectionString);
                string sql = "select * from DeviceInfoSheet where ID='" + Class1.ID + "'";
                SqlCommand Comm = new SqlCommand(sql, Conn);
                SqlDataAdapter sda = new SqlDataAdapter(Comm);
                DataTable dt = new DataTable();
                sda.Fill(dt);            List<string> root = new List<string>();// 不重复的根节点集合
                foreach (DataRow row in dt.Rows)
                {
                    string sTemp = row["DeviceAddress"].ToString();
                    if (!root.Contains(sTemp))
                    {
                        root.Add(sTemp);
                    }
                }            foreach (string sTemp in root)
                {
                    treeView1.Nodes.Add(sTemp, sTemp);
                    DataRow[] rows = dt.Select("DeviceAddress = '" + sTemp + "'");
                    foreach (DataRow row in rows)
                    {
                        treeView1.Nodes[sTemp].Nodes.Add(row[2].ToString());//添加子节点
                    }
                }
    根据登录用户的ID动态加载
      

  8.   


            /// <summary>
            /// 递归方法构建树形
            /// </summary>
            /// <param name="nono"></param>
            /// <returns></returns>
            public TreeNode CreateNodes(TreeNode nono)
            {
                //表示根节点
                if (string.IsNullOrEmpty(nono.Text))
                {
                    List<NodeClass> tmplist = (from b in nodes
                                               select b).OrderBy(b => b.ParentID).ToList<NodeClass>();                nono.Text = tmplist[0].ID.ToString();                CreateNodes(nono);
                }
                else
                {
                    List<NodeClass> list = (from a in nodes
                                            where a.ParentID.ToString() == nono.Text
                                            select a).ToList<NodeClass>();                foreach (var item in list)
                    {
                        if (item.ParentID == 0)
                        {
                            continue;
                        }                    TreeNode node = new TreeNode();
                        node.Text = item.ID.ToString();
                        nono.Nodes.Add(node);                    List<NodeClass> a = (from b in nodes
                                             where b.ParentID.ToString() == node.Text
                                             select b).ToList<NodeClass>();                    //如果还有子集则继续构建树形
                        if (a.Count > 0)
                        {
                            CreateNodes(node);
                        }
                    }
                }            return nono;
            }    }
    我写的,你可以参考
      

  9.   

    public void builderTree(ModelItem modelItem, TreeNode rootNode)
    {
        if(modeItem == null) return;
        var node = new TreeNode(modelItem.DisplayName);
        rootNode.Nodes.Add(node);
        if (modelItem.Children != null) //没有孩子直接加节点
        {
             foreach (var ModelItem2 in modelItem.Children)
             {
                  builderTree(ModelItem2,node);         //然后递归搞
             }    
        }
    }
      

  10.   

    调用的时候,
    TreeNode root = new TreeNode("根结点");
    builderTree(modelItem, root);