关于Treeview 递归算法的请教~~各位大虾进来帮帮忙。~
假如 1个 A级客户有5个B级客户, 5个B级又分别有5个C级客户,这个用TreeView 怎么写出来??
我自己的思路是通过A判断出B,但是B判断出来有5个,怎么分别添加,而且不明白是先办判断B后面的C级,还是应该先把B结点添加出来再判断C级别。。
数据库用的是三层结构,不会写这个的递归算法。。
哪位大虾能帮帮忙教一下,谢谢了。。!!~~ --------------------编程问答-------------------- .......递归是不管你有几个的。 。。 下面有子节点就不断的递归了。 。 --------------------编程问答--------------------
--------------------编程问答-------------------- 问题还在于递归的算法,搞清楚业务逻辑需要,至于使用TreeView还是其它控件加以显示都不是问题 --------------------编程问答--------------------
#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);
你先看下,看看能否找到个思路。。。
--------------------编程问答-------------------- 先顶,再学习~~ --------------------编程问答-------------------- 首先得到B级节点,通过递归可以得到该节点下的所有节点,只要判断A下的B是哪个就可以了 --------------------编程问答-------------------- 递归就是自己调用自己,但是每次的数据都给的不同,你看下面的例子应该就能明白了
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());//递归调用
}
}
}
}
/// <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