Bolik‘s AIO Blog
All In One Team Blog

 

该算法思想是

        第一步循环完成TreeNode构建

        第二次循环完成层次结构构建

        数据存储采用一般层次结构存储方式  一次调用数据库完成所有所需数据  采用数组索引存储树节点与ParentSQN避免了查找性能上的缺点

表格:

DepartmentID 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 

数据调用代码:

[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);
  }

}

数结构构建代码:

 

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]);
    }

  }

}
posted on 2006-09-09 11:35  Bolik  阅读(1413)  评论(11编辑  收藏  举报