Evil 域

当Evil遇上先知

导航

TreeView与递归

Posted on 2007-05-16 23:02  Saar  阅读(533)  评论(1编辑  收藏  举报
背景:今天遇到这么一个情况:
需要绑定SiteMap中的一部分内容到一个TreeView控件中,SiteMap结构如下:
<?xml version="1.0" encoding="utf-8"?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
  
<siteMapNode url="~/Default.aspx" title="首页">
    
<siteMapNode url="~/AddReport.aspx" title="影片报错"></siteMapNode>
    
    
<siteMapNode url="~/Recommand.aspx" title="影片推荐"></siteMapNode>
    
<siteMapNode url="" title="启明星电影后台">
      
<siteMapNode url="" title="系统功能" description="启明星电影管理系统">
        
<siteMapNode url="~/Manager/Default.aspx" roles="Administrators" title="启明星电影后台"></siteMapNode>
        
<siteMapNode url="~/Manager/NoticeManager.aspx" title="公告管理"></siteMapNode>
        
<siteMapNode url="" title="管理员管理">
          
<siteMapNode url="~/Manager/AddManager.aspx" title="添加管理员"></siteMapNode>
          
<siteMapNode url="~/Manager/Managers.aspx" title="管理管理员"></siteMapNode>
        
</siteMapNode>
        
      
</siteMapNode>
    
</siteMapNode>
  
</siteMapNode>
</siteMap>

例如,我要将title为“启明星电影后台”(下文称目标节点)的结点开始的内容绑定到TreeView,但又不想绑定其上方的节点。有一个SiteMap.CurrentNode可以获取当前的节点,于是,问题转化为,根据当前的节点,来定位目的结点。于是,最后使用了一个递归函数解决了这个问题:
    private SiteMapNode GetBackRootNode(SiteMapNode currentNode,string title)
    {
        
if (currentNode.Title == title) return currentNode;  //如果找到,则返回此节点。
        if (currentNode == SiteMap.RootNode) return currentNode;  //如果是首结点,则返回首节点,此处也可以抛了节点不存在的异常。
        return GetBackRootNode(currentNode.ParentNode,title);  //到Parent节点找。
    }
树是一种很特别的结构,其很多关系可以通过Parent或者Children来表达,于是,就会形成很多可以递归解决的方法。在遇到与Tree相关的内容时,多考虑一下使用递归,也许问题会转化得很简单。