该算法思想是
第一步循环完成TreeNode构建
第二次循环完成层次结构构建
数据存储采用一般层次结构存储方式 一次调用数据库完成所有所需数据 采用数组索引存储树节点与ParentSQN避免了查找性能上的缺点
表格:
DepartmentID uniqueidentifier,
DepartmentSQN int,
DepartmentName nvarchar(32),
ParentID uniqueidentifier
DepartmentSQN int,
DepartmentName nvarchar(32),
ParentID uniqueidentifier
存储过程:
CREATE PROCEDURE dbo.Department_SelectCore
AS
SET NOCOUNT ON
SELECT DepartmentID, DepartmentSQN, DepartmentName, ParentID ,
(SELECT DepartmentSQN FROM Department Parent WHERE (Parent.DepartmentID = Department.ParentID)) AS
ParentSQN
FROM Department
ORDER BY DepartmentSQN
RETURN
AS
SET NOCOUNT ON
SELECT DepartmentID, DepartmentSQN, DepartmentName, ParentID ,
(SELECT DepartmentSQN FROM Department Parent WHERE (Parent.DepartmentID = Department.ParentID)) AS
ParentSQN
FROM Department
ORDER BY DepartmentSQN
RETURN
数据调用代码:
[DataObject(true)]
public class DepartmentDataObject
{
[DataObjectMethod(DataObjectMethodType.Select, true)]
public static DataSet ReadCore()
{
Database db = DatabaseFactory.CreateDatabase("WorkItemTrack");
string sqlCommand = "Department_SelectCore"
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
db.AddReturnValueParameter(dbCommand);
return db.ExecuteDataSet(dbCommand);
}
}
public class DepartmentDataObject
{
[DataObjectMethod(DataObjectMethodType.Select, true)]
public static DataSet ReadCore()
{
Database db = DatabaseFactory.CreateDatabase("WorkItemTrack");
string sqlCommand = "Department_SelectCore"
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
db.AddReturnValueParameter(dbCommand);
return db.ExecuteDataSet(dbCommand);
}
}
数结构构建代码:
protected void BuildTree()
{
_DepartmentTreeView.Nodes.Clear();
DataSet ds = DepartmentDataObject.ReadCore();
int Count = ds.Tables[0].Rows.Count;
TreeNode[] Nodes = new TreeNode[Count + 1];
Nullable<int>[] ParentSQNs = new Nullable<int>[Count + 1];
foreach (DataRow dr in ds.Tables[0].Rows)
{
Nodes[((int)dr["DepartmentSQN"])] = new TreeNode((string)dr["DepartmentName"], ((Guid)dr["DepartmentID"]).ToString());
try
{
ParentSQNs[(int)dr["DepartmentSQN"]] = (int)dr["ParentSQN"];
}
catch
{
ParentSQNs[(int)dr["DepartmentSQN"]] = null;
}
}
for (int i = 1; i < Count + 1; i++)
{
if (ParentSQNs[i].HasValue)
{
Nodes[ParentSQNs[i].Value].ChildNodes.Add(Nodes[i]);
}
else
{
_DepartmentTreeView.Nodes.Add(Nodes[i]);
}
}
}
{
_DepartmentTreeView.Nodes.Clear();
DataSet ds = DepartmentDataObject.ReadCore();
int Count = ds.Tables[0].Rows.Count;
TreeNode[] Nodes = new TreeNode[Count + 1];
Nullable<int>[] ParentSQNs = new Nullable<int>[Count + 1];
foreach (DataRow dr in ds.Tables[0].Rows)
{
Nodes[((int)dr["DepartmentSQN"])] = new TreeNode((string)dr["DepartmentName"], ((Guid)dr["DepartmentID"]).ToString());
try
{
ParentSQNs[(int)dr["DepartmentSQN"]] = (int)dr["ParentSQN"];
}
catch
{
ParentSQNs[(int)dr["DepartmentSQN"]] = null;
}
}
for (int i = 1; i < Count + 1; i++)
{
if (ParentSQNs[i].HasValue)
{
Nodes[ParentSQNs[i].Value].ChildNodes.Add(Nodes[i]);
}
else
{
_DepartmentTreeView.Nodes.Add(Nodes[i]);
}
}
}