动态加载TreeNode问题! 我设计了一个表结构如下:节点名称,节点编号,节点级次,父节点menu1 01 0 menu2 02 1 01menu3 03 1 01menu4 04 2 03如何能从数据库里面读出这些信息,然后动态的生成一个TreeNode,大家给点思路! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #region 循环DataSet绑定TreeView private void Bind_SellReport(DataSet ds,TreeView tv,int ParentID,TreeNode pNode) { DataView dvTree = new DataView(ds.Tables[0]); //过滤ParentID,得到当前的所有子节点 dvTree.RowFilter = "HiDepID = " + ParentID; foreach(DataRowView Row in dvTree) { TreeNode Node=new TreeNode() ; if(pNode == null) { //添加根节点 Node.Text = Row["MainString"].ToString(); tv.Nodes.Add(Node); Node.Expand(); Bind_SellReport(ds,tv,Int32.Parse(Row["DepID"].ToString()), Node); //再次递归 } else { //添加当前节点的子节点 Node.Text = Row["MainString"].ToString(); pNode.Nodes.Add(Node); Bind_SellReport(ds,tv,Int32.Parse(Row["DepID"].ToString()),Node); //再次递归 } } } #endregion 利用递归:private void CreateTree(TreeNodeCollection folderTreeNodeCollection ,int parentID) { SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["myweb"]); SqlDataAdapter myCommand = new SqlDataAdapter("select * from bbs_config",myConnection); DataSet ds=new DataSet(); myCommand.Fill(ds,"bbs_config"); DataView dv=new DataView(ds.Tables["bbs_config"]); dv.RowFilter= "flag="+parentID; int tmpParentFolderID=0; foreach(DataRowView drv in dv) { TreeNode tn=new TreeNode(); tn.ID=drv.Row["id"].ToString(); tn.Text=drv.Row["bbsname"].ToString().Trim(); tn.NavigateUrl="club.aspx?bbsname1="+tn.Text; tmpParentFolderID=Int32.Parse(drv.Row["flag"].ToString().Trim()); folderTreeNodeCollection.Add(tn); CreateTree(folderTreeNodeCollection[folderTreeNodeCollection.Count - 1].Nodes,Int32.Parse(tn.ID)); } } 楼上的代码验证过么!?tn.ID,tn.NavigateUrl是什么东西! /// <param name="selectedIndex"></param> private void rebuildTree( string selectedIndex ) { // Initial Tree TreeOperationDB treeOperation = new TreeOperationDB(); treeOperation.SetTreeView(tvDocDir); TreeOperationDB.ExpandTreeNode(selectedIndex,this.tvDocDir.Nodes[0]); tvDocDir.SelectedNodeIndex = selectedIndex; // Set Initial this.SetPageView(MainPageStatus.ViewStatusInit); } /// </summary> /// <param name="NodePath"></param> /// <param name="node"></param> public static void ExpandTreeNode(string NodePath,TreeNode node) { string [] NodeIndex = NodePath.Split('.'); for(int i = 1;i < NodeIndex.Length ; i ++) { int Index = int.Parse( NodeIndex[i] ); node = node.Nodes[Index]; if( i == NodeIndex.Length -1 ) { node.Expanded = false ; } else { node.Expanded = true ; } } } 你可以把数据取到一个table 中,然后写一个递归方法,就可以实现了啊在方法中利用table.find("父节点=参数值")找到子节点 暈死~~你們有沒有問樓主說的是WinForm還是Web啊?WinForm下:TreeView tvw;SqlDataReader rd=SqlCommand.ExecuteReader("SELECT 节点编号,节点名称... Order By 节点级次,节点编号");While(rd.read()){ TreeNode nd; if(rd["节点级次"].tostring()=="") { nd=new TreeNode(rd[1].tostring()); nd.tag=rd[1]; tvw.Nodes.Add(nd); } else { TreeNode pnd; for(int i=0;i<tvw.Nodes.Count;i++) { pnd=getParentNode(tvw.Nodes[i],rd["父节点"].tostring()) if(pnd!=null) break; } if(pnd!=null) { nd=new TreeNode(rd[1].tostring()); nd.tag=rd[1]; pnd.Nodes.Add(nd); } }}private TreeNode getParentNode(TreeNode pnd,string id){ TreeNode nd=null; if(pnd.tag.tostring()==id) { return pnd; } if(pnd.Nodes.Count>0) { for(int i=0;i<pnd.Nodes.Count;i++) nd=getParentNode(pnd.Nodes[i],id) } return nd;}Web:沒做過;沒有IDE,可能錯誤多多﹐不過思路大概如此. C# DropDownList 同值也刷新 C# VScrollbar问题 C# socket 异步 疑问 日期输入的问题 一个入门级小问题,关于C#变量赋值的问题.大家来帮忙. 新手提问 如何让winForm中的时间控件显示英文? 調試出現錯誤,問題何在?聽說可以用funtion?怎么用 使用OpenFileDialog,文件的当前路径改变! 我想问下,我打开一个文件,对文件里进行了修改,然后准备保存,但是我的保存必须保存在原文件原路径原名字 关于XML用于不同语言之间数据传递媒介的难题~~ 关于软件注册的问题,请教各位高手,进来有分
private void Bind_SellReport(DataSet ds,TreeView tv,int ParentID,TreeNode pNode)
{
DataView dvTree = new DataView(ds.Tables[0]);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "HiDepID = " + ParentID; foreach(DataRowView Row in dvTree)
{
TreeNode Node=new TreeNode() ;
if(pNode == null)
{ //添加根节点
Node.Text = Row["MainString"].ToString();
tv.Nodes.Add(Node);
Node.Expand();
Bind_SellReport(ds,tv,Int32.Parse(Row["DepID"].ToString()), Node); //再次递归
}
else
{ //添加当前节点的子节点
Node.Text = Row["MainString"].ToString();
pNode.Nodes.Add(Node);
Bind_SellReport(ds,tv,Int32.Parse(Row["DepID"].ToString()),Node); //再次递归
}
}
}
#endregion
private void CreateTree(TreeNodeCollection folderTreeNodeCollection ,int parentID)
{
SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["myweb"]);
SqlDataAdapter myCommand = new SqlDataAdapter("select * from bbs_config",myConnection);
DataSet ds=new DataSet();
myCommand.Fill(ds,"bbs_config");
DataView dv=new DataView(ds.Tables["bbs_config"]);
dv.RowFilter= "flag="+parentID;
int tmpParentFolderID=0;
foreach(DataRowView drv in dv)
{
TreeNode tn=new TreeNode();
tn.ID=drv.Row["id"].ToString();
tn.Text=drv.Row["bbsname"].ToString().Trim();
tn.NavigateUrl="club.aspx?bbsname1="+tn.Text;
tmpParentFolderID=Int32.Parse(drv.Row["flag"].ToString().Trim());
folderTreeNodeCollection.Add(tn);
CreateTree(folderTreeNodeCollection[folderTreeNodeCollection.Count - 1].Nodes,Int32.Parse(tn.ID));
}
}
private void rebuildTree( string selectedIndex )
{
// Initial Tree
TreeOperationDB treeOperation = new TreeOperationDB();
treeOperation.SetTreeView(tvDocDir); TreeOperationDB.ExpandTreeNode(selectedIndex,this.tvDocDir.Nodes[0]);
tvDocDir.SelectedNodeIndex = selectedIndex; // Set Initial
this.SetPageView(MainPageStatus.ViewStatusInit);
} /// </summary>
/// <param name="NodePath"></param>
/// <param name="node"></param>
public static void ExpandTreeNode(string NodePath,TreeNode node)
{
string [] NodeIndex = NodePath.Split('.'); for(int i = 1;i < NodeIndex.Length ; i ++)
{
int Index = int.Parse( NodeIndex[i] ); node = node.Nodes[Index];
if( i == NodeIndex.Length -1 )
{
node.Expanded = false ;
}
else
{
node.Expanded = true ;
}
}
}
在方法中利用table.find("父节点=参数值")找到子节点
你們有沒有問樓主說的是WinForm還是Web啊?
WinForm下:
TreeView tvw;
SqlDataReader rd=SqlCommand.ExecuteReader("SELECT 节点编号,节点名称... Order By 节点级次,节点编号");
While(rd.read())
{
TreeNode nd;
if(rd["节点级次"].tostring()=="")
{
nd=new TreeNode(rd[1].tostring());
nd.tag=rd[1];
tvw.Nodes.Add(nd);
}
else
{
TreeNode pnd;
for(int i=0;i<tvw.Nodes.Count;i++)
{
pnd=getParentNode(tvw.Nodes[i],rd["父节点"].tostring())
if(pnd!=null) break;
}
if(pnd!=null)
{
nd=new TreeNode(rd[1].tostring());
nd.tag=rd[1];
pnd.Nodes.Add(nd);
}
}
}private TreeNode getParentNode(TreeNode pnd,string id)
{
TreeNode nd=null;
if(pnd.tag.tostring()==id)
{
return pnd;
}
if(pnd.Nodes.Count>0)
{
for(int i=0;i<pnd.Nodes.Count;i++)
nd=getParentNode(pnd.Nodes[i],id)
}
return nd;
}Web:
沒做過;沒有IDE,可能錯誤多多﹐不過思路大概如此.