三种方式实现递归树加载
1、数据库实现:
可以将此段数据库代码修改为存储过程实现:
with temp
as
(SELECT * FROM EKP_Module WHERE mod_parentid = 2165
UNION ALL
SELECT m.* FROM EKP_Module AS m
INNER JOIN temp AS child ON m.mod_parentid = child.mod_id
)
select * from temp
2、Linq to Sql实现:
public IEnumerable<APPModuleInfo> GetModulesByPID(int p_id)
{
IQueryable<APPModuleInfo> mods = from m in ekpEntities.EKP_MODULE
where m.mod_parentid == p_id
select new APPModuleInfo
{
ModId = m.mod_id,
ModLink = m.ModLink,
ModName = m.mod_name,
ModParentId = m.mod_parentid
};
return mods.ToList().Concat(mods.ToList().SelectMany(m => GetModulesByPID(m.ModId)));
}
3、常规方式实现:
public void AddTree(string ParentID, TreeNode pNode)
{
if (ds.Tables.Count > 0)
{
DataView dvTree = new DataView(ds.Tables[0]);
//过滤ParentOrgID,得到当前的所有子节点
dvTree.RowFilter = "[IndexParentID] = '" + ParentID + "' and [StatusFlag]='1'";
foreach (DataRowView Row in dvTree)
{
TreeNode node = new TreeNode();
if (pNode == null)
{ //添加根节点
node.Text = Row["IndexName"].ToString();
node.Value = Row["IndexID"].ToString();
TreeView1.Nodes.Add(node);
AddTree(Row["IndexID"].ToString(), node); //再次递归
}
else
{ //添加当前节点的子节点
node.Text = Row["IndexName"].ToString();
node.Value = Row["IndexID"].ToString();
pNode.ChildNodes.Add(node);
AddTree(Row["IndexID"].ToString(), node); //再次递归
}
}
dvTree.Dispose();
ds.Dispose();
}
}