折腾了半个月了 跪求高手解决一下 希望高手能够递归的写出一段以GUID为主键的树形结构 能够动态删除 增加节点 拜托了 小弟解决不了了 不是INT类型!数据库的表我暂时不提供 写出例子 我琢磨下! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不是int类型的?只能表示关注了 GUID为主键的树形结构???表这样设计:GUID NodeID PNodeID NodeContent NavigateUrl只要使用NodeID和PNodeID进行递归不可以嘛,很多这样的例子嘛 递归实现treeview动态添加节点protected void addtreview() { SqlConnection myconn = new SqlConnection(); myconn.ConnectionString = "server=.;database=baoming;uid=sa;pwd=admin"; myconn.Open(); //连接数据库 SqlDataAdapter sda = new SqlDataAdapter("select * from treeview where tree_class = 1", myconn); //读取根节点数据 DataSet ds = new DataSet(); sda.Fill(ds); for (int i = 0;i<ds.Tables[0].Rows.Count;i++) //遍历根节点数量 { SqlDataAdapter sda2 = new SqlDataAdapter("select * from treeview where tree_lei = '" + ds.Tables[0].Rows[i]["tree_id"].ToString() + "'", myconn); //读取子节点数据 DataSet ds2 = new DataSet(); sda2.Fill(ds2); TreeNode node = new TreeNode(); node.Text = ds.Tables[0].Rows[i]["tree_name"].ToString(); //填充根节点数据 for (int j = 0; j < ds2.Tables[0].Rows.Count; j++) //遍历第一级子结点数量 { TreeNode newnode = new TreeNode(); newnode.Text = ds2.Tables[0].Rows[j]["tree_name"].ToString(); //填充子节点数据 newnode.NavigateUrl = ds2.Tables[0].Rows[j]["tree_url"].ToString(); node.ChildNodes.Add(newnode); //将子节点添加到父节点下 } TreeView2.Nodes.Add(node); //填充treeview } myconn.Close(); } 只要使用NodeID和PNodeID进行递归就可以了。我的主键是就是用的guid 主键是GUID类型的表,一般情况下都再增加个identity列。 楼主,树当然对int比较敏感可以用表结构把int和guid映射一下这样也可以达到关联嘛 private void InitTree(TreeNodeCollection Nds,int parentid) { DataView dv = new DataView(); TreeNode tmpNd = null; dv.Table = ds.Tables[0]; dv.RowFilter = String.Format("parentid={0}", parentid); foreach (DataRowView drv in dv) { tmpNd = new TreeNode(); tmpNd.Text = (string)drv["sortname"];//节点名称 tmpNd.NavigateUrl = String.Format("?id={0}", drv["id"]);//节点URL //tmpNd.ImageUrl = ""; //节点图片 if (parentid == 0) tmpNd.Expanded = true; else tmpNd.Expanded = false; Nds.Add(tmpNd); InitTree(Nds[Nds.Count - 1].ChildNodes, (int)drv["id"]); } }参考 使用游标或者使用 while @rowcount!=0 内连接求子节点具体我也忘记了 - - 你们谁做做好事 自己试一下贴代码我看看 字段暂时给你们folderid foldername paretid 2个ID都是GUID 类型 pID默认null(根节点) create table cate(folderid uniqueidentifier not null,foldername nvarchar(80),paretid uniqueidentifier)declare @a1 uniqueidentifier, @a2 uniqueidentifier, @a3 uniqueidentifierset @a1 = NEWID()set @a2 = NEWID()set @a3 = NEWID()insert into cate select @a1,' 部门1',null union allselect @a2,' 部门2',null union allselect @a3,' 部门3',null union allselect NEWID(),' 部门1-1',@a1 union allselect NEWID(),' 部门1-2',@a1 union allselect NEWID(),' 部门2-1',@a2 union allselect NEWID(),' 部门2-2',@a2 union allselect NEWID(),' 部门3-1',@a3 union allselect NEWID(),' 部门3-2',@a3 private DataTable dt; protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { dt = GetTree(); ForEachTree(null); } } protected void ForEachTree(TreeNode prevNode) { DataView dv = dt.DefaultView; dv.RowFilter = prevNode == null ? "paretid is null" : "paretid = '" + prevNode.Value + "'"; foreach (DataRowView item in dv) { TreeNode tn = new TreeNode(); tn.Text = item["foldername"].ToString(); tn.Value = item["folderid"].ToString(); if (prevNode == null) { TreeView1.Nodes.Add(tn); } else { prevNode.ChildNodes.Add(tn); } ForEachTree(tn); } } protected DataTable GetTree() { DataTable dt = new DataTable(); using (SqlConnection conn = new SqlConnection("server=.;user id=sa;pwd=111;database=master;")) { conn.Open(); SqlCommand cmd = new SqlCommand("select * from cate", conn); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(dt); } return dt; } 以上实例可以直接运行调试还有你的动态添加删除,是什么样子的??如果要在每个节点文本后面 跟 ‘添加’‘删除’,可以这样将上面代码的 tn.Text = item["foldername"].ToString();修改为tn.Text = string.Format("{0} <a href=javascript:add('{1}')>添加</a> <a href=javascript:del('{1}')>删除</a>", item["foldername"].ToString(), item["folderid"].ToString());即调用两个js方法,然后编写js方法,以ajax的方式来操作,后续操作你自己实践一下 对了 你这个是用了treeview控件的吧 如果不用控件呢? 用了TreeView控件,不用控件的话,将那个递归里面涉及到TreeView的代码,替换成 格式字符串的等,你可以拼凑下HTML代码,然后前台用js美化 鼠标悬停到超链接上,显示数据库中的图片! 请问下面哪个机房比较好些 传值遇到的问题 关于ListBox 怎样将url中的参数加密 如何实现设置多行提交记录 如何做实时统计报表啊?想做成Excel格式输出的那种 如何防止直接访问网站upfile文件夹? 请问我在C#中给控件中加入javascrip时,有一个问题请教. 在使用DataGrid时发生的一个小问题(初学者,请大家帮个忙) 谁给个C语言的编程工具链接或直接发给我邮箱 动态更换母版页怎么换?
只能表示关注了
GUID NodeID PNodeID NodeContent NavigateUrl
只要使用NodeID和PNodeID进行递归不可以嘛,很多这样的例子嘛
{
SqlConnection myconn = new SqlConnection();
myconn.ConnectionString = "server=.;database=baoming;uid=sa;pwd=admin";
myconn.Open(); //连接数据库
SqlDataAdapter sda = new SqlDataAdapter("select * from treeview where tree_class = 1", myconn); //读取根节点数据
DataSet ds = new DataSet();
sda.Fill(ds);
for (int i = 0;i<ds.Tables[0].Rows.Count;i++) //遍历根节点数量
{
SqlDataAdapter sda2 = new SqlDataAdapter("select * from treeview where tree_lei = '" + ds.Tables[0].Rows[i]["tree_id"].ToString() + "'", myconn); //读取子节点数据
DataSet ds2 = new DataSet();
sda2.Fill(ds2);
TreeNode node = new TreeNode();
node.Text = ds.Tables[0].Rows[i]["tree_name"].ToString(); //填充根节点数据
for (int j = 0; j < ds2.Tables[0].Rows.Count; j++) //遍历第一级子结点数量
{
TreeNode newnode = new TreeNode();
newnode.Text = ds2.Tables[0].Rows[j]["tree_name"].ToString(); //填充子节点数据
newnode.NavigateUrl = ds2.Tables[0].Rows[j]["tree_url"].ToString();
node.ChildNodes.Add(newnode); //将子节点添加到父节点下
}
TreeView2.Nodes.Add(node); //填充treeview
}
myconn.Close();
}
{
DataView dv = new DataView();
TreeNode tmpNd = null;
dv.Table = ds.Tables[0];
dv.RowFilter = String.Format("parentid={0}", parentid);
foreach (DataRowView drv in dv)
{
tmpNd = new TreeNode();
tmpNd.Text = (string)drv["sortname"];//节点名称
tmpNd.NavigateUrl = String.Format("?id={0}", drv["id"]);//节点URL
//tmpNd.ImageUrl = ""; //节点图片
if (parentid == 0)
tmpNd.Expanded = true;
else
tmpNd.Expanded = false;
Nds.Add(tmpNd);
InitTree(Nds[Nds.Count - 1].ChildNodes, (int)drv["id"]);
}
}
参考
while @rowcount!=0
内连接求子节点
具体我也忘记了
- - 你们谁做做好事 自己试一下贴代码我看看 字段暂时给你们folderid foldername paretid
2个ID都是GUID 类型 pID默认null(根节点)
create table cate
(
folderid uniqueidentifier not null,
foldername nvarchar(80),
paretid uniqueidentifier
)declare @a1 uniqueidentifier, @a2 uniqueidentifier, @a3 uniqueidentifier
set @a1 = NEWID()
set @a2 = NEWID()
set @a3 = NEWID()insert into cate select @a1,' 部门1',null union all
select @a2,' 部门2',null union all
select @a3,' 部门3',null union all
select NEWID(),' 部门1-1',@a1 union all
select NEWID(),' 部门1-2',@a1 union all
select NEWID(),' 部门2-1',@a2 union all
select NEWID(),' 部门2-2',@a2 union all
select NEWID(),' 部门3-1',@a3 union all
select NEWID(),' 部门3-2',@a3 private DataTable dt;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
dt = GetTree();
ForEachTree(null);
}
} protected void ForEachTree(TreeNode prevNode)
{
DataView dv = dt.DefaultView;
dv.RowFilter = prevNode == null ? "paretid is null" : "paretid = '" + prevNode.Value + "'";
foreach (DataRowView item in dv)
{
TreeNode tn = new TreeNode();
tn.Text = item["foldername"].ToString();
tn.Value = item["folderid"].ToString();
if (prevNode == null)
{
TreeView1.Nodes.Add(tn);
}
else
{
prevNode.ChildNodes.Add(tn);
}
ForEachTree(tn);
}
} protected DataTable GetTree()
{
DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection("server=.;user id=sa;pwd=111;database=master;"))
{
conn.Open();
SqlCommand cmd = new SqlCommand("select * from cate", conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
}
return dt;
}
tn.Text = item["foldername"].ToString();
修改为
tn.Text = string.Format("{0} <a href=javascript:add('{1}')>添加</a> <a href=javascript:del('{1}')>删除</a>", item["foldername"].ToString(), item["folderid"].ToString());即调用两个js方法,然后编写js方法,以ajax的方式来操作,后续操作你自己实践一下