当前位置:编程学习 > C#/ASP.NET >>

关于Treeview 递归算法的请教~~各位大虾进来帮帮忙。~

假如 1个 A级客户有5个B级客户, 5个B级又分别有5个C级客户,  
这个用TreeView  怎么写出来??  
我自己的思路是通过A判断出B,但是B判断出来有5个,怎么分别添加,而且不明白是先办判断B后面的C级,还是应该先把B结点添加出来再判断C级别。。
 数据库用的是三层结构,不会写这个的递归算法。。
哪位大虾能帮帮忙教一下,谢谢了。。!!~~ --------------------编程问答-------------------- .......递归是不管你有几个的。 。。 下面有子节点就不断的递归了。 。 --------------------编程问答--------------------

#region 生成树

    public void AddTree(string ParentID, TreeNode pNode)
    {
        DataView dvTree = new DataView(new GoodsItem().GetTree(ParentID));   //就是dtTree = dsFrame.Tables[0];  
        string Fstr = "";// "[S_UpGuid] = '" + ParentID + "'";
        if (ParentID == string.Empty)
        {
            Fstr = "[S_UpGuid]  is null";
        }
        else
        {
            Fstr = "[S_UpGuid] = '" + ParentID + "'";
        }
        dvTree.RowFilter = Fstr;
        foreach (DataRowView Row in dvTree)
        {
            TreeNode Node = new TreeNode();
            if (pNode == null) //处理主节点  
            {
             
                Node.Text = Row["S_HouseGuid"].ToString();
                Node.Text = "[" + Row["S_HouseCode"] + "]" + Row["S_HouseName"].ToString();
                tv_group.Nodes.Add(Node);   //加入 
                AddTree(Row["S_HouseGuid"].ToString(), Node); //递归  
            }
            else //处理子节点   
            {
                Node.Text = Row["S_HouseGuid"].ToString();
                Node.Text = "[" + Row["S_HouseCode"] + "]" + Row["S_HouseName"].ToString();
                pNode.ChildNodes.Add(Node);
                //pNode.Nodes.Add(Node);
                AddTree(Row["S_HouseGuid"].ToString(), Node);
            }
        }
    } 
    #endregion
调用: AddTree("", (TreeNode)null);
你先看下,看看能否找到个思路。。。

--------------------编程问答-------------------- 问题还在于递归的算法,搞清楚业务逻辑需要,至于使用TreeView还是其它控件加以显示都不是问题 --------------------编程问答--------------------

public partial class _Default : System.Web.UI.Page 
{

SqlConnection conn = new SqlConnection("workstation id="cyz";user id=sa;password=****;initial catalog=pubs;persist security info=false");
DataSet ds = new DataSet();

protected void Page_Load(object sender, EventArgs e)
{
if (! (IsPostBack) )

SqlDataAdapter da = new SqlDataAdapter("select * from t_tree order by parentid", conn);
da.Fill(ds, "t_tree");
InitTree0(); 


}
}
private void InitTree0() //根结点加载函数
{
TV.Nodes.Clear(); //TV为TreeView控件
DataRow[] rows = ds.Tables["t_tree"].Select("parentid=0");
for (int i = 0; i < rows.Length; i++)
{
TreeNode T_root = new TreeNode();
DataRow dr = rows[i];
T_root.Text = dr["Descricpt"].ToString();
TV.Nodes.Add(T_root);
InitTree(T_root, dr["id"].ToString());//根结点加载完后,开始调用加载子结点的函数,并开始递归。
}
}
private void InitTree(TreeNode Nd,String Parent_id) //子树结点加载函数
{
DataRow[] rows = ds.Tables["t_tree"].Select("parentid="+Parent_id );
if (rows != null)
{
for (int i = 0; i < rows.Length;i++ )
{
TreeNode Tnd = new TreeNode();
DataRow dr=rows[i];
Tnd.Text = dr["Descricpt"].ToString();
Nd.ChildNodes.Add(Tnd);
InitTree(Tnd,dr["id"].ToString());//递归调用
}
}
}
}


--------------------编程问答-------------------- 先顶,再学习~~ --------------------编程问答-------------------- 首先得到B级节点,通过递归可以得到该节点下的所有节点,只要判断A下的B是哪个就可以了 --------------------编程问答-------------------- 递归就是自己调用自己,但是每次的数据都给的不同,你看下面的例子应该就能明白了
/// <summary>
    /// 创建DataSet的方法
    /// </summary>
    /// <param name="nodes">TreeView的根节点</param>
    /// <param name="ds">Dataset数据集合</param>
    /// <param name="pid">节点的父</param>
    private void CreateTreeView(TreeNodeCollection nodes, DataSet ds, int pid)
    {
        //定义筛选条件
        string sql = string.Format("ParentID={0}", pid);

        //从Dataset中筛选符合条件的行的集合
        DataRow[] drr = ds.Tables[0].Select(sql);

        //遍历获得行的集合
        foreach (DataRow dr in drr)
        {
            //创建TreeView节点
            TreeNode tnode = new TreeNode();
            //添加到根节点中
            nodes.Add(tnode);
            //设置显示的文本
            //tnode.ImageUrl = "images/foldericon1.gif";
            tnode.Text = dr["PurName"].ToString();
            tnode.Value = dr["PurID"].ToString();
            //设置显示的路径
            tnode.NavigateUrl = dr["PurURL"].ToString();
            //递归调用方法
            CreateTreeView(tnode.ChildNodes, ds, Convert.ToInt32(dr["PurID"]));
            //从Dataset中删除已经添加的行,提高访问效率
            ds.Tables[0].Rows.Remove(dr);

        }
    } --------------------编程问答-------------------- 上面红色那句话,就是把父节点的id当作参数给那个方法。。重新调用这个方法,好得到子节点的数据 --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 回2L大虾 代码我看了,你是把子节点和根节点的添加都是写在一起了是么?? 我技术不太好,还在慢慢研究。呵呵~~~谢谢你

4L大虾,你的代码我貌似看着有点感觉,我在尝试着写得出来不。。

感觉递归算法我还是不太会用。。 我试着写成循环的看看。。~~~谢谢各位大虾。。我再去研究研究。。 --------------------编程问答-------------------- 7L大虾。你的代码貌似不错。。一会我再研究下。。现在有点头晕。。。~~~ --------------------编程问答-------------------- 操作当然是从顶节点开始,
但实际运行,是从末节点开始建立的。
看递归算法都知道。
我实现过商品类别树,
各个节点都能算出下级有几个商品,几个节点。 --------------------编程问答-------------------- 暂时不用我写这个功能了。。嘿嘿。。。。解放。。 --------------------编程问答-------------------- 递归这东西说难不难说简单也不简单,须要自己去练习中探索
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,