温馨提示:代码在线浏览功能只能做为源码浏览参考,如果想更进一步了解该代码请下载:多功能在线考试系统改进版源码
当前文件:
OnLineExamUpdate/App_Code/CommonComponent/Tree.cs,打开代码结构图
OnLineExamUpdate/App_Code/CommonComponent/Tree.cs,打开代码结构图1using System; 2
using System.Data; 3
using OnLineExam.DataAccessLayer; 4
5
namespace OnLineExam.CommonComponent 6
{ 7
/// <summary> 8
/// 一个通用的树状菜单类 9
/// </summary> 10
public class Tree 11
{ 12
private string _treeHtml; 13
private DataTable _dataTable; 14
15
/// <summary> 16
/// 根据DataTable对象,生成一棵树 17
/// </summary> 18
/// <param name="dataTable">树中节点的数据</param> 19
/// <returns>树的HTML代码</returns> 20
public string CreateTree(DataTable dataTable) 21
{ 22
this._dataTable = dataTable; 23
this.CreateSubTree(0); 24
return _treeHtml; 25
} 26
27
/// <summary> 28
/// 获取父节点编号为parentId的所有节点,并用DataTable返回 29
/// </summary> 30
/// <param name="parentId">父节点编号</param> 31
/// <returns>DataTable形式的所有孩子节点数据</returns> 32
private DataTable GetChilds(int parentId) 33
{ 34
DataTable childNodes = new DataTable(); 35
childNodes = this._dataTable.Clone(); 36
37
foreach (DataRow dr in this._dataTable.Rows) 38
{ 39
if (Convert.ToInt32(dr["ParentId"]) == parentId) 40
{ 41
childNodes.ImportRow(dr); 42
} 43
} 44
45
return childNodes; 46
} 47
48
/// <summary> 49
/// 判断编号为nodeId的节点是否为叶子节点 50
/// </summary> 51
/// <param name="nodeId">待判断的节点编号</param> 52
/// <returns>是叶子节点:返回true;否则:返回false</returns> 53
private bool IsLeaf(int nodeId) 54
{ 55
foreach (DataRow dr in this._dataTable.Rows) 56
if (Convert.ToInt32(dr["ParentId"]) == nodeId) 57
return false; 58
return true; 59
} 60
61
/// <summary> 62
/// 得到编号为nodeId的节点的父节点编号 63
/// </summary> 64
/// <param name="nodeId">节点编号</param> 65
/// <returns>父节点编号</returns> 66
private int GetParent(int nodeId) 67
{ 68
foreach (DataRow dr in this._dataTable.Rows) 69
if (Convert.ToInt32(dr["NodeId"]) == nodeId) 70
return Convert.ToInt32(dr["ParentId"]); 71
return -1; 72
73
} 74
75
/// <summary> 76
/// 得到编号为nodeId的节点的级别,根节点为0 77
/// </summary> 78
/// <param name="nodeId">待计算的巨额电编号</param> 79
/// <returns>节点的级别,根节点为0</returns> 80
private int GetLevel(int nodeId) 81
{ 82
int parentId = GetParent(nodeId); 83
if (parentId == 0) return 1; 84
else 85
return GetLevel(parentId) + 1; //递归 86
} 87
88
/// <summary> 89
/// 递归生成根编号为nodeId的树 90
/// </summary> 91
/// <param name="nodeId">所要生成子树的根节点</param> 92
private void CreateSubTree(int nodeId) 93
{ 94
DataTable childNodes = this.GetChilds(nodeId); //获取根节点的所有孩子 95
96
//循环生成根节点的所有孩子对应的HTML 97
int childId = 0; 98
foreach (DataRow dr in childNodes.Rows) 99
{ 100
childId = Convert.ToInt32(dr["nodeId"]); 101
this._treeHtml += "<div id=div_" + childId.ToString() + ">"; 102
103
//根据该孩子的级别,生成一些空格,以体现层次结构 104
for (int i = 0; i < GetLevel(childId); i++) 105
this._treeHtml += " "; 106
107
//如果该孩子是叶子节点,则生成其HTML代码 108
if (this.IsLeaf(childId)) 109
{ 110
this._treeHtml += "<img src='..\\Images\\folder.gif'/><a href=" + dr["Url"] + ">" + dr["Text"] + "</a></div>"; 111
} 112
//如果该孩子为中间节点,则首先构造其HTML,然后递归生成其所有孩子的HTML 113
else 114
{ 115
this._treeHtml += "<img src='..\\Images\\folderopen.gif'/><a href=" + dr["Url"] + ">" + dr["Text"] + "</a></div>"; 116
this.CreateSubTree(childId);//递归 117
} 118
} 119
} 120
} 121
}





}