我用下面的代码读取分类表并绑定至页面中的TreeView,递归成功,但是显示的是所有的根分类及下面的子分类,而我只想显示id为 2,3,4,5,6这几个根目录及他们下面的所有子目录,子目录下还分为若干级子目录,请问如何实现 ,今天慕白兄给我讲解了半天,实在是没弄明白,只好再次发问,只要解决,立即结贴
(参考图片为:http://www.ssdj.gov.cn/1.jpg,比方说我只要取出“考试管理”和“成绩管理”这两个根节点及他们的所有子节点,要如何弄)
请给出完整代码,只说原理,俺看不懂,或者在下面的代码上直接修改更好,谢谢    protected void Page_Load(object sender, EventArgs e)
    {
        string Sql = "select * from limfunction order by parentID ";
            DataSet ds = SqlHelper.ExecuteDataSet(SqlHelper.sqlstring,CommandType.Text,Sql,null);
            this.ViewState["ds"] = ds;
            if (!this.IsPostBack)
            {
                AddTree(0, (TreeNode)null, TreeView0);
            }    }    public void AddTree(int ParentID, TreeNode pNode,TreeView treename)
    {
        DataSet ds = (DataSet)this.ViewState["ds"];
        DataView dvTree = new DataView(ds.Tables[0]);        //过滤ParentID,得到当前的所有子节点
        dvTree.RowFilter = "[PARENTID] = " + ParentID;        foreach (DataRowView Row in dvTree)
        {
            TreeNode Node = new TreeNode();
            if (pNode == null)
            {    //添加根节点
                Node.Text = Row["cname"].ToString();
                Node.Value = Row["ID"].ToString();
                Node.NavigateUrl = Row["linkurl"].ToString();
                Node.ToolTip = Row["cname"].ToString();
                treename.Nodes.Add(Node);
                Node.Expanded = true;
                AddTree(Int32.Parse(Row["ID"].ToString()), Node,treename);        //再次递归
            }
            else
            {   //̀添加当前节点的子节点
                Node.Text = Row["cname"].ToString();
                Node.Value = Row["ID"].ToString();
                Node.NavigateUrl = Row["linkurl"].ToString();
                Node.ToolTip = Row["cname"].ToString();
                pNode.ChildNodes.Add(Node);
                Node.Expanded = true;
                AddTree(Int32.Parse(Row["ID"].ToString()), Node,treename);     //再次递归
            }        }
    }

解决方案 »

  1.   

    数据库是如何设置的?
    建议设计数据库的时候设计一个列比如PROWID为上下级判定列,然后主键为ROWID,那么如果PROWID为-1就是根节点,如果为其他值,比如2,那么它的上级父节点就是ROWID为2的节点,如此设置,然后再使用下面的递归方法实现protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                AddTreeView(-1, (TreeNode)null);
            }
        }    protected void AddTreeView(Int64 ID, TreeNode tn)
        {
            SqlConnection objConn = new SqlConnection(ConfigurationManager.ConnectionStrings["MaterialDBConnectionString"].ToString().Trim());        String strCmd = "select MaterialName,RowID from MaterialCodeDef where PRowID=" + ID;        SqlCommand objCmd = new SqlCommand();        objCmd.Connection = objConn;
            objConn.Open();
            objCmd.CommandText = strCmd;        SqlDataReader objDR = objCmd.ExecuteReader();        while (objDR.Read())
            {
                if (tn == null)
                {
                    TreeNode myNode = new TreeNode();
                    myNode.Text = objDR["MaterialName"].ToString().Trim();
                    myNode.Value = objDR["RowID"].ToString().Trim();
                    TreeView1.Nodes.Add(myNode);
                    AddTreeView(Int64.Parse(objDR["RowID"].ToString().Trim()), (TreeNode)myNode);
                }
                else
                {
                    TreeNode myNode1 = new TreeNode();
                    myNode1.Text = objDR["MaterialName"].ToString().Trim();
                    myNode1.Value = objDR["RowID"].ToString().Trim();
                    tn.ChildNodes.Add(myNode1);
                    AddTreeView(Int64.Parse(objDR["RowID"].ToString().Trim()), (TreeNode)myNode1);
                }
            }        objDR.Close();
            objConn.Close();
        }
      

  2.   

    数据库的设置就是id parentid name这样的
      

  3.   

    终于搞定了,想不明白,CSDN这么多的高人,为何挂了两天的问题,没人愿意帮忙,我也是很诚恳的啊:(
    孤风 谢谢你,虽然没有用你的方法,但是谢谢你的热心