数据库有一个表:
create table T_AREA (
   ID                   char(32)             not null,
   CODE                 varchar(50)          null,
   NAME                 varchar(50)          null,
   PARENT_CODE          varchar(50)          null,
   USER_COUNT           int                  null,
   INFO                 varchar(200)         null,
   constraint PK_T_AREA primary key (ID)
)这是一个区域表,其中父区域可以无限扩展子区域,即在表中每一个区域都存在一个父区域编码。问题是:在treeview中如何快速实现数据的展示?并且每一条记录都能绑定在一个treenode.tag中?求高手指点....

解决方案 »

  1.   

    建议建立一个继承自TreeNode的类:AreaNodepublic class AreaNode
    {
        public string ID;
        public string CODE;
        public string NAME;
        ...
    }将该表取出的数据转换成List<AreaNode> areaList;然后维护一个整理后的数据:List<AreaNode> arrangedNode;遍历所有AreaNode:
      如果当前currentNode的父亲不在arrangedNode里,则arrangedNode.Add(currentNode),然后检查arrangedNode的已有节点中是否存在为currentNode的儿子节点的情况,如果存在:currentNode.Nodes.Add(childrenNode);
      如果当前currentNode的父亲在arrangedNode里,则在arrangedNode找到其父亲节点parentNode,然后parentNode.Nodes.Add(currentNode);然后:
    treeView.Nodes.Add(arrangedNode);
      

  2.   

    如上的做法,支持任意多层的树形数据绑定到treeview
      

  3.   

    更正一下:treeView.Nodes.Add(arrangedNode);  -> treeView.Nodes.Add(arrangedNode[0]); (当然也可以加个个数非0判断)
      

  4.   

    就是把每一条树形数据转换为一个TreeNode对象,然后利用TreeNode的层次结构,在代码层来手动的采用递归思路来分层,数据分层好后,然后再将结果直接赋给treeview的Nodes属性。
      

  5.   

    首先要从数据库中获取所有没有父区域编码的编码来做为整个treeView的根节点,然后用递归为
    每个根节点遍历它的子区域编码
    private void AddTreeNode(TreeNode node)
    {
        treeView1.Nodes.Add(node);
        //查找数据库该节点是否还有子节点
         //如果有获取所有的子编码
         for(//) //对子编码作一个循环
         {
            AddTreeNode(子节点)
         }
    }
    大致思路就是这样
      

  6.   

    public class AreaNode:TreeNode
        {
            private string id;
            private string code;
            private string name;
            private string parentCode;
            private string userCount;
            private string info;
            public string Id
            {
                get { return id; }
                set { id = value; }
            }        public string Code
            {
                get { return code; }
                set { code = value; }
            }        public new string Name
            {
                get { return name; }
                set { name = value; }
            }        public string ParentCode
            {
                get { return parentCode; }
                set { parentCode = value; }
            }        public string UserCount
            {
                get { return userCount; }
                set { userCount = value; }
            }        public string Info
            {
                get { return info; }
                set { info = value; }
            }
        }    public class AreaHelper
        {
            public AreaNode ArrangeAreaNodes(List<AreaNode> areaNodes)
            {
                List<AreaNode> arrangedNodes = new List<AreaNode>();            foreach(AreaNode node in areaNodes)
                {
                    AreaNode parent = getNode(arrangedNodes,node.ParentCode);
                    if(parent != null)
                    {
                        parent.Nodes.Add(node);
                    }
                    else
                    {
                        List<AreaNode> children = getChildrenNode(arrangedNodes, node.Code);
                        foreach(AreaNode child in children)
                        {
                            arrangedNodes.Remove(child);
                            node.Nodes.Add(child);
                        }                    arrangedNodes.Add(node);
                    }
                }            if(arrangedNodes.Count == 0) return null;
                return arrangedNodes[0];
            }        private AreaNode getNode(List<AreaNode> areaNodes,string code)
            {
                foreach(AreaNode node in areaNodes)
                {
                    if(node.Code == code)
                    {
                        return node;
                    }
                }            return null;
            }        private List<AreaNode> getChildrenNode(List<AreaNode> areaNodes, string code)
            {
                List<AreaNode> children = new List<AreaNode>();
                foreach (AreaNode node in areaNodes)
                {
                    if (node.ParentCode == code)
                    {
                        children.Add(node);
                    }
                }            return children;
            }
        }    public class Program
        {
            static void Main()
            {
                TreeView tv = new TreeView();
                List<AreaNode> nodeList = null; // from db            AreaHelper helper = new AreaHelper();
                tv.Nodes.Add(helper.ArrangeAreaNodes(nodeList));
            }
        }
      

  7.   

    private void btnBuild_Click(object sender, EventArgs e)
            {
                this.myRegion = ExecuteSql("SELECT ID, CODE, NAME, PARENT_CODE, USER_COUNT FROM T_AREA");            DateTime dt = DateTime.Now;
                trvXML.Nodes.Clear(); //trvXML为你的Treeview控件名
                TreeNode trvboot = new TreeNode("CHINA");
                trvXML.Nodes.Add(trvboot);            BuildTree("SuperID=0", this.myRegion.Select("SuperID=0")[0], trvboot);    //把SuperID改成你的父级ID,这里的0为最顶点ID值
                trvXML.Nodes[0].Expand();            TimeSpan ts = DateTime.Now - dt;
                string strInfor = string.Format("耗费时间:{0}:{1}:{2}.{3}",
                    ts.Hours.ToString().PadLeft(2,'0'),
                    ts.Minutes.ToString().PadLeft(2, '0'),
                    ts.Seconds.ToString().PadLeft(2, '0'),
                    ts.Milliseconds.ToString().PadLeft(3, '0'));
                Console.WriteLine(strInfor);
                
            }        //使用递归创建 TreeView 
            private void BuildTree(string expression, DataRow drRow, TreeNode lstNode)
            {
                int superCount = this.myRegion.Select(expression).Length;
                if (superCount > 0)
                {
                    foreach (DataRow dr in this.myRegion.Select(expression))
                    {
                        string childExpress = string.Format("SuperID={0}", dr["ID"].ToString()); //把SuperID改成你的父级ID
                        if (this.myRegion.Select(childExpress).Length > 0)
                        {
                            TreeNode sublst = new TreeNode(dr["NAME"].ToString());
                            sublst.Tag = dr;
                            lstNode.Nodes.Add(sublst);
                            BuildTree(childExpress, dr, sublst);
                        }
                        else
                        {
                            BuildTree(childExpress, dr, lstNode);
                        }
                    }
                }
                else
                {
                    TreeNode node = new TreeNode(drRow["NAME"].ToString());
                    node.Tag = drRow;
                    lstNode.Nodes.Add(node);
                }
            } 楼主自行试试, 我使用中国城乡表测试时, 运行时间不超过2秒。
      

  8.   

    获取节点值:
            private void trvXML_AfterSelect(object sender, TreeViewEventArgs e)
            {
                if (e.Node.Tag != null)
                {
                    DataRow dr = e.Node.Tag as DataRow;
                    this.textBox1.Text = dr[0].ToString();
                    this.textBox2.Text = dr[1].ToString();
                    this.textBox3.Text = dr[2].ToString();
                    this.textBox4.Text = dr[3].ToString();
                    this.textBox5.Text = dr[4].ToString();
                    this.textBox6.Text = dr[5].ToString();
                    this.textBox7.Text = e.Node.FullPath;        //显示当前路径
                }
            } 
      

  9.   

    我一般是这样做,tree刚开始的时候只加第一级的所有节点,在点开第一级的节点的时候才添加第二级的节点
    依次类推   在after_expend事件里写的添加每个节点的时候都对应的加一个tag给它,比如说Id,展开时候根据这个取它的子节点
      

  10.   

    非常受用,怎么TreeView没有任何显示?就是光秃秃的,没有Name?
      

  11.   

    楼主,给你个例子看看吧:
        //绑定父节点
    private void initTree()
        {
            DataRow[] drs = dt.Select("ParentID=0", "ID asc");
            for (int i = 0; i < drs.Length; i++)
            {
                TreeNode tn = new TreeNode(drs[i][1].ToString());
                tn.SelectAction = TreeNodeSelectAction.Select;
                tn.Expanded = false;
                this.TreeView1.Nodes.Add(tn);
                LoadTree(tn, Convert.ToInt32(drs[i][0]));
            }
        }
    //绑定子区域
        private void LoadTree(TreeNode tn, int parentid)
        {
            DataRow[] drs = dt.Select("ParentID=" + parentid, "ID asc");
            for (int i = 0; i < drs.Length; i++)
            {
                TreeNode child = new TreeNode(drs[i][1].ToString());
                tn.SelectAction = TreeNodeSelectAction.Select;
                child.Expanded = false;
                tn.ChildNodes.Add(child);
                LoadTree(child, Convert.ToInt32(drs[i][0]));
            }
        }
      

  12.   

    lovvver :按照你的做法,如何看不到treeview的Name显示?tag的绑定?
      

  13.   

    知道了,
    node.Text = node.NAME;
    node.Tag = node;
    arrangedNodes.Add(node);
      

  14.   


    你从数据表中取数,返回List<AreaNode>,在这个处理里面,例如:
    List<AreaNode> areaList = new List<AreaNode>();
    SqlDataReader dataReader = null;
    try
    {
        dataReader = .....;
        while(dataReader.Read())
        {
            AreaNode area = new AreaNode();
            area.Code = dataReader["CODE"].ToString();
            area.Name = dataReader["NAME"].ToString();
            ...        areaList.Add(area);
        }return areaList;
    {
    catch(Exception ex)
    {
        ....
    }
    finally
    {
        if(dataReader != null)
        {
           dataReader.Close();
           dataReader.Dispose();
        }
    }....
      

  15.   

    你也可以给node设置tag:
    area.Tag = dataReader["CODE"].ToString();另外,我直接敲的代码,catch(Exception ex)上面一行的"{"应该为"}"
      

  16.   

      private void BindJG()
        {
            DataSet ds = new DataSet();
            DataTable dtb = ds.Tables[0];
            TreeNode root = new TreeNode();
            root.Value = "0";
            root.Text = "";
            root.ImageUrl = "../images/folder.gif";
            root.Expanded = true;
            this.TreeView1.Nodes.Add(root);
            initTree(dtb, "", root);
            this.TreeView1.ExpandAll();
        }    protected void initTree(DataTable dt, string nFatherid, TreeNode fatherNode)
        {
            DataView dv = new DataView(dt);
           dv.RowFilter = "PARENT_CODE='"+nFatherid+"'";
            foreach (DataRowView Row in dv)
            {
                TreeNode node = new TreeNode();
               if(查询Row["BH"]是否有子项)
                {
                   node.Value = Row["BH"].ToString();
                   node.Text = Row["mc"].ToString();
                   node.NavigateUrl = "";
                   node.ImageUrl = "../images/folder.gif";
                   fatherNode.ChildNodes.Add(node);
                   initTree(dt, Row["BH"].ToString(), node);
                }
                else
                {
                    node.Text = Row["mc"].ToString();
                    node.Value = Row["BH"].ToString();
                    node.ImageUrl = "../images/jg.gif";
                    fatherNode.ChildNodes.Add(node);
               }
            }
        }递归绑定数据。最好用实体类,通过属性判断
      

  17.   

    使用lovvver 的方法,大功告成!!,
    谢谢各位,其他的方法,就免费搜藏了!
    准备结贴!
      

  18.   

    private void btnBuild_Click(object sender, EventArgs e) 
            { 
                this.myRegion = ExecuteSql("SELECT ID, CODE, NAME, PARENT_CODE, USER_COUNT FROM T_AREA");             DateTime dt = DateTime.Now; 
                trvXML.Nodes.Clear(); //trvXML为你的Treeview控件名 
                TreeNode trvboot = new TreeNode("CHINA"); 
                trvXML.Nodes.Add(trvboot);             BuildTree("SuperID=0", this.myRegion.Select("SuperID=0")[0], trvboot);    //把SuperID改成你的父级ID,这里的0为最顶点ID值 
                trvXML.Nodes[0].Expand();             TimeSpan ts = DateTime.Now - dt; 
                string strInfor = string.Format("耗费时间:{0}:{1}:{2}.{3}", 
                    ts.Hours.ToString().PadLeft(2,'0'), 
                    ts.Minutes.ToString().PadLeft(2, '0'), 
                    ts.Seconds.ToString().PadLeft(2, '0'), 
                    ts.Milliseconds.ToString().PadLeft(3, '0')); 
                Console.WriteLine(strInfor); 
                
            }         //使用递归创建 TreeView 
            private void BuildTree(string expression, DataRow drRow, TreeNode lstNode) 
            { 
                int superCount = this.myRegion.Select(expression).Length; 
                if (superCount > 0) 
                { 
                    foreach (DataRow dr in this.myRegion.Select(expression)) 
                    { 
                        string childExpress = string.Format("SuperID={0}", dr["ID"].ToString()); //把SuperID改成你的父级ID 
                        if (this.myRegion.Select(childExpress).Length > 0) 
                        { 
                            TreeNode sublst = new TreeNode(dr["NAME"].ToString()); 
                            sublst.Tag = dr; 
                            lstNode.Nodes.Add(sublst); 
                            BuildTree(childExpress, dr, sublst); 
                        } 
                        else 
                        { 
                            BuildTree(childExpress, dr, lstNode); 
                        } 
                    } 
                } 
                else 
                { 
                    TreeNode node = new TreeNode(drRow["NAME"].ToString()); 
                    node.Tag = drRow; 
                    lstNode.Nodes.Add(node); 
                } 
            } 很不错的方法,我就是这么作的实现了商品的无限分类的数据显示
      

  19.   

       //绑定父节点
    private void initTree()
        {
            DataRow[] drs = dt.Select("ParentID=0", "ID asc");
            for (int i = 0; i < drs.Length; i++)
            {
                TreeNode tn = new TreeNode(drs[i][1].ToString());
                tn.SelectAction = TreeNodeSelectAction.Select;
                tn.Expanded = false;
                this.TreeView1.Nodes.Add(tn);
                LoadTree(tn, Convert.ToInt32(drs[i][0]));
            }
        }
    //绑定子区域
        private void LoadTree(TreeNode tn, int parentid)
        {
            DataRow[] drs = dt.Select("ParentID=" + parentid, "ID asc");
            for (int i = 0; i < drs.Length; i++)
            {
                TreeNode child = new TreeNode(drs[i][1].ToString());
                tn.SelectAction = TreeNodeSelectAction.Select;
                child.Expanded = false;
                tn.ChildNodes.Add(child);
                LoadTree(child, Convert.ToInt32(drs[i][0]));
            }
        }
      

  20.   


    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;public partial class Default2 : System.Web.UI.Page
    {
        
        public static string ConnStr;
        protected void Page_Load(object sender, EventArgs e)
        {
            ConnStr = "Data Source=.;Initial Catalog=maoyi;user id=sa;pwd=13579-";// ConfigurationManager.ConnectionStrings["ConnDB"].ConnectionString;
            SqlConnection connection = new SqlConnection(ConnStr);
            connection.Open();
            SqlCommand myCommand = new SqlCommand("select * from my_func", connection);
            SqlDataAdapter da = new SqlDataAdapter(myCommand);
            DataSet ds = new DataSet();
            da.Fill(ds);
            InitTree(TreeView1,ds);
        }
        public bool InitTree(TreeView treeview, DataSet ds)
        {
            treeview.Nodes.Clear();
            ds.Relations.Add("NodeRelation", ds.Tables[0].Columns["FuncId"], ds.Tables[0].Columns["PFuncId"], false);        foreach (DataRow dbRow in ds.Tables[0].Rows)
            {
                if (dbRow["PFuncId"].ToString() == "0" || dbRow.IsNull("PFuncId") || dbRow["PFuncId"].ToString() == "")
                {
                    TreeNode newNode = CreateNode(dbRow["FuncName"].ToString(), dbRow["FuncId"].ToString(), dbRow["URL"].ToString());
                    treeview.Nodes.Add(newNode);
                    SubTree(dbRow, newNode);
                }
            }
            treeview.ExpandAll();
            return true;
            
        }
        private void SubTree(DataRow dbRow, TreeNode node)
        {
            foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation"))
            {
                TreeNode childNode = CreateNode(childRow["FuncName"].ToString(), childRow["FuncId"].ToString(), childRow["URL"].ToString());
                node.ChildNodes.Add(childNode);
                SubTree(childRow, childNode);
            }
        }    private TreeNode CreateNode(string text, string tag, string url)
        {
            TreeNode node = new TreeNode();
            node.Text = text;
            node.Value = tag;
            node.SelectAction = TreeNodeSelectAction.None;
            node.NavigateUrl = url;
            return node;
        }
    }
      

  21.   

    text2是孩子节点,text1是父结点。下同
    System.Windows.Forms下面的treeviewprivate void button1_Click(object sender, EventArgs e)
            {            TreeNode node = new TreeNode();
                node.Text = text2.Text+" Ok";
                node.Name = text2.Text;
                TreeNode dd = find(treeView1, text1.Text);            if (dd != null)
                {
                    dd.Nodes.Add(node);
                }
            }
            private TreeNode find(TreeView v, string s)
            {
                foreach (TreeNode no in v.Nodes)
                {
                    if (no.Name == s)
                        return no;
                    else
                        return can(no, s);            }            return null;
            }
            private TreeNode can(TreeNode no, string s)
            {
                foreach (TreeNode node in no.Nodes)
                {
                    if (node.Name== s)
                        return node;
                    else if (node.Nodes.Count > 0)
                        return can(node, s);
                }
                return null;
            }System.Web.UI.WebControls下的treeview:    protected void Add_Click(object sender, EventArgs e)
        {
            TreeNode node = new TreeNode();
            node.Text = text2.Text+" Ko";
            node.Value = text2.Text;
            TreeNode dd = find(TreeView1, text1.Text);
            if (dd != null)
            {            dd.ChildNodes.Add(node);
            }    }    private TreeNode find(TreeView v, string s)
        {
            foreach (TreeNode no in v.Nodes)
            {
                if (no.Value == s)
                    return no;
                else
                    return can(no, s);        }        return null;
        }
        private TreeNode can(TreeNode no, string s)
        {
            foreach (TreeNode node in no.ChildNodes)
            {
                if (node.Value == s)
                    return node;
                else if (node.ChildNodes.Count > 0)
                    return can(node, s);
            }
            return null;
        }两个程序思路是一样的,在不同的namespace下treeview的封装是不同的。
    用此程序之前treeview已经有一个root node.
      

  22.   

    晕,lovvver 的方法有问题,增加到第四节后就错了,仅仅显示第四级,前面的都没有了!
      

  23.   

    首先应该先分清parent跟 child节点,在node上绑上一个父节点的同时循环子节点上去,以后类似,最好对ID进行人工编号,然后用自查询
      

  24.   

    LZ,爱莫能助o 
    平时没太学SQL
    UP!
      

  25.   

    今天起个早,继续昨天的问题:
    1.有一个方法中提到:
    BuildTree("SuperID=0", this.myRegion.Select("SuperID=0")[0], trvboot);    //把SuperID改成你的父级ID,这里的0为最顶点ID值 这一段是什么意思?具体我的应用怎么改?PARENT_ID =????2.还有:lovvver 的方法有问题,到第四级就出错了,如何改?
      

  26.   

    或者,你也可以通过debug来跟踪一个tree的绑定,看看到底是什么问题。
    但是可以确定的是,思路是不会有问题的。
      

  27.   


     public class AreaHelper
        {
            public T_AREA ArrangeAreaNodes(List<T_AREA> areaNodes)
            {
                List<T_AREA> arrangedNodes = new List<T_AREA>();            foreach (T_AREA node in areaNodes)
                {
                    node.Text = node.NAME;
                    node.Tag = node;
                    T_AREA parent = getNode(arrangedNodes, node.PARENT_ID);
                    if (parent != null)
                    {
                        parent.Nodes.Add(node);
                    }
                    else
                    {
                        List<T_AREA> children = getChildrenNode(arrangedNodes, node.ID);
                        foreach (T_AREA child in children)
                        {
                            arrangedNodes.Remove(child);
                            node.Nodes.Add(child);
                        }
                        arrangedNodes.Add(node);
                    }
                }            if (arrangedNodes.Count == 0) return null;
                return arrangedNodes[0] ;
            }        private T_AREA getNode(List<T_AREA> areaNodes, string id)
            {
                foreach (T_AREA node in areaNodes)
                {
                    if (node.ID == id)
                    {
                        return node;
                    }
                }            return null;
            }        private List<T_AREA> getChildrenNode(List<T_AREA> areaNodes, string id)
            {
                List<T_AREA> children = new List<T_AREA>();
                foreach (T_AREA node in areaNodes)
                {
                    if (node.PARENT_ID == id)
                    {
                        children.Add(node);
                    }
                }            return children;
            }     }调用地方:            Area area = new Area();
                //生成资源树
                List<T_AREA> nodeList = area.GetAllModel(); // from db             AreaHelper helper = new AreaHelper();
                this.area_tv.Nodes.Add(helper.ArrangeAreaNodes(nodeList));
                this.area_tv.ExpandAll();
      

  28.   


    "这是一个区域表,其中父区域可以无限扩展子区域,即在表中每一个区域都存在一个父区域编码。 "
    SuperID 就是你区域表中的父区域的ID值,我不知道你这个区域表的父区域是哪一个字段,所以用了SuperID代替了。这样吧,我把我的中国城乡表结构给你看一个就明白了:
    ChinaRegion](
    [AreaID] [int] not NULL,            --行政区序号
    [SuperID] [int] NOT NULL,           --上级行政区序号,其中0:无上级行政区(省份或直辖市)
    [AreaName] [varchar](50) NULL,      --行政区名称
    [GbCode] [char](6) NULL,            --6位国标行政区编码
    [AreaClass] [char](1) NULL,         --B:省/直辖市;C-市/行政区;D-县/城乡
    )那么这里, 每一个行政区均有序号,当SuperID为0时, 即表示其无上级行政区, 所以 0 必定为整个表数据的顶点了。
      

  29.   

    我的代码:报错,string->int32
            DataTable myRegion;
            string pid = "00000000000000000000000000000000";        private void button1_Click(object sender, EventArgs e)
            {
                DataSet ds = GetAllArea();
                myRegion = ds.Tables[0];            tv.Nodes.Clear(); //trvXML为你的Treeview控件名 
                TreeNode trvboot = new TreeNode("花园小区");
                
                DataRow dr = myRegion.Rows.Add();
                dr["CODE"] = "888";
                dr["PARENT_ID"] = pid;
                dr["ID"] = pid;
                dr["USER_COUNT"] = -1;
                trvboot.Tag = dr;
                tv.Nodes.Add(trvboot);            BuildTree("PARENT_ID="+pid, this.myRegion.Select("PARENT_ID=" + pid)[0], trvboot);    //把SuperID改成你的父级ID,这里的0为最顶点ID值 
                tv.Nodes[0].Expand();         }        public DataSet GetAllArea()
            {
                StringBuilder strSql = new StringBuilder();
                strSql.Append("select ID,CODE,NAME,PARENT_ID,USER_COUNT,INFO from T_AREA ");            DataSet ds = DBFacade.ExecuteDataSet(strSql.ToString());
                return ds;
            }        //使用递归创建 TreeView 
            private void BuildTree(string expression, DataRow drRow, TreeNode lstNode)
            {
                int superCount = this.myRegion.Select(expression).Length;
                if (superCount > 0)
                {
                    foreach (DataRow dr in this.myRegion.Select(expression))
                    {
                        string childExpress = string.Format("PARENT_ID={"+pid+"}", dr["ID"].ToString()); //把SuperID改成你的父级ID 
                        if (this.myRegion.Select(childExpress).Length > 0)
                        {
                            TreeNode sublst = new TreeNode(dr["NAME"].ToString());
                            sublst.Tag = dr;
                            lstNode.Nodes.Add(sublst);
                            BuildTree(childExpress, dr, sublst);
                        }
                        else
                        {
                            BuildTree(childExpress, dr, lstNode);
                        }
                    }
                }
                else
                {
                    TreeNode node = new TreeNode(drRow["NAME"].ToString());
                    node.Tag = drRow;
                    lstNode.Nodes.Add(node);
                }
      

  30.   

    你的pid数据类型为:varchar, 要改两个地方:  BuildTree("PARENT_ID="+pid, this.myRegion.Select("PARENT_ID=" + pid)[0], trvboot);
    改成:
      BuildTree("PARENT_ID='"+pid+"'", this.myRegion.Select("PARENT_ID='" + pid+"'")[0], trvboot);
      string childExpress = string.Format("PARENT_ID={"+pid+"}", dr["ID"].ToString()); 
    改成:
     string childExpress = string.Format("PARENT_ID='"+pid+"'", dr["ID"].ToString()); 这样就行了。
      

  31.   

    晕, 后一个写错了:
     string childExpress = string.Format("PARENT_ID='{0}'", dr["ID"].ToString()); 这里的 {0} 表示的是 dr["ID"].ToString() 值, 楼主写成 {"+pid+"}" , 把我与弄糊涂了。 呵呵。
      

  32.   

    改成了:string childExpress = string.Format("PARENT_ID='{0}'", dr["ID"].ToString()); 
    还是报错:
    未处理的“System.StackOverflowException”类型的异常出现在 mscorlib.dll 中。
    在处理时:
    if (this.myRegion.Select(childExpress).Length > 0)
      

  33.   

    汗, 楼主你加下QQ:308251570, 我把我做的Table与实例发给你研究一下吧。
      

  34.   

    强类型dataset能快速实现你想要的功能,objectdatasourse+强类型dataset
      

  35.   

    AreaNode类:
    public class AreaNode : TreeNode
        {
            private string id;
            private string code;
            private string name;
            private string parentCode;
            private string userCount;
            private string info;
            public string Id
            {
                get { return id; }
                set { id = value; }
            }        public string Code
            {
                get { return code; }
                set { code = value; }
            }        public new string Name
            {
                get { return name; }
                set { name = value; }
            }        public string ParentCode
            {
                get { return parentCode; }
                set { parentCode = value; }
            }        public string UserCount
            {
                get { return userCount; }
                set { userCount = value; }
            }        public string Info
            {
                get { return info; }
                set { info = value; }
            }
        }    public class AreaHelper
        {
            public AreaNode ArrangeAreaNodes(List<AreaNode> areaNodes)
            {
                List<AreaNode> arrangedNodes = new List<AreaNode>();            foreach (AreaNode node in areaNodes)
                {
                    List<AreaNode> children = getChildrenNode(arrangedNodes, node.Code);
                    foreach (AreaNode child in children)
                    {
                        arrangedNodes.Remove(child);
                        node.Nodes.Add(child);
                    }                AreaNode parent = getNode(arrangedNodes, node.ParentCode);
                    if (parent != null)
                    {
                        parent.Nodes.Add(node);
                    }
                    else
                    {
                        arrangedNodes.Add(node);
                    }
                }            if (arrangedNodes.Count == 0) return null;
                return arrangedNodes[0];
            }        private static AreaNode getNode(ICollection<AreaNode> areaNodes, string code)
            {
                if(areaNodes == null || areaNodes.Count == 0 || code == null) return null;            foreach (AreaNode node in areaNodes)
                {
                    if (node.Code == code)
                    {
                        return node;
                    }                foreach(AreaNode child in node.Nodes)
                    {
                        return getNodeInner(child, code);
                    }
                }            return null;
            }        private static AreaNode getNodeInner(AreaNode node,string code)
            {
                if(node == null || code == null) return null;            if(node.Code == code) return node;
                foreach(AreaNode child in node.Nodes)
                {
                    AreaNode an = getNodeInner(child, code);
                    if(an != null) return an;
                }            return null;
            }        private static List<AreaNode> getChildrenNode(IEnumerable<AreaNode> areaNodes, string code)
            {
                List<AreaNode> children = new List<AreaNode>();
                foreach (AreaNode node in areaNodes)
                {
                    if (node.ParentCode == code)
                    {
                        children.Add(node);
                    }
                }            return children;
            }
        }
      

  36.   

    调用代码示例(通过测试):
    private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    List<AreaNode> areaList = new List<AreaNode>();
                    AreaNode root = new AreaNode();
                    root.Id = "1";
                    root.Code = "1";
                    root.Name = "root";
                    root.Text = "root";
                    root.ParentCode = "-1";
                    root.Info = "xxxxx";
                    root.UserCount = "2";                areaList.Add(root);                //add 2 children for root
                    for (int i = 0; i < 2; i++)
                    {
                        AreaNode node = new AreaNode();
                        node.Id = string.Format("1{0}", i + 1);
                        node.Code = string.Format("1{0}", i + 1);
                        node.Name = string.Format("Node{0}", i + 1);
                        node.Text  = string.Format("Node{0}", i + 1);
                        node.ParentCode = "1";
                        node.Info = "ffff";
                        node.UserCount = "2";                    areaList.Add(node);
                    }                //add 2 children for Node1
                    for (int i = 0; i < 3; i++)
                    {
                        AreaNode node = new AreaNode();
                        node.Id = string.Format("11{0}", i + 1);
                        node.Code = string.Format("11{0}", i + 1);
                        node.Name = string.Format("Node1{0}", i + 1);
                        node.Text  = string.Format("Node1{0}", i + 1);
                        node.ParentCode = "11";
                        node.Info = "ffff";
                        node.UserCount = "2";                    areaList.Add(node);
                    }                for (int i = 0; i < 3; i++)
                    {
                        AreaNode node = new AreaNode();
                        node.Id = string.Format("111{0}", i + 1);
                        node.Code = string.Format("111{0}", i + 1);
                        node.Name = string.Format("Node11{0}", i + 1);
                        node.Text  = string.Format("Node11{0}", i + 1);
                        node.ParentCode = "111";
                        node.Info = "ffff";
                        node.UserCount = "2";                    areaList.Add(node);
                    }                for (int i = 0; i < 3; i++)
                    {
                        AreaNode node = new AreaNode();
                        node.Id = string.Format("1111{0}", i + 1);
                        node.Code = string.Format("1111{0}", i + 1);
                        node.Name = string.Format("Node111{0}", i + 1);
                        node.Text  = string.Format("Node111{0}", i + 1);
                        node.ParentCode = "1111";
                        node.Info = "ffff";
                        node.UserCount = "2";                    areaList.Add(node);
                    }                for (int i = 0; i < 3; i++)
                    {
                        AreaNode node = new AreaNode();
                        node.Id = string.Format("11111{0}", i + 1);
                        node.Code = string.Format("11111{0}", i + 1);
                        node.Name = string.Format("Node1111{0}", i + 1);
                        node.Text  = string.Format("Node1111{0}", i + 1);
                        node.ParentCode = "11111";
                        node.Info = "ffff";
                        node.UserCount = "2";                    areaList.Add(node);
                    }                AreaHelper helper = new AreaHelper();
                    AreaNode nodes = helper.ArrangeAreaNodes(areaList);
                    treeView1.Nodes.Add(nodes);
                    treeView1.ExpandAll();
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
      

  37.   

    执行结果:
    root
     - Node1
      - Node11
        - Node111
          - Node1111
            - Node11111
            - Node11112
            - Node11113
          - Node1112
          - Node1113
        - Node112
        - Node113
      - Node12
      - Node13
     - Node2