TreeView怎样无限递归绑定数据(用C#语言写),谢谢。。

数据库设计如下

50 0 军事 0
51 0 生活 0
52 1 健康菜肴 51
53 1 各国武器 50
72 0 新闻 0
73 1 国内 72
75 1 国外 72
84 0 uuu 0
85 2 aaa 52
86 3 bbb 85

我把我以前用的表结构先介绍下
表主要用来保存权限分类的
字段 PopId 权限ID 主键
PopName 权限名字
PostUrl 链接到的URL
flid 父节点ID
其中 根节点的flid为0 其他的父节点根据情况填写

页面实现的时候 直接 添加treeview控件
cs代码如下
protected void Page_Load(object sender, EventArgs e)
{
bindtree(PopId);
}
private void bindtree()
{
TreeView1.Nodes.Clear();
AddTree(0, (TreeNode)null);
}
public void AddTree(int ParentID, TreeNode pNode)
{
DataTable dt = new DataTable();
//这个是我获取数据源的代码
dt = logbll.BindPop();
DataView dvTree = new DataView(dt);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "flid = " + ParentID;

foreach (DataRowView Row in dvTree)
{
TreeNode Node = new TreeNode();
if (pNode == null)
{ //添加根节点
Node.Text = Row["PopName"].ToString();
TreeView1.Nodes.Add(Node);
//Node.Expanded = true;

AddTree(Int32.Parse(Row["PopId"].ToString()), Node); //再次递归
}
else
{ //添加当前节点的子节点
Node.Text = Row["PopName"].ToString();
Node.NavigateUrl = Row["PostUrl"].ToString();
pNode.ChildNodes.Add(Node);
//Node.Expanded = true;
AddTree(Int32.Parse(Row["PopId"].ToString()), Node); //再次递归
}
}
}

你可以根据你的表来修改相应的字段名,下班了,没时间帮你写完整的了,代码能用,有什么问题明天再解决吧
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-01-05
给你贴几行代码,自己参考一下

private void TreeViewLoad()
{
//全部のノードクリア
this.tvwItem.Nodes.Clear();
//登录件数を取得します
itemCount = dataTable.Rows.Count;
//トップノードを设定します
this.tvwItem.Nodes.Add("0", mAItemSystemCode + " " + mAItemSystemName);
this.tvwItem.Nodes[0].ImageIndex = 0;
this.tvwItem.Nodes[0].SelectedImageIndex = 1;
this.tvwItem.TopNode.BackColor = System.Drawing.Color.Silver;
//ノードを添加する
treeViewNodeAdd("0", this.tvwItem.Nodes[0]);
//全展开
this.tvwItem.ExpandAll();
}
private void treeViewNodeAdd(string parentID, TreeNode parentNode)
{
DataRow[] rows = dataTable.Select("ParentID=" + parentID);

foreach (DataRow row in rows)
{
treeNode.Name = mAItemID;
treeNode.Text = maItemCode + " " + maItemName;

//ノードを添加する
parentNode.Nodes.Insert(orderNo, treeNode);
//子ノードを添加する
treeViewNodeAdd(mAItemID, treeNode);//递归循环添加子node
}
}

如果数据太多,读取太慢的话
在TreeViewLoad()里面,第一行写上
this.tvwItem.BeginUpdate();
最后一行写上
this.tvwItem.EndUpdate();
可以加快刷新速度
第2个回答  2009-01-05
private void GetExPloitationNode(String TypeID, DataSet ds)
{
DataView dv = new DataView(ds.Tables[0]);
dv.RowFilter = "sExploitationTypeID='" + TypeID + "' and sMasterID='" + MasterID + "'";
dv.Sort = CRED_ExploitationIndexTable.C_iDisplayOrder;
if (dv.Count > 0)
{
foreach (DataRowView drow in dv)
{
TreeView tv = new TreeView();
TreeNode NewNode = new TreeNode();
NewNode.Text = drow[CRED_ExploitationIndexTable.C_sExploitationIndex].ToString();
NewNode.Value = drow[CRED_ExploitationIndexTable.C_sExploitationID].ToString();
tv.Nodes.Add(NewNode);
tv.EnableClientScript = false;
tv.ShowCheckBoxes = TreeNodeTypes.All;
tv.ShowLines = true;
tv.EnableViewState = true;
ListSubModule(NewNode, TypeID);
}
}
}
private void ListSubModule(TreeNode nodeParent, String TypeID)
{
DataView dv = new DataView(AllIndex.Tables[0]);
dv.Sort = CRED_ExploitationIndexTable.C_iDisplayOrder;
String nodeID = nodeParent.Value.Trim();
dv.RowFilter = "sExploitationTypeID='" + TypeID + "' and sMasterID='" + nodeID + "'";
foreach (DataRowView drow in dv)
{
TreeNode nodeChild = new TreeNode();
nodeChild.Text = drow[CRED_ExploitationIndexTable.C_sExploitationIndex].ToString();
nodeChild.Value = drow[CRED_ExploitationIndexTable.C_sExploitationID].ToString();
nodeParent.ChildNodes.Add(nodeChild);
this.ListSubModule(nodeChild, TypeID);
}
}

大致就是这个样子的!思路很清晰的!没时间根据你的表改!
就是一个递归!
第3个回答  2009-01-05
什么无限递归 说清楚点

TreeView怎样无限递归绑定数据(用C#语言写),谢谢。。
foreach (DataRowView Row in dvTree){ TreeNode Node = new TreeNode();if (pNode == null){ \/\/添加根节点 Node.Text = Row["PopName"].ToString();TreeView1.Nodes.Add(Node);\/\/Node.Expanded = true;AddTree(Int32.Parse(Row["PopId"].ToString()), Node); \/\/再次递归 } else...

在C#中怎么把treeview和数据库中的三张表递归绑定(比如说中国的省...
\/\/先初始化省 SqlConnection con = new SqlConnection(DBHelper.sql);con.Open();SqlCommand cmdPro = new SqlCommand("……", con);SqlDataReader drPro = cmdPro.ExecuteReader();this.ddlProvince.DataSource = drPro;this.ddlProvince.DataTextField = "name";\/\/显示值 this.ddlProvince.Data...

请问各位大神怎么让treeview一级一级的加载,就是开始只显示一级点击点...
private void GenerateNode(TreeNodeCollection nodes, string OrganID, int intLevel){ DataRow[] row;if (OrganID == "00"){ row = dtTree.Select("OrganID <> '00' and len(organid) = " + intLevel * 2);} else { row = dtTree.Select("OrganID <> '" + OrganID + "' an...

c# treeView 只载入第一层,点击节点时载入下一层,该怎么解决
在后添加控件的NodeMouseClick事件,在事件中写上加载子节点的代码,如果有多和父节点的话:private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e){if (e.Node.Text == 父节点){e.Node.Nodes.Add(1);

C# winform开发中,如果treeview的节点太多,导致加载很慢,怎么做可以提...
最好的做法就是 先导入根目录,然后用户点击之后 在导入点击项的子目录,这种无极限的结构如果一次性全部导入 很费时。,简单说 就是 指哪 导哪。

怎样利用递归生成树?(C#窗体)
TreeView1.Nodes.Add(tn1);tn1.Expanded = true;AddTree(Int32.Parse(Row["ID"].ToString()), tn1); \/\/再次递归 } else { \/\/添加当前节点的子节点 TreeNode tn2 = new TreeNode();tn2.Text = Row["name"].ToString();\/\/pNode.Nodes.Add(tn2);pNode.ChildNodes.Add(tn2);...

C# win treeview如何获取check选中的值? Treeview是绑定数据的
你需要的是递归 \/\/\/ \/\/\/ 获得所有被选中的节点 \/\/\/ \/\/\/ 节点集合 private bool GetTargetNode(TreeNodeCollection Nodes){ bool success=true;foreach (TreeNode TN in Nodes){ if (TN.Checked){ \/\/保存数据你想要的数据到数据库 if (保存失败){ success=false;break;} } success=Ge...

C#实现TreeView节点点击触发事件
在里面添加一个Linkbutton,把LinkButton的值等于你的数据库中的值就OK了.if (!Page.IsPostBack)\/\/在不加这一句之前,每次刷新一下页面,就会多一个树控件出来,一直叠加.加了这一句之后,就不会重复加载了.IsPostBack是一个十分重要的方法,表示页面是否为第一次加载......

谁那有C#中关于Treeview控件的程序,是能够执行的压缩包,给我发一份...
parentId,父级编号,顶级为0 sortId,排序编号,删除的时候,把sortId大于此编号的,全部减一。增加的时候,在最大编号上加一。上移的时候,与前面交换sortId,先判断是否已经是最前了。即是否为0 下移的时候,与后面交换sortId,先判断是否已经是最后了。即是否为childNum+1 depth,深度,0为顶级。chi...

如何动态保存treeview数据
如何动态保存TreeView数据取决于使用的编程语言和框架。通常,可以考虑以下几种方法:1. 使用数据库:将TreeView的数据保存到数据库中,可以使用关系型数据库(如MySQL、SQL Server)或非关系型数据库(如MongoDB、Redis)。将TreeView的节点信息和层级关系存储在数据库的表中,以便在需要时可以动态地加载...

相似回答
大家正在搜