protected void diguishu(string Pid, DataTable dt, TreeNode tn) //递归数
    {
        DataView dv = dt.DefaultView;
        dv.RowFilter = "ParentId = '" + Pid + "'";
        for (int i = 0; i < dv.Count; i++)
        {
            TreeNode ctr = new TreeNode(dv[i]["Text"].ToString(), dv[i]["Id"].ToString());
            tn.ChildNodes.Add(ctr);
            diguishu(dv[i]["Id"].ToString(), dt, ctr);
        }
    }    protected void createTree() //生成树
    {
        TreeNode tn = new TreeNode("所有类型", Guid.Empty.ToString());
        TreeView1.Nodes.Add(tn);
        DataTable dt = FPD.B2C.BLL.GetAllCategory().Select(c => new { Id = c.CategoryId, ParentId = c.ParentId, Text = c.CategoryName }).AsEnumerable().ToTable();
        diguishu(tn.Value, dt, tn);
    }他只找完所有类型的第一个子接点然后就结束拉.不是应该找完第一个然后再继续找下去吗?
请大家指教

解决方案 »

  1.   

    这句:
     diguishu(dv[i]["Id"].ToString(), dt, ctr);
    上边应该有个判断吧 如果这个id下边还有子类类似这样的判断再将
    diguishu(“子类ID”, 子类数据, ctr);
      

  2.   


    protected void diguishu(string Pid, DataTable dt, TreeNode tn) //递归数
        {
            DataView dv = dt.DefaultView;
            dv.RowFilter = "ParentId = '" + Pid + "'";
            for (int i = 0; i < dv.Count; i++)
            {
                TreeNode ctr = new TreeNode(dv[i]["Text"].ToString(), dv[i]["Id"].ToString());
                tn.ChildNodes.Add(ctr);
                diguishu(dv[i]["Id"].ToString(), dt, tn);//ctr -> tn
            }
        }
      

  3.   

    递归没问题,是不是       DataTable dt = FPD.B2C.BLL.GetAllCategory().Select(c => new { Id = c.CategoryId, ParentId = c.ParentId, Text = c.CategoryName }).AsEnumerable().ToTable();获取的数据有问题
      

  4.   

    一楼的,我的dv不就是他的所有子接点吗?dt结构是pid,id,text.dv的count>0就是判断拉
      

  5.   

    数据是:"所有类别" 是根节点,之后有9大类,第一个大类只有一个子节点,其余节点都没子节点..表里共11种类别."所有类别"+9大类+第一个大类的子接点.
    断点时,第一次运行,dv.count=9,第二次运行:递归第一个大类的时候,dv.count = 1,之后的dv.count = 0,应该说dv.count=0继续两次.然后就结束递归拉.
    他不是应该在dv.count = 9那个递归运行 i = 1,也就是第二大类的递归吗?
    请指教.
                
      

  6.   

    不好看出问题所在,建议楼主在debug下跟踪一下程序的运行过程,9个大类,你大概跟踪个10来个递归过程就好了。光用肉眼看还真的不好看。
      

  7.   

    估计是引用类型的问题.dv被改拉,经过第一个大类的子类后他的count=0,所以就提前结束递归
      

  8.   

      for (int i = 0; i < dv.Rows.Count; i++)
      

  9.   

     hdt: for (int i = 0; i < dv.Rows.Count; i++) 
    dv都没这个属性.看来你也看出问题 所在..
    是不是按这种方法不能实现递归?
      

  10.   

    发现问题了,你不能使用DataView,其始终映射到datatable上,而且你设置的Filter也相当于是对DataTable做了过滤,所以你需要改用DataRow[]:
    protected void diguishu(string Pid, DataTable dt, TreeNode tn) //递归数
            {
                DataRow[] drs = dt.Select("ParentId = '" + Pid + "'");
                for (int i = 0; i < drs.Length; i++)
                {
                    TreeNode ctr = new TreeNode(drs[i]["Text"].ToString());
                    ctr.Tag = drs[i]["Id"].ToString();
                    tn.Nodes.Add(ctr);
                    diguishu(drs[i]["Id"].ToString(), dt, ctr);
                }
            }
    这样就好了。
      

  11.   

    成功代码:我用的是winform,都一样的,此外由于在winform中对你的TreeNode等用法做了一点点调整,楼主可以拷贝到一个winform窗体中试试,不过要增加对应名称的控件。private void button4_Click(object sender, EventArgs e)
            {
                treeView1.Nodes.Clear();
                createTree();
                treeView1.ExpandAll();
            }        private DataTable getTreeData()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("Id");
                dt.Columns.Add("ParentId");
                dt.Columns.Add("Text");            DataRow row;            for (int i = 0; i < 5; i++)
                {
                    row = dt.NewRow();
                    row[0] = i;
                    row[1] = -1;
                    row[2] = string.Format("Category-{0}", i + 1);                dt.Rows.Add(row);
                }            for (int i = 0; i < 10; i++)
                {
                    row = dt.NewRow();
                    row[0] = 10 + i;
                    row[1] = i % 5;
                    row[2] = string.Format("Middle-Category-{0}", i + 1);                dt.Rows.Add(row);
                }            for (int i = 0; i < 30; i++)
                {
                    row = dt.NewRow();
                    row[0] = 20 + i % 5;
                    row[1] = 10 + i % 5;
                    row[2] = string.Format("Small-Category-{0}", i + 1);                dt.Rows.Add(row);
                }            return dt;
            }        protected void createTree() //生成树
            {
                TreeNode tn = new TreeNode("所有类型");
                tn.Tag = -1;
                treeView1.Nodes.Add(tn);
                DataTable dt = getTreeData();
                diguishu(tn.Tag.ToString(), dt, tn);
            }
            
            protected void diguishu(string Pid, DataTable dt, TreeNode tn) //递归数
            {
                DataRow[] drs = dt.Select("ParentId = '" + Pid + "'");
                for (int i = 0; i < drs.Length; i++)
                {
                    TreeNode ctr = new TreeNode(drs[i]["Text"].ToString());
                    ctr.Tag = drs[i]["Id"].ToString();
                    tn.Nodes.Add(ctr);
                    diguishu(drs[i]["Id"].ToString(), dt, ctr);
                }
            }
      

  12.   

    试试用组合(Composite)模型来实现非常的简单,你这里还缺少"层级"的控制~~
      

  13.   

    在你使用DataView,并且对其设置RowFilter,相当于对DataTable做了过滤,而DataTable非临时变量,而是窗体的成员,你的所有递归都要给予这个DataTable来做,但是在递归的过程中,DataTable的RowFilter最终到了最低层匹配不到数据,也就是说DataTable在加了RowFilter后没有数据,因此循环液就无法进行下去了。这就是原因,使用DataRow[],相当于把当前需要的数据取出来放到临时变量里面,就这么简单。
      

  14.   

    lovvver 你太有才拉..非常感谢你.谢谢.原因也说得很明白
      

  15.   

    我用的VB.NET,你参照一下呢   Protected Overrides Sub MyToolbar_RequeryAfter()
            Dim cParent As String, DepaId As String
            Dim _node As TreeNode        Me.FlatTreeView1.Nodes.Clear()
            Me.FlatTreeView1.BeginUpdate()
            Try
                '填充树型控件
                '最顶层
                m_TopNode = New TreeNode("部门分类")
                m_TopNode.Tag = "SccpcDepaID"
                Me.FlatTreeView1.Nodes.Add(m_TopNode)            Dim i As Integer
                For i = 0 To Me.MyToolbar.DT.Rows.Count - 1
                    cParent = Me.MyToolbar.DT.Rows(i).Item("cParent") & ""      '上级部门编号
                    DepaId = Me.MyToolbar.DT.Rows(i).Item("cbmdh") & ""         '    部门编号
                    If cParent.Equals("") Then
                        _node = New TreeNode(Me.MyToolbar.DT.Rows(i).Item("cbmmc").ToString.Trim & "")
                        _node.Tag = DepaId
                        _node = FillTree(_node, DepaId)
                        If _node.GetNodeCount(True) > 0 Then
                            _node.ImageIndex = 0
                        Else
                            _node.ImageIndex = 1
                        End If
                        _node.SelectedImageIndex = _node.ImageIndex
                        m_TopNode.Nodes.Add(_node)
                    End If
                Next
                If Not Me.FlatTreeView1.SelectedNode Is Nothing Then
                    Me.FlatTreeView1.SelectedNode.EnsureVisible()
                End If        Catch ex As Exception
                MessageBox.Show(ex.Message, CType(SR.GetString("ERROR_LOC"), String), MessageBoxButtons.OK, MessageBoxIcon.Error)
            Finally
                '撤消编辑 
                Me.MyToolbar.DT.RejectChanges()
                Me.FlatTreeView1.EndUpdate()
                m_TopNode.Expand()
            End Try
        End Sub    Private Function FillTree(ByVal _node As TreeNode, ByVal sParentID As String) As TreeNode
            Dim i As Integer
            Dim _node1 As TreeNode
            Dim cParent As String, DepaID As String        Try
                For i = 0 To Me.MyToolbar.DT.Rows.Count - 1
                    cParent = Me.MyToolbar.DT.Rows(i).Item("cParent") & ""      '上级部门编号
                    DepaID = Me.MyToolbar.DT.Rows(i).Item("cbmdh") & ""         '    部门编号                If Not cParent.Equals("") AndAlso Not Me.MyToolbar.DT.Rows(i).RowState = DataRowState.Modified Then
                        If cParent.Equals(sParentID) Then
                            _node1 = New TreeNode(Me.MyToolbar.DT.Rows(i).Item("cbmmc").ToString.Trim & "")
                            _node1.Tag = DepaID
                            Me.MyToolbar.DT.Rows(i).BeginEdit()
                            Me.MyToolbar.DT.Rows(i).Item("cbmmc") = Me.MyToolbar.DT.Rows(i).Item("cbmmc").ToString.Trim & ""
                            Me.MyToolbar.DT.Rows(i).EndEdit()
                            _node1 = FillTree(_node1, DepaID)
                            If _node1.GetNodeCount(True) > 0 Then
                                _node1.ImageIndex = 0
                            Else
                                _node1.ImageIndex = 1
                            End If
                            _node1.SelectedImageIndex = _node1.ImageIndex                        _node.Nodes.Add(_node1)
                        End If
                    End If
                Next
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            Return _node
        End Function
      

  16.   

    protected void diguishu(string Pid, DataTable dt, TreeNode tn) //递归数
        {
            DataView dv = dt.DefaultView;
            dv.RowFilter = "ParentId = '" + Pid + "'";
            for (int i = 0; i < dv.Count; i++)
            {
                TreeNode ctr = new TreeNode(dv[i]["Text"].ToString(), dv[i]["Id"].ToString());
                tn.ChildNodes.Add(ctr);
                diguishu(dv[i]["Id"].ToString(), dt, tn);//ctr -> tn
            }
        }