TreeView学习笔记20100812:TreeView+IFrame,设置默认页面

适用情况:TreeView+IFrame,点击某个叶子节点,IFrame中显示相应的页面。

要求:第一次加载时,IFrame中有默认页面;有子节点的树节点,其跳转页面设置为第一个叶子节点的跳转页面,否则不可点击。

准备:

1、获取数据集合,比如DataTable

2、动态加载节点,其子节点设置NavigateUrl、Target属性

 

相关代码

1、前台

代码
       <div id="treeview" style="overflow: auto;">
              
<asp:TreeView ImageSet="WindowsHelp" ID="tvClass" runat="server" ShowLines="True" LineImagesFolder="~/TreeLineImages">
              
</asp:TreeView>
       
</div>
       
<div id="divFrame">
              
<iframe id="ifNewsSet" name="ifNewsSet" frameborder="0" scrolling="no" style="width: 100%; height: 100%" 
src='<%= DefaultPageUrl %>'></iframe>
       
</div>

 

 

2、后台

代码
       public string DefaultPageUrl = string.Empty;    //IFrame的默认页面链接(页面加载事件前定义)

       
private void GetDataTree()
       {
            
using (DataTable tClass = NewsClassInfo.GetAllClass())
            {
                
if (tClass == null || tClass.Rows.Count == 0)
                {
                    
return;
                }

                
//TreeView的第一个叶子节点的值
                string strFirstLeatNodeValue = string.Empty;

                
//动态添加节点
                foreach (DataRow dr in tClass.Rows)
                {
                    TreeNode root 
= new TreeNode(dr["ClassName"].ToString(), dr["ClassId"].ToString());
                    root.ImageUrl 
= Page.ResolveUrl("~/images/org-bg.gif");
                    tvClass.Nodes.Add(root);

                    DataTable dtChildClass 
= ClassInfo.getChildClassById(dr["ClassId"].ToString());
                    
if (dtChildClass == null || dtChildClass.Rows.Count == 0)
                    {
                        
continue;
                    }

                    
foreach (DataRow drDetail in dtChildClass.Rows)
                    {
                        TreeNode tn 
= new TreeNode(drDetail["ClassName"].ToString(), drDetail["ClassId"].ToString());
                        tn.ImageUrl 
= Page.ResolveUrl("~/images/bgClass.gif");
                        tn.NavigateUrl 
= Page.ResolveUrl("~/News/NewsSet.aspx?ClassId=" + dr["ClassId"].ToString());
                        tn.Target 
= "ifNewsSet";
                        root.ChildNodes.Add(tn);
                    }

                    
//设置第一个叶子节点的值,并加载所有子表
                    if (string.IsNullOrEmpty(strFirstLeatNodeValue))
                    {
                        strFirstLeatNodeValue 
= dtChildClass.Rows[0]["ClassId"].ToString();
                    }

                }

                
//遍历TreeView,凡是有叶子节点的父节点,选中后,Iframe默认为其第一个叶子节点指向的页面;否则,不可选。
                WebCommon.SetNodeUrlByFirstLeafNode(this.tvClass);

                
//设置IFrame的默认页面
                TreeNode defautSelectNode = WebCommon.SelectNode(this.tvClass, strFirstLeatNodeValue);
                DefaultPageUrl 
= defautSelectNode.NavigateUrl;

            }
       }

 

 

3、WebCommon类相关方法:

代码
        #region FromNet: 默认选中TreeView的某个节点

        
/// <summary>
        
/// 选中treeview的某个节点,需要每个node的value不同
        
/// </summary>
        
/// <param name="sNodeValue"></param>
        public static TreeNode SelectNode(TreeView tv, string sNodeValue)
        {
            TreeNode selectedNode 
= new TreeNode();
            
foreach (TreeNode tRoot in tv.Nodes)
            {
                
if (tRoot.Value == sNodeValue)
                {
                    selectedNode 
= tRoot;
                    
break;
                }
                
else
                {
                    
if (tRoot.ChildNodes != null)
                    {
                        TreeNode tTmp 
= null;
                        tTmp 
= WebCommon.FindNode(tRoot, sNodeValue);
                        
if (tTmp != null)
                        {
                            selectedNode 
= tTmp;
                            
break;
                        }
                    }
                }
            }
            selectedNode.Select();
            
return selectedNode;

        }

        
/// <summary>
        
/// 递归查找父节点
        
/// </summary>
        
/// <param name="tnParent">指定一个根节点,然后遍历它</param>
        
/// <param name="strValue">所要查找的节点的value</param>
        public static TreeNode FindNode(TreeNode tnParent, string strValue)
        {
            
if (tnParent == nullreturn null;
            
if (tnParent.Value == strValue) return tnParent;
            TreeNode tnRet 
= null;
            
foreach (TreeNode tn in tnParent.ChildNodes)
            {
                tnRet 
= FindNode(tn, strValue);
                
if (tnRet != nullbreak;
            }
            
return tnRet;
        }

        
#endregion


        
#region 遍历TreeView,设置节点的跳转页面和可选情况

        
/// <summary>
        
/// 遍历TreeView,设置节点的跳转方式,每个节点的跳转设置为其第一个叶子节点的跳转页面
        
/// </summary>
        
/// <param name="tvTree">遍历的树</param>
        public static void SetNodeUrlByFirstLeafNode(TreeView tvTree)
        {
            
if (tvTree == nullreturn;
            
foreach (TreeNode tn in tvTree.Nodes)
            {
                
//无子节点,不可选
                if (tn.ChildNodes.Count == 0)
                {
                    tn.SelectAction 
= TreeNodeSelectAction.None;
                }
                
else
                {
                    SetChildNodeUrl(tn);
                }

            }

        }

        
/// <summary>
        
/// 递归设置子节点的跳转Url
        
/// </summary>
        
/// <param name="tnParent">指定一个根节点</param>
        private static void SetChildNodeUrl(TreeNode tnParent)
        {
            
if (tnParent == nullreturn;
            
foreach (TreeNode tn in tnParent.ChildNodes)
            {
                
//当前节点为叶子节点
                if (tn.ChildNodes.Count == 0)
                {
                    tnParent.NavigateUrl 
= tn.NavigateUrl;
                    tnParent.Target 
= tn.Target;
                    
break;
                }
                
else
                {
                    SetChildNodeUrl(tn);
                }
            }
        }

        
#endregion

 

 

总结

1、动态加载节点,使用方法:

    tvClass.Nodes.Add(root);         //加载根节点

    root.ChildNodes.Add(tn);         
//加载子节点

 

 

2、当前节点不可选择

    tn.SelectAction = TreeNodeSelectAction.None;

 

 

3、选择当前节点

    selectedNode.Select();

 

 

4、使用SRC属性,设置IFrame默认页面

 

 

posted @ 2010-08-14 18:01  薄荷  阅读(2126)  评论(0)    收藏  举报