表结构为:
ID                Name                 Code             NodeType
1                 测试                 101                 0
2                 测试2                102                 1
3                 测试3                1020                0
4                 测试4                10201               1
5                 测试5                1020101             0
6                 测试6                10202               0该表中,由Code和NodeType共同控制层级关系,
NodeType 为1,表示有子节点,为0表示无子节点
子节点的Code为父节点的code后添加任意数字,如 102 的子节点为 102 1020 10201...
但并非code后添加任意数字就是父子关系:如 1020 却并非 10201 的父节点,层级关系还得参照NodeType我将datatable定义成了全局变量,
方法为:
private void CreateTreeNode(TreeNode parentNode,string parentNodeCode,string parentNodeType)
{
      //请高手填充方法,我自己写的递归存在这样问题,子节点会被加载两遍}请大家帮忙。

解决方案 »

  1.   

      public void bind()
            {
                SqlDataAdapter adp = new SqlDataAdapter("select * from tb_table", connString);
                DataTable dtData = new DataTable();
                adp.Fill(dtData);
                TreeView tv;//树控件
                tv.Nodes.Clear();
                // 获得第一级数据
                DataRow[] drRoot = dtData.Select("len(Code)=3");//位数为3的为父节点。
                foreach (DataRow dr in drRoot)
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = dr["Name"].ToString();
                    AppendChild(tn, dr["code"].ToString());
                    tv.Nodes.Add(tn);
                }
            }
            public void AppendChild(TreeNode tnParent, string code)
            {
                DataRow[] drs = dtData.Select("条件");
                foreach (DataRow dr in drs)
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = dr["Name"].ToString();
                    AppendChild(tn, dr["code"].ToString());//递归
                    tnParent.ChildNodes.Add(tn);
                }
            }感觉你这个表设计的不好 为何不把CODE那一项改为父节点的ID呢或者加一列为父节点的ID 那么就好做了。
      

  2.   

    感觉你这个表设计的不好 为何不把CODE那一项改为父节点的ID呢或者加一列为父节点的ID 那么就好做了。这表是另外系统已经在用的表。结构死了,只能这样。
    所以我才无比蛋疼啊。
      

  3.   

    http://zhidao.baidu.com/question/6474488.html
      

  4.   

      DataRow[] drRoot = dtData.Select("len(Code)=3");//位数为3的为父节点。
    这样操作是不行的,因为顶级父节点位数可能并不为3位
    我上面的数据只是举例而已。
      

  5.   


    以下为我自己写的代码,但是加载出来的节点完全乱了。
    private void CreateTreeNode(TreeNode parentNode,string parentNodeCode,string parentNodeType)
    { DataRow[] rows = _dataSource.Select("Code like '" + currentCode + "%'");
            if (rows != null)
            {
                foreach (DataRow var in rows)
                {
                    if (node == null)
                    {
                        TreeNode tempNode = new TreeNode(var["Name"].ToString(), var["ID"].ToString());
                        currentCode = var["Code"].ToString();
                        nodeType = var["NodeType"].ToString();
                        //判断当前节点是否已经存在
                        if (!ContainsTreeNode(tempNode))
                        {
                            CreateTreeNode(tempNode, currentCode, nodeType);
                            tvItem.Nodes.Add(tempNode);                    }
                    }
                    else
                    {
                        //当前nodeType为汇总级节点时,才将新节点添加为其子节点,否则
                        if (nodeType == "1")
                        {
                            if (var["ID"].ToString() != node.Value)
                            {
                                TreeNode childNode = new TreeNode(var["Name"].ToString(), var["ID"].ToString());
                                currentCode = var["Code"].ToString();
                                nodeType = var["NodeType"].ToString();
                                CreateTreeNode(childNode, currentCode, nodeType);
                                node.ChildNodes.Add(childNode);
                            }
                        }
                    }
                }
            }
    }
      

  6.   

      我刚好做过类似的,如果不嫌麻烦 我呆会儿直接帖代码,我是新手,代码有点不规范,但思路差不多,我是先象LZ一样把想要显示出来的赋值为1  不显示的节点为0  然后 以下代码public void BindNode(String Qx)
            {
                String url = ConfigurationManager.ConnectionStrings["SDB"].ConnectionString;
                String name = Session["id"].ToString();
                String sql = "select * from WBlogin where ZH='" + name + "'";
                TreeNode mu = new TreeNode("主目录");
                TreeNode jc = new TreeNode("基础数据");
                TreeNode cs = new TreeNode("CS查询");
                TreeNode gl = new TreeNode("用户管理");
                this.TreeView1.Nodes.Add(mu);
                mu.ChildNodes.Add(jc);
                mu.ChildNodes.Add(cs);
                mu.ChildNodes.Add(gl);
                SqlConnection con = new SqlConnection(url);
                con.Open();
                SqlCommand com = new SqlCommand(sql, con);
                SqlDataReader sdr = com.ExecuteReader();
                sdr.Read();
                String fen = sdr["fenpei"].ToString();
                String qy = fen.Substring(0, 1);
                String cl = fen.Substring(1, 1);
                String gz = fen.Substring(2, 1);
                String sf = fen.Substring(3, 1);
                String fenlei = fen.Substring(4, 1);
                String ck = fen.Substring(5, 1);
                String zl = fen.Substring(6, 1);
                String fl = fen.Substring(7, 1);
                String sk = fen.Substring(8, 1);
                String jing = fen.Substring(9, 1);
                String dx = fen.Substring(10, 1);
                String ic = fen.Substring(11, 1);
                String rz = fen.Substring(12, 1);
                String yx = fen.Substring(13, 1);
                String tj = fen.Substring(14, 1);
                String xg = fen.Substring(15, 1);
                String mm = fen.Substring(16, 1);
                if (qy.Equals("1"))
                {
                    TreeNode qy1 = new TreeNode("sss");
                    jc.ChildNodes.Add(qy1);
                    qy1.NavigateUrl = "Qyda.aspx";
                }
                if (cl.Equals("1"))
                {
                    TreeNode cl1 = new TreeNode("ddd");
                    jc.ChildNodes.Add(cl1);
                    cl1.NavigateUrl = "CarInfo.aspx";
                }
                if (gz.Equals("1"))
                {
                    TreeNode gz1 = new TreeNode("fff");
                    cs.ChildNodes.Add(gz1);
                    gz1.NavigateUrl = "Yield.aspx";
                }
                if (sf.Equals("1"))
                {
                    TreeNode sf1 = new TreeNode("eee");
                    cs.ChildNodes.Add(sf1);
                    sf1.NavigateUrl = "Mingxi.aspx";
                }
               
    我是这么做的```````
      

  7.   

    to :lanqiang456
    谢谢了。不过我们的逻辑不同的。
      

  8.   

    http://topic.csdn.net/u/20100724/17/8BC66C41-CE6C-42A4-AE81-8F80B1C8C4BA.html
      

  9.   


    哥们儿,这个真的不一样。
    层级关系不同。我的父级code可能是1位,也可能是2位,也可能是3位。
      

  10.   


    我有了一点思路,就是先取所有nodetype=1的信息,然后判断这些信息是否有父级,如果没有父节点,则递归添加自己的子节点。
    因为并非所有的节点都有子节点(如102有子节点,但是101没有),所以再取所有信息中nodetype=0的信息,判断是否有父节点,没有父节点,则直接添加到树
    但是结果却有了问题,如本帖中的那张表的数据,显示结果如下(Code展示),1020101这个级别的节点多显示了一遍102
       1020
       10201
            1020101
       1020101
    代码如下: private void InitData()
        {
            if (_dataSource != null && _dataSource.Rows.Count > 0)
            {
                           #region 第一步  先按照汇总节点去查找
                DataRow[] rows1 = _dataSource.Select("NodeType=1");
                foreach (DataRow var in rows1)
                {
                    TreeNode node = new TreeNode(var["Name"].ToString(),var["ID"].ToString());
                    string currentCode = var["Code"].ToString();
                    string nodeType = var["NodeType"].ToString();
                    //没有有父节点,则递归遍历子节点
                    if (!HasParentNode(node, currentCode))
                    {
                        CreateTreeNode(node, currentCode, nodeType);
                        tvItem.Nodes.Add(node);
                    }
                }
                #endregion            #region 第二步  遍历datatable 将nodetype=0 且没有父节点的信息添加到treeview            DataRow[] rows0 = _dataSource.Select("NodeType=0");            foreach (DataRow var in rows0)
                {
                    TreeNode node = new TreeNode(var["Name"].ToString(), var["ID"].ToString());
                    string currentCode = var["Code"].ToString();
                    string nodeType = var["NodeType"].ToString();
                    //没有父节点,则添加当前节点
                    if (!HasParentNode(node, currentCode))
                    {
                        tvItem.Nodes.Add(node);
                    }
                }            #endregion        }
        } /// <summary>
        /// 判断指定节点是否有父节点
        /// </summary>
        /// <param name="node"></param>
        /// <param name="code"></param>
        /// <returns></returns>
        private bool HasParentNode(TreeNode node, string code)
        {
            if (_dataSource != null && _dataSource.Rows.Count > 0)
            {
                foreach (DataRow var in _dataSource.Rows)
                {
                    string currentCode = var["Code"].ToString();
                    string nodeType = var["NodeType"].ToString();
                    string id = var["ID"].ToString();
                    //子节点code为父节点code后添加任意数量的数字
                    //父节点的nodeType必须为1
                    //父节点和子节点的id不同
                    if (code.IndexOf(currentCode) == 0 && id != node.Value && nodeType == "1")
                    {
                        return true;
                    }            }
            }
            return false;
        } /// <summary>
        ///  获取指定父节点下所有子节点
        /// </summary>
        /// <param name="node"></param>
        /// <param name="dt"></param>
        /// <param name="currentCode"></param>
        private void CreateTreeNode(TreeNode node, string currentCode, string nodeType)
        {
            if (_dataSource == null || _dataSource.Rows.Count <= 0)
            {
                return;
            }               #region        DataView view = _dataSource.DefaultView;
            view.RowFilter="Code like '" + currentCode + "%'";
            view.Sort = "Code asc";
            DataTable tempTable= view.ToTable();
            if (tempTable.Rows != null)
            {
                foreach (DataRow var in tempTable.Rows)
                {
                    
                        //当前nodeType为汇总级节点时,才将新节点添加为其子节点,否则
                        if (nodeType == "1")
                        {
                            if (var["ID"].ToString() != node.Value)
                            {
                                TreeNode childNode = new TreeNode(var["Name"].ToString(), var["ID"].ToString());
                                string code = var["Code"].ToString();
                                string type = var["NodeType"].ToString();
                                node.ChildNodes.Add(childNode);
                                CreateTreeNode(childNode, code, type);
                            }
                        }
                    }
            }        #endregion
        }请大家帮忙看看整个逻辑,哪出了问题。