怎么样用递归的方法生成这个树
string strSelectMission = @"select * from SBFL  where XLFL =  '0' and ISNEW = '1'";          DataTable SBFL = helper.ExcuteDataSet(strSelectMission).Tables[0];
            foreach (DataRow nrrow in SBFL.Rows)
            {
                TreeNode NRnode = new TreeNode();
                NRnode.Text = nrrow["FLNAME"].ToString();
                NRnode.Tag = nrrow["FLID"].ToString();                strSelectMission = @"select * from SBFL where XLFL =  '" + NRnode.Tag + "'";
                DataTable QXNRTwo = helper.ExcuteDataSet(strSelectMission).Tables[0];
                foreach (DataRow nr2row in QXNRTwo.Rows)
                {
                    TreeNode NR2node = new TreeNode();
                    NR2node.Text = nr2row["FLNAME"].ToString();
                    NR2node.Tag = nr2row["FLID"].ToString();
                    strSelectMission = @"select * from SBFL where XLFL =  '" + NR2node.Tag + "'";
                    DataTable QXNRThree = helper.ExcuteDataSet(strSelectMission).Tables[0];
                    foreach (DataRow nr3row in QXNRThree.Rows)
                    {
                        TreeNode NR3node = new TreeNode();
                        NR3node.Text = nr3row["FLNAME"].ToString();
                        NR3node.Tag = nr3row["FLID"].ToString();
                        NR2node.Nodes.Add(NR3node);
                    }
                    NRnode.Nodes.Add(NR2node);
                }                SBFLTree.Nodes.Add(NRnode);
            }
只对数据库进行一次查询?

解决方案 »

  1.   

    只对数据库进行一次查询可以使用DataTable.Select("XLFL = '???'");
      

  2.   

    基本上是这样 public void Test1111()
            {
                //ID,ParentID根据表设计定
                string strSelectMission = @"select *, ID,ParentID from SBFL";            DataTable SBFL = helper.ExcuteDataSet(strSelectMission).Tables[0];            DataRow[] rootRows = SBFL.Select("ParentID is NULL");            foreach (DataRow nrrow in rootRows)
                {
                    TreeNode NRnode = new TreeNode();
                    NRnode.Text = nrrow["FLNAME"].ToString();
                    NRnode.Tag = nrrow["FLID"].ToString();
                    AddChildren(NRnode, SBFL, nrrow["ID"].ToString());                SBFLTree.Nodes.Add(NRnode);
                }
            }
            public void AddChildren(TreeNode node, DataTable treeTable, String parentNodeId)
            {
                DataRow[] drs = treeTable.Select("ParentID='" + parentNodeId + "'");
                foreach (DataRow chr in drs)
                {
                    TreeNode NR3node = new TreeNode();
                    NR3node.Text = chr["FLNAME"].ToString();
                    NR3node.Tag = chr["FLID"].ToString();
                    node.Nodes.Add(NR3node);                AddChildren(NR3node, treeTable, chr["ID"].ToString());//递归调用 
                }
            }
      

  3.   

    先查询一次数据库,把所有的“节点”数据查询出来,并建立一个哈希表hashTable,Key就是节点的唯一标识,把所有的节点数据先写到哈希表中;
    然后遍历哈希表:
    如果节点的“父节点标识”为空,则此节点直接添加到树控件下(母节点)
    如果节点的“父节点标识”有值,则从哈希表中用该标识索引到父节点,把此节点添加到父节点的Nodes里整个过程只需要一次查询数据库,和一个foreach循环即可
      

  4.   

    可能是我没有说清楚,我的意思是只在数据库中查询一次, 可以在缓存中查询,感谢zcl24解决了我的问题,我总是想一次性递归出来,所以,一直未遂,呵呵
      

  5.   

    这个的话: 需要将表结构设计成父子级联! 如果只查询一次,那就直接查出整个表放到datatable中!然后操作datatable进行绑定!