A
----A1
--------A11
--------A12
----A2
--------A21
--------A22
--------A23
------------A231
------------A232比如,我可能只显示A11,A12和A2以及他的所有节点。
因为A11,A12是属于A1,但A1不显示,这时A11,A12要自动放到根节点,就是要这样显示A11
A12
A2
----A21
----A22
----A23
--------A231
--------A232问下如何能做到?数据表有记录他的父节点是哪个。数据表大概这样ID,Title,FatherID

解决方案 »

  1.   

    递归绑定数据,根据Title不添加到root中
    private void BindJG()  
      {  
      DataSet ds = new DataSet();  
      DataTable dtb = ds.Tables[0];  
      TreeNode root = new TreeNode();  
      root.Value = "0";  
      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 = "ParentId='"+nFatherid+"'";  
      foreach (DataRowView Row in dv)  
      {  
      TreeNode node = new TreeNode();  
      if (fatherNode.Value == "0")  
      {  
      node.Value = Row["ID"].ToString();  
      node.Text = Row["TITLE"].ToString();  
      node.NavigateUrl = "";  
      fatherNode.ChildNodes.Add(node);  
      initTree(dt, Row["ID"].ToString(), node);  
      }  
      else  
      {  
      node.Text = Row["TITLE"].ToString();  
      node.Value = Row["ID"].ToString();   
      fatherNode.ChildNodes.Add(node);  
      }  
      }  
      }
      

  2.   

    tree需要递归绑定数据
    如果数据量大的话,建议使用类似分页的做法
      

  3.   

    #region 递归绑定treeview
        /// <summary>
        /// 递归绑定treeview
        /// </summary>
        /// <param name="dt">你要绑定的数据</param>
        /// <param name="tn">当前节点</param>
        void digui(DataTable dt, TreeNode tn)
        {
            try
            {
                DataRow[] dr = dt.Select("parentid=" + tn.Value);
                for (int i = 0; i < dr.Length; i++)
                {
                    TreeNode t = new TreeNode();
                    t.SelectAction = TreeNodeSelectAction.None;
                    t.Text = dr[i]["context"].ToString();
                    t.Value = dr[i]["id"].ToString();
                    tn.ChildNodes.Add(t);
                    digui(dt, t);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion
      

  4.   


    似乎不行吧,正常递归显示我也有类似代码。
    但你试试删除A,A1,然后再递归试试。至于是否存在A,A1,是需要程序判断的。
      

  5.   

    可以用递归复制的方法,比方在下面的treenode中,用Checked属性表示哪些不要显示的节点:<asp:TreeView ID="TreeView1" runat="server">
    <Nodes>
    <asp:TreeNode Text="A" Checked="true" >
    <asp:TreeNode Text="A1" Checked="true">
    <asp:TreeNode Text="A11" />
    <asp:TreeNode Text="A12" />
    </asp:TreeNode>
    <asp:TreeNode Text="A2">
    <asp:TreeNode Text="A21" />
    <asp:TreeNode Text="A22" />
    <asp:TreeNode Text="A23">
    <asp:TreeNode Text="A231" />
    <asp:TreeNode Text="A232" />
    </asp:TreeNode>
    </asp:TreeNode>
    </asp:TreeNode>
    </Nodes>
    </asp:TreeView><script runat="server"> void Page_Load(object sender, EventArgs e)
    {
    TreeNode[] nodes = TreeView1.Nodes.Cast<TreeNode>().ToArray();
    TreeView1.Nodes.Clear();
    TrimNodes(nodes, TreeView1.Nodes);

    } private void TrimNodes(TreeNode[] nodes, TreeNodeCollection result)
    {
    foreach (TreeNode node in nodes)
    {
    TreeNode child = (node as ICloneable).Clone() as TreeNode;
    if (!node.Checked)
    result.Add(child);
    TrimNodes(node.ChildNodes.Cast<TreeNode>().ToArray(), node.Checked ? result : child.ChildNodes);
    }
    }
    </script>