TreeView的遍历(转)

  权限分配当然连接数据了,就会用到Treeview这个控件。它的节点ID肯定绑到数据库表里的ID了,怎么得到 Treeview里的全部节点的ID。

for (int i = 0; i < TreeView1.Nodes.Count; i++)
{
       if (TreeView1.Nodes[i].Selected == true)
        {
            Response.Write(TreeView1.Nodes[i].Value.ToString());
          }
}
foreach (TreeNode tree in TreeView1.Nodes)
     {

      if (tree.Checked == true)
           {
              Response.Write(tree.Value.ToString());
    }

}这两个只能取到根节点的节点ID。子节点怎么办?

从网上查了下,基本上就是这样做:

在TreeView查找某一节点,通常有两种方法,一种是递归的,一种不是递归,但都是深度优先算法。其中,非递归方法效率高些,而递归算法要简洁一些。


第一种,递归算法,代码如下:

   

private TreeNode FindNode( TreeNode tnParent, string strValue )

    {

        if( tnParent == null ) return null;

        if( tnParent.Text == strValue ) return tnParent;

 

        TreeNode tnRet = null;

        foreach( TreeNode tn in tnParent.Nodes )

        {

            tnRet = FindNode( tn, strValue );

            if( tnRet != null ) break;

        }

        return tnRet;

    }

 

第二种,非递归算法,代码如下:

   

private TreeNode FindNode( TreeNode tnParent, string strValue )

    {

        if( tnParent == null ) return null;

 

        if( tnParent.Text == strValue ) return tnParent;

        else if( tnParent.Nodes.Count == 0 ) return null;

 

        TreeNode tnCurrent, tnCurrentPar;

 

        //Init node

        tnCurrentPar = tnParent;

        tnCurrent = tnCurrentPar.FirstNode;

 

        while( tnCurrent != null && tnCurrent != tnParent )

        {

            while( tnCurrent != null )

            {

                if( tnCurrent.Text == strValue ) return tnCurrent;

                else if( tnCurrent.Nodes.Count > 0 )

                {

                    //Go into the deepest node in current sub-path

                    tnCurrentPar = tnCurrent;

                    tnCurrent = tnCurrent.FirstNode;

                }

                else if( tnCurrent != tnCurrentPar.LastNode )

                {

                    //Goto next sible node

                    tnCurrent = tnCurrent.NextNode;

                }

                else

                    break;

            }

              

            //Go back to parent node till its has next sible node

            while( tnCurrent != tnParent && tnCurrent == tnCurrentPar.LastNode )

            {

                tnCurrent = tnCurrentPar;

                tnCurrentPar = tnCurrentPar.Parent;

            }

 

            //Goto next sible node

            if( tnCurrent != tnParent )

                tnCurrent = tnCurrent.NextNode;

        }

        return null;

    }

 

       程序调用,如下:

      

TreeNode tnRet = null;

        foreach( TreeNode tn in yourTreeView.Nodes )

        {

            tnRet = FindNode( tn, yourValue );

            if( tnRet != null ) break;

        }

===================================================================================或:

        private void button1_Click_1(object sender, EventArgs e)
        {
            TreeView tree;
            foreach (TreeNode node in tree.Nodes)
            {
                GetNode(node);
            }
        }
        void GetNode(TreeNode node)
        {
            foreach (TreeNode n in node.Nodes)
            {
                Console.WriteLine(n.Name);
                GetNode(n);
            }
        }

我试了下,方法是对的,但是具体代码不太对,运行出错。哎,只好自己写,下面是我写的,测试过了,可以运行。写得不好,有点麻烦,用的递归

public void GetNode(TreeNodeCollection tc)
    {
        foreach (TreeNode TNode in tc)
        {
            if (TNode.Parent == null)
            {
                Response.Write(TNode.Value.ToString());
            }
            if (TNode.ChildNodes.Count == 0)
            {
                Response.Write(TNode.Value.ToString());
            }
            else
            {
                GetNode(TNode.ChildNodes);
               
            }
          
        }
       
    }
调用:

TreeNodeCollection tc = TreeView1.Nodes;
        GetNode(tc);

转载于:https://www.cnblogs.com/hanyihua99/archive/2009/03/26/1422114.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值