关于递归的运行情况?
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Web.UI.WebControls;
using SQLHelper;
namespace MisPersonnel.Components
{
/// <summary>
/// Tree 的摘要说明。
/// </summary>
public class Tree
{
public static string ApplicationPath = "localhost";
public void BindTree(TreeView treeView)
{
Tree tree = new Tree();
DataTable dataTable = tree.GetTrees(MisSystem.PROJECTNAME.ToLower());
treeView.Nodes.Clear(); // 清空树
TreeNode rootnode = new TreeNode();
rootnode.Text = "系统平台"; // 给节点绑定显示值
///作者注:此值请勿随便修改!!!
rootnode.NodeData = MisSystem.PROJECTTREEROOTNODEDATE; // 给节点绑定key值
rootnode.Expanded = false; // 默认根结点为展开
rootnode.NavigateUrl = "MainDesktop.aspx";
rootnode.Target = "MainFrame";
rootnode.ImageUrl = "../Images/Icon/05.gif";
treeView.Nodes.Add(rootnode);
CreateChildNode(rootnode,dataTable); // 加入所有根结点以下的结点
}
public void CreateChildNode(TreeNode parentnode,DataTable dataTable)
{
DataRow[] rowList = dataTable.Select("ParentID='" + parentnode.NodeData + "'");
foreach(DataRow row in rowList)
{
TreeNode tempnode = new TreeNode();
tempnode.Text = row["Title"].ToString();
tempnode.NodeData = row["TreeID"].ToString();
tempnode.Expanded = false;
// tempnode.NavigateUrl = row["Url"].ToString();
tempnode.NavigateUrl = FormatAdminUrl(row["Url"].ToString());
tempnode.Target = "MainFrame";
parentnode.Nodes.Add(tempnode);
CreateChildNode(tempnode,dataTable);
}
}
public DataTable GetTrees(string sProName)
{
///定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
///定义保存从数据库获取的结果的DataReader
SqlDataReader dr = null;
///创建访问数据库的参数
SqlParameter[] paramList = {
sqlHelper.CreateInParam("@ProName",SqlDbType.VarChar,200,sProName)
};
try
{
///执行存储过程
sqlHelper.RunProc("Pr_GetTrees",paramList,out dr);
}
catch(Exception ex)
{
///抛出执行数据库异常
throw new Exception(ex.Message,ex);
}
///获取DataTable对象
DataTable dt = SystemTools.ConvertDataReaderToDataTable(dr);
///返回从数据库获取的结果
return(dt);
}
private string FormatAdminUrl(string adminUrl)
{
if(adminUrl.IndexOf("Admins") > -1)
{
return("Http://" + ApplicationPath + "/" + MisSystem.PROJECTNAME
+ "/" + adminUrl);
}
else
{
return(adminUrl);
}
}
}
}
这里面的在foreach 循环里面面的
CreateChildNode(tempnode,dataTable);是怎么运行的.(运行的前后) 是不是先把Foreach 循环完了.再去递归还是..运行一次就递回一次...
如果是后者..不晓得怎么理解...
请高手指点..