做个递归:C#:
----------------------------------------------------------------
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.NodeBind();//页面加载时解析数据库绑定TreeNode根节点
}
} #region//数据库连接字符串
public void conString()
{
string conStr = "server=.;uid=sa;pwd=;database=Demo";
con = new SqlConnection(conStr);
}
#endregion #region//页面加载时绑定TreeNode根节点
public void NodeBind()
{
this.tvadd.Nodes[0].ChildNodes.Clear();//清空TreeView中所有节点
this.tvadd.Nodes[0].Expanded = true;//设置根节点为展开形式
this.AddChildNode("NULL",this.tvadd.Nodes[0]);
}
#endregion #region//递归解析数据库中节点并绑定在TreeView控件上
/// <summary>
/// 递归解析数据库中节点并绑定在TreeView控件上
/// </summary>
/// <param name="sqltj">要解析库这个节点归属于哪个父节点</param>
/// <param name="tn">要添加下一级节点的父节点</param>
public void AddChildNode(string sqltj,TreeNode tn)
{
string sql = "select * from AddNodes where ParentID";//查询该父节点下还有无子节点SQL语句
if (sqltj == "NULL")
{
sql += " IS NULL";//也就是说是根节点下面的第一级子节点
}
else
{
sql += "=" + sqltj;//查询sqltj下有无子节点
}
DataTable dt = this.dtDataBind(sql);
if (dt.Rows.Count == 0)//说明此节点下无子节点
{
return;//退出
}
else
{
for (int i = 0; i < dt.Rows.Count; i++)//循环DataTable表中子节点记录
{
TreeNode tnchild = new TreeNode();//创建新的子节点
tnchild.Text = dt.Rows[i][1].ToString();//为新建子节点的文本赋值
tnchild.Value = dt.Rows[i][1].ToString();//为新建子节点的Value赋值
tnchild.Expanded = true;//设置为不展开节点
tn.ChildNodes.Add(tnchild);//添加此节点的下一级子节点
//递归调用,一直往下直到添加完这一级下面的所有子节点为止,再转到下一个父节点,并添加所有此父节点下面的所有子节点
//i代表DataTable表中循环记录,0代表取得这个记录的ID值,为下面继续检查这个ID下是否还有子目录
//tnchild递归传递给下一次调用此方法,此时如果这个节点下还有子节点,它便成为父节点,对它下面的子节点进行添加
this.AddChildNode(dt.Rows[i][0].ToString(),tnchild);
}
}
}
#endregion #region//绑定DataTable表
public DataTable dtDataBind(string sql)
{
this.conString();
da = new SqlDataAdapter(sql,con);
dt = new DataTable();
da.Fill(dt);
return dt;
}
#endregion
----------------------------------------------------------------
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.NodeBind();//页面加载时解析数据库绑定TreeNode根节点
}
} #region//数据库连接字符串
public void conString()
{
string conStr = "server=.;uid=sa;pwd=;database=Demo";
con = new SqlConnection(conStr);
}
#endregion #region//页面加载时绑定TreeNode根节点
public void NodeBind()
{
this.tvadd.Nodes[0].ChildNodes.Clear();//清空TreeView中所有节点
this.tvadd.Nodes[0].Expanded = true;//设置根节点为展开形式
this.AddChildNode("NULL",this.tvadd.Nodes[0]);
}
#endregion #region//递归解析数据库中节点并绑定在TreeView控件上
/// <summary>
/// 递归解析数据库中节点并绑定在TreeView控件上
/// </summary>
/// <param name="sqltj">要解析库这个节点归属于哪个父节点</param>
/// <param name="tn">要添加下一级节点的父节点</param>
public void AddChildNode(string sqltj,TreeNode tn)
{
string sql = "select * from AddNodes where ParentID";//查询该父节点下还有无子节点SQL语句
if (sqltj == "NULL")
{
sql += " IS NULL";//也就是说是根节点下面的第一级子节点
}
else
{
sql += "=" + sqltj;//查询sqltj下有无子节点
}
DataTable dt = this.dtDataBind(sql);
if (dt.Rows.Count == 0)//说明此节点下无子节点
{
return;//退出
}
else
{
for (int i = 0; i < dt.Rows.Count; i++)//循环DataTable表中子节点记录
{
TreeNode tnchild = new TreeNode();//创建新的子节点
tnchild.Text = dt.Rows[i][1].ToString();//为新建子节点的文本赋值
tnchild.Value = dt.Rows[i][1].ToString();//为新建子节点的Value赋值
tnchild.Expanded = true;//设置为不展开节点
tn.ChildNodes.Add(tnchild);//添加此节点的下一级子节点
//递归调用,一直往下直到添加完这一级下面的所有子节点为止,再转到下一个父节点,并添加所有此父节点下面的所有子节点
//i代表DataTable表中循环记录,0代表取得这个记录的ID值,为下面继续检查这个ID下是否还有子目录
//tnchild递归传递给下一次调用此方法,此时如果这个节点下还有子节点,它便成为父节点,对它下面的子节点进行添加
this.AddChildNode(dt.Rows[i][0].ToString(),tnchild);
}
}
}
#endregion #region//绑定DataTable表
public DataTable dtDataBind(string sql)
{
this.conString();
da = new SqlDataAdapter(sql,con);
dt = new DataTable();
da.Fill(dt);
return dt;
}
#endregion
--------------------------------------------------------------
ChildNodeID(主键 int) ChildNodeType(varchar) ParentID(int)
1 a <null>
2 b <null>
3 a1 1
4 a2 1
5 b1 2生成代码:
------------------------------------------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AddNodes]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[AddNodes]
GOCREATE TABLE [dbo].[AddNodes] (
[ChildNodeID] [int] IDENTITY (1, 1) NOT NULL ,
[ChildNodeType] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ParentID] [int] NULL
) ON [PRIMARY]
GO
classXml.xml
-------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8" ?>
<school>
<class id="1" name="classone">
<student id="1" name="tom" sex="boy" />
<student id="2" name="jey" sex="boy" />
<student id="3" name="jam" sex="gril" />
<student id="4" name="christina" sex="gril" /> </class>
<class id="2" name="classtwo">
<student id="1" name="" sex="boy" />
<student id="2" name="jane" sex="gril" />
<student id="3" name="jett" sex="gril" />
<student id="4" name="ateen" sex="gril" />
</class>
<class id="3" name="classthree">
<student id="1" name="bon jovi" sex="boy" />
<student id="2" name="eminem" sex="boy" />
<student id="3" name="babyface" sex="boy" /> <student id="4" name="shakira" sex="gril" />
</class>
</school>
C#:
-------------------------------------------------------------------
using System.Xml;
using System.Xml.XPath;
...
XmlDocument xmlDoc;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.LoadXmlTree();
}
} #region//TreeView_XML
public void LoadXmlTree()
{
TreeView1.ShowLines = true;
xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("classXml.xml"));
XmlNodeList xnl = xmlDoc.SelectSingleNode("school").ChildNodes;
TreeNode tnRoot = new TreeNode();
tnRoot.Text = "school";
tnRoot.Value = "-1";
tnRoot.Expanded = true;
TreeView1.Nodes.Add(tnRoot);
this.TreeNodeBind(xnl,tnRoot);
} public void TreeNodeBind(XmlNodeList xnl, TreeNode tn)
{
foreach (XmlNode xnNext in xnl)
{
XmlElement xe = (XmlElement)xnNext;
TreeNode tnNext = new TreeNode();
if (xe.GetAttribute("name") != "")
{
tnNext.Text = xe.GetAttribute("name");
tnNext.Value = xe.GetAttribute("name");
}
else if (xe.GetAttribute("id") != "" || xe.GetAttribute("sex")!="")
{
tnNext.Text = xe.GetAttribute("id");
tnNext.Value = xe.GetAttribute("sex");
}
tnNext.Expanded = true;
tn.ChildNodes.Add(tnNext);
this.TreeNodeBind(xnNext.ChildNodes,tnNext);
}
}
#endregion
{
TreeNode tnchild = new TreeNode();
tnchild.Text = dr[1].ToString();
tnchild.Value = dr[1].ToString();
tnchild.Expanded = true;
tn.ChildNodes.Add(tnchild);
this.AddChildNode(dr[0].ToString(),tnchild);
}
{
TreeNode tnchild = new TreeNode();
tnchild.Text = dr[1].ToString();
tnchild.Value = dr[1].ToString();
tnchild.Expanded = true;
tn.ChildNodes.Add(tnchild);
this.AddChildNode(dr[0].ToString(),tnchild);
}
---------------------
改成什么??
for (int i = 0; i < dt.Rows.Count; i++)//循环DataTable表中子节点记录
{
TreeNode tnchild = new TreeNode();//创建新的子节点
tnchild.Text = dt.Rows[i][1].ToString();//为新建子节点的文本赋值
tnchild.Value = dt.Rows[i][1].ToString();//为新建子节点的Value赋值
tnchild.Expanded = true;//设置为不展开节点
tn.ChildNodes.Add(tnchild);//添加此节点的下一级子节点
//递归调用,一直往下直到添加完这一级下面的所有子节点为止,再转到下一个父节点,并添加所有此父节点下面的所有子节点
//i代表DataTable表中循环记录,0代表取得这个记录的ID值,为下面继续检查这个ID下是否还有子目录
//tnchild递归传递给下一次调用此方法,此时如果这个节点下还有子节点,它便成为父节点,对它下面的子节点进行添加
this.AddChildNode(dt.Rows[i][0].ToString(),tnchild);
}改成:
foreach(DataRow dr in dt.Rows)
{
TreeNode tnchild = new TreeNode();
tnchild.Text = dr[1].ToString();
tnchild.Value = dr[1].ToString();
tnchild.Expanded = true;
tn.ChildNodes.Add(tnchild);
this.AddChildNode(dr[0].ToString(),tnchild);
}
那就照着上面的改
----------------------------------------------------------
//取得被选中的node
private ArrayList GetTreeNodeList(TreeView objTreeView)
{
return GetTreeNodeList(objTreeView, 0);
}
//取得指定深度的node
private ArrayList GetTreeNodeList(TreeView objTreeView, int intDeep)
{
return GetTreeNodeList(objTreeView, intDeep, false);
} //指定深度node下的子节点取得
private ArrayList GetTreeNodeList(TreeView objTreeView, int intDeep, bool blnLeaf)
{
try
{
ArrayList treeNodeList = new ArrayList(); //取得被选中的node
if (intDeep.Equals(0) && blnLeaf == false)
{
for (int i = 0; i < objTreeView.CheckedNodes.Count; i++)
{
treeNodeList.Add(objTreeView.CheckedNodes[i]);
}
}
else
{
//取得指定深度的node
if (!intDeep.Equals(0) && blnLeaf == false)
{ for (int i = 0; i < objTreeView.CheckedNodes.Count; i++)
{
if (objTreeView.CheckedNodes[i].Depth == intDeep)
{
treeNodeList.Add(objTreeView.CheckedNodes[i]);
}
}
}
else
{
//指定深度node下的子节点取得
if (!intDeep.Equals(0) && blnLeaf != false)
{
TreeNodeCollection treeNodeSource = objTreeView.CheckedNodes;
ArrayList arrayNodes = new ArrayList(); for (int i = 0; i < treeNodeSource.Count; i++)
{
if (treeNodeSource[i].Depth == intDeep)
{
arrayNodes.Add(treeNodeSource[i]);
}
}
for (int j = 0; j < arrayNodes.Count; j++)
{
//LeafNodeを取得
GetLeafNodes((TreeNode)arrayNodes[j], treeNodeList);
}
}
}
}
return treeNodeList;
}
catch
{
throw;
}
} //LeafNodeを取得
private void GetLeafNodes(TreeNode treeNode, ArrayList treeNodeList)
{
try
{
if (treeNode.ChildNodes.Count.Equals(0))
{
treeNodeList.Add(treeNode);
}
else
{
for (int m = 0; m < treeNode.ChildNodes.Count; m++)
{
GetLeafNodes(treeNode.ChildNodes[m], treeNodeList);
}
}
}
catch
{
throw;
}
}
string strsql="select * from uf_GetUserRolePower('"+UserInfo.SchoolNo+"','"+UserInfo.UserName+"') order by aa,PnodeNum";
SqlDataReader dr = DataAccess.GetReaderResult("Select IsAdmin from TeacherInfo where SchoolNo='" + UserInfo.SchoolNo + "' and TeacherId='"+UserInfo.UserName+"'");
if (dr.Read())
{
if(dr.GetValue(0).ToString()=="1")
strsql = "select *,'0' Power from (select *,'1' aa from Sys_PowerNode union select *,'2' aa from Sys_PowerNode1)bb order by aa desc,PnodeNum";
}
DataSet ds = DataAccess.GetResult(strsql);
DataRow[] dt = ds.Tables[0].Select("len(PnodeNum)=2");
for (int i = 0; i < dt.Length;i++ )
{
TreeNode childNode = new TreeNode();
childNode.Text = dt[i]["PnodeName"].ToString();
if (dt[i]["PNodePage"].ToString() != "")
{
childNode.NavigateUrl = dt[i]["PNodePage"].ToString();
childNode.Target = dt[i]["PNodeTarget"].ToString();
}
else
{
childNode.NavigateUrl = "#";
childNode.Target = "_self";
}
GetChildNodes(dt[i]["PnodeNum"].ToString(), ref childNode, dt[i]["aa"].ToString(), ds);
myNode.ChildNodes.Add(childNode);
}
TreeView1.Nodes.Add(myNode);
} private void GetChildNodes(string parentnode,ref TreeNode parentNode,string type,DataSet ds)
{
//DataSet ds = DataAccess.GetResult("select * from uf_GetUserRolePower('" + UserInfo.SchoolNo + "','" + UserInfo.UserName + "') where substring(pnodenum,1," + parentnode.Length + ")='" + parentnode + "' and len(PnodeNum)-2=" + parentnode.Length + " and aa='" + type + "' and (Power='" + Power + "' or Power='0') order by PnodeNum");
DataRow[] dt = ds.Tables[0].Select("substring(pnodenum,1," + parentnode.Length + ")='" + parentnode + "' and len(PnodeNum)-2=" + parentnode.Length + " and aa='" + type + "' and (Power='" + Power + "' or Power='0')");
for (int i = 0; i < dt.Length;i++ )
{
TreeNode childNode = new TreeNode();
childNode.Text = dt[i]["PnodeName"].ToString();
if (dt[i]["PNodePage"].ToString() != "")
{
childNode.NavigateUrl = dt[i]["PNodePage"].ToString();
childNode.Target = dt[i]["PNodeTarget"].ToString();
}
else
{
childNode.NavigateUrl = "#";
childNode.Target = "_self";
}
GetChildNodes(dt[i]["PnodeNum"].ToString(), ref childNode, type, ds);
parentNode.ChildNodes.Add(childNode);
}
}
-----------------------------------------------------
private ArrayList GetTreeNodeList(TreeView objTreeView)
{
try
{
ArrayList arrayNodes = new ArrayList(); for (int j = 0; j < objTreeView.Nodes.Count; j++)
{
//LeafNodeを取得
GetLeafNodes((TreeNode)arrayNodes[j], treeNodeList);
} return treeNodeList;
}
catch
{
throw;
}
}
//LeafNodeを取得
private void GetLeafNodes(TreeNode treeNode, ArrayList treeNodeList)
{
try
{
if (treeNode.ChildNodes.Count.Equals(0))
{
treeNodeList.Add(treeNode);
}
else
{
for (int m = 0; m < treeNode.ChildNodes.Count; m++)
{
GetLeafNodes(treeNode.ChildNodes[m], treeNodeList);
}
}
}
catch
{
throw;
}
}
改为
GetLeafNodes((objTreeView.Nodes[j]], treeNodeList);
改为
GetLeafNodes((objTreeView.Nodes[j]], arrayNodes );