树型控件TreeView的几种用法

1 基本用法

 void TreeViewDataBind()
        {
            //首先清除树型控件内的结点
            this.TreeView1.Nodes.Clear();
            //实例出一个结点
            TreeNode tn = new TreeNode();
            tn.Text = "根结点";
            tn.Value = "-1";
            //把这个结点添加到树型控件中
            this.TreeView1.Nodes.Add(tn);
            //添加所有结点的递归方法
            TreeViewBind(tn.ChildNodes, "0");
        }

      

        #region 树型控件递归绑定
        /// <summary>
        /// 添加所有结点的递归方法
        /// </summary>
        /// <param name="tnc">树型控件的结点</param>
        /// <param name="Id">ParentId</param>
        private void TreeViewBind(TreeNodeCollection tnc,string Id)
        {
            //先得到数据库中顶级所有结点
            DataTable dt = Business.SysMenu.GetList("ParentId="+ Id);
            //循环每一行数据
            foreach (DataRow dr in dt.Rows)
            {
                //实例新结点
                TreeNode tn = new TreeNode();
                tn.Text = dr["title"].ToString();
                tn.Value = dr["Id"].ToString();
                //递归出该结点下的子结点
                TreeViewBind(tn.ChildNodes, tn.Value);
                //递归完成后添加到树型控件的结点中
                tnc.Add(tn);
            }
        }
        #endregion

从数据库中读出每个结点绑定到树型控件中

2 递归加遍例

实例:点击某结点,显示出该结点以及子结点下所有文章列表

#region 点击结点所激发的事件
        protected void TV_Medical_SelectedNodeChanged(object sender, EventArgs e)
        {
            //定义承接某结点以及该结点下所有文章的ID号字符变量
            TextId = "";
            DataSet ds = new DataSet();
            //如果点选的是根结点,则显示出所有文章
            if (this.TV_Medical.SelectedNode.Depth == 0)
            {
                ds = Business.MedicalKnowledgeClass.GetList("");
                this.GV_MCText.DataSource = ds;
                this.GV_MCText.DataBind();
                this.Pn_Display.Visible = false;
                this.Pn_GridView.Visible = true;
                return;
               
            }
            //如果选的不是根结点,则递归遍例出该结点以及子结点下所有文章列表
            TextId = GetNodesText(this.TV_Medical.SelectedNode, TextId, Convert.ToInt32(this.TV_Medical.SelectedNode.Value.ToString()));
            //如果有文章
            if (TextId != "")
            {
                ds = Business.MedicalKnowledgeClass.GetList(" MC_Id in (" + TextId + ")");
            }
            else
            {
                //ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "CheckSearch", "alert('该结点下没有任何文章');", true);
                //initPage();
                //DataTable dt = new DataTable();
                //dt.Rows.Add(
                //return;
            }
            //列表绑定
            this.GV_MCText.DataSource = ds;
            this.GV_MCText.DataBind();
            this.Pn_Display.Visible = false;
            this.Pn_GridView.Visible = true;
          
          
        }
        #endregion

        #region 得到某一结点下的所有文章的ID号
        /// <summary>
        /// 利用递归遍历选中结点的所有文章和子结点文章
        /// </summary>
        /// <param name="tnc">选中的结点</param>
        /// <param name="a">用来存储文章ID的变量</param>
        /// <param name="ParentId">要得到文章父结点的编号</param>
        /// <returns>返回存储文章编号的字符串</returns>
       private string GetNodesText(TreeNode tnc,string a,int ParentId)
        {
           //先把当前选中结点下的文章ID存储到全局字符串变量中
            TextId =TextId+ Business.MedicalKnowledgeClass.GetParentText(ParentId);
           //遍历该结点的子结点
            for (int i = 0; i < tnc.ChildNodes.Count; i++)
            {
                //得到每个字节点递归得出子结点下的文章的ID号
                GetNodesText(tnc.ChildNodes[i], TextId,Convert.ToInt32(tnc.ChildNodes[i].Value) );
            }
            return TextId ;
        }
        #endregion

树型控件的外观设置:

ShowLines显示边线

SelectedNodeStyle CssClass="leftNav_active" 选中后变色(加载CSS)

在递归加载树型控件的时候,还有两个属性也要知道

tn.SelectAction = TreeNodeSelectAction.Select;表示该节点在选中后的动作

TreeNodeSelectAction.Select表示选中后引发树型控件的SelectedChanged事件

TreeNodeSelectAction.Expand表示选中后引发树型控件的展开事件

 TreeNodeSelectAction.None什么也不做

TreeNodeSelectAction.SelectExpand表示选中后引发树型控件的SelectedChanged事件+展开事件

另一属性 tn.NavigateUrl = "MedicalKnowledgDisplay_Right.aspx?TextId=" + dr["Mc_ID"].ToString()

该节点的url

Target="right"是选中该节点后在哪个iframe里显示

完整的递归实例:

 #region 树型控件递归方法绑定
        /// <summary>
        /// 树型控件递归出所有结点
        /// </summary>
        /// <param name="tnc">一个结点的实例(根结点)</param>
        /// <param name="ParentId">所属父系结点的ID号</param>
        void MyTreeViewBind(TreeNodeCollection tnc, int ParentId)
        {
            //先得到所有父系结点的结果集
            DataSet ds = Business.MedicalKnowledgeClass.GetList("MC_ParentId=" + ParentId + " and MC_Type=0");
            //循环每一行
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                //实例出一个结点
                TreeNode tn = new TreeNode();
                //给结点的属性付值
                tn.Text = dr["MC_Title"].ToString();
                tn.Value = dr["MC_Id"].ToString();
                //再递归出该结点的子结点
                MyTreeViewBind(tn.ChildNodes, Convert.ToInt32(dr["MC_Id"].ToString()));
                tn.SelectAction = TreeNodeSelectAction.SelectExpand;
                tn.NavigateUrl = "MedicalKnowledgDisplay_Right.aspx?TextId=" + dr["Mc_ID"].ToString();
                //递归出所有结点后,添加给根结点
                tnc.Add(tn);
            }
        }
        #endregion

转载自:http://www.cnblogs.com/yuanweisen/archive/2008/11/23/1339467.html
原文地址:https://www.cnblogs.com/KingStar/p/1631625.html