树是2层的,如下图所示,带check的,怎么遍历把被选中的子几点找出来,把选中的子节点名字放到字符串变量Snode中。
谢谢
  大类1
    |______之类11
    |______之类12
 大类2
    |______之类21
    |______之类22 大类3
    |______之类31
    |______之类32

解决方案 »

  1.   

    private void PrintRecursive(TreeNode treeNode)
    {
       // Print the node.
       System.Diagnostics.Debug.WriteLine(treeNode.Text);
       MessageBox.Show(treeNode.Text);
       // Print each node recursively.
       foreach (TreeNode tn in treeNode.Nodes)
       {
          PrintRecursive(tn);
       }
    }// Call the procedure using the TreeView.
    private void CallRecursive(TreeView treeView)
    {
       // Print each node recursively.
       TreeNodeCollection nodes = treeView.Nodes;
       foreach (TreeNode n in nodes)
       {
          PrintRecursive(n);
       }
    }
      

  2.   

    在webForm中如何实现啊?
    还有就是我点击确定按钮,原来选中的节点被变成没有选中了,这是怎么回事?
      

  3.   

    to 还有就是我点击确定按钮,原来选中的节点被变成没有选中了,这是怎么回事?修改PageLoad事件,例如:
    if( !( this.IsPostBack )
    {
       //初始化树的地方放到这里
    }
      

  4.   

    递推方法实现的算法.参数TreeView1是待遍历树控件, 输出参数nodeTexts最终带出该树控件中所有被选中节点的文本集合.算法是通用的,如果你用的树控件不是我参数中指定的这种,只要稍微修改下就可以了.private void GetCheckedNodeText(Microsoft.Web.UI.WebControls.TreeView TreeView1, out ArrayList nodeTexts)
    {
    ArrayList nodes = new ArrayList();
    nodeTexts = new ArrayList();
    nodes.Add(TreeView1.Nodes[0]);
    for(int i = 0; i < nodes.Count; i++)
    {
    Microsoft.Web.UI.WebControls.TreeNode treeNode = (Microsoft.Web.UI.WebControls.TreeNode)nodes[i];
    if(treeNode.Checked == true)
    nodeTexts.Add(treeNode.Text);
    if(treeNode.Nodes.Count > 0)
    {
    foreach(Microsoft.Web.UI.WebControls.TreeNode child in treeNode.Nodes)
    {
    nodes.Add(child);
    }
    }
    nodes.Remove(treeNode);
    i--;
    }
    }
      

  5.   

    如果你的树最多就两层的话,那就非常简单了,用双层循环逐一判断每一个节点的checked属性,
    如果你不确定树的层数的话,那就用你学编程时学的最早的一个算法(递归)来实现,实现也非常简单,所以代码俺就不给你写了。
      

  6.   

    我是调试通过并且功能正确之后才贴上来的.如果你参数传的正确,结果应该不会出问题.你可以调试跟踪一下输出参数nodeTexts的结果,而不是直接看你的页面.因为有可能你并没有正确的把集合中的数据拿出来.
      

  7.   

    我的测试例子:
    文件 WebForm1.aspx<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="DG.WebForm1" %>
    <%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    <HEAD>
    <title>WebForm1</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name="vs_defaultClientScript" content="JavaScript">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server">
    <FONT face="宋体">
    <iewc:TreeView id="TreeView1" style="Z-INDEX: 101; LEFT: 80px; POSITION: absolute; TOP: 72px" runat="server"
    Width="200px" Height="352px">
    <iewc:TreeNode CheckBox="True" Text="Root">
    <iewc:TreeNode CheckBox="True" Text="Node1"></iewc:TreeNode>
    <iewc:TreeNode CheckBox="True" Text="Node2">
    <iewc:TreeNode CheckBox="True" Text="Node4">
    <iewc:TreeNode CheckBox="True" Text="Node7"></iewc:TreeNode>
    <iewc:TreeNode CheckBox="True" Text="Node8"></iewc:TreeNode>
    </iewc:TreeNode>
    <iewc:TreeNode CheckBox="True" Text="Node5"></iewc:TreeNode>
    </iewc:TreeNode>
    <iewc:TreeNode CheckBox="True" Text="Node3">
    <iewc:TreeNode CheckBox="True" Text="Node6"></iewc:TreeNode>
    </iewc:TreeNode>
    </iewc:TreeNode>
    </iewc:TreeView>
    <asp:ListBox id="ListBox1" style="Z-INDEX: 102; LEFT: 416px; POSITION: absolute; TOP: 136px"
    runat="server" Width="152px" Height="168px"></asp:ListBox>
    <asp:Button id="Button1" style="Z-INDEX: 103; LEFT: 328px; POSITION: absolute; TOP: 184px" runat="server"
    Width="56px" Height="88px" Text=">>"></asp:Button></FONT>
    </form>
    </body>
    </HTML>文件 WebForm1.aspx.csusing System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;namespace DG
    {
    /// <summary>
    /// WebForm1 的摘要说明。
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.ListBox ListBox1;
    protected System.Web.UI.WebControls.Button Button1;
    protected Microsoft.Web.UI.WebControls.TreeView TreeView1;

    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Button1.Click += new System.EventHandler(this.Button1_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void GetCheckedNodeText(Microsoft.Web.UI.WebControls.TreeView TreeView1, out ArrayList nodeTexts)
    {
    ArrayList nodes = new ArrayList();
    nodeTexts = new ArrayList();
    nodes.Add(TreeView1.Nodes[0]);
    for(int i = 0; i < nodes.Count; i++)
    {
    Microsoft.Web.UI.WebControls.TreeNode treeNode = (Microsoft.Web.UI.WebControls.TreeNode)nodes[i];
    if(treeNode.Checked == true)
    nodeTexts.Add(treeNode.Text);
    if(treeNode.Nodes.Count > 0)
    {
    foreach(Microsoft.Web.UI.WebControls.TreeNode child in treeNode.Nodes)
    {
    nodes.Add(child);
    }
    }
    nodes.Remove(treeNode);
    i--;
    }
    } private void Button1_Click(object sender, System.EventArgs e)
    {
    ArrayList texts = null;
    GetCheckedNodeText(TreeView1, out texts);
    for(int i = 0; i < texts.Count; i++)
    {
    ListBox1.Items.Add((string)texts[i]);
    }
    }
    }
    }
      

  8.   

    你的例子是可以的。我在你的例子里添加了选中父节点就能它下面的子节点也选中,就不能把选中的节点读取出来了。能帮我看下代码吗?
    <%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls" %>
    <%@ Page language="c#" Codebehind="WebForm6.aspx.cs" AutoEventWireup="false" Inherits="wl.WebForm6" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    <HEAD>
    <script language="C#" runat="server">
       private void Page_Load(object sender, System.EventArgs e)
       {   
        TreeView1.Attributes.Add("oncheck","tree_oncheck(this)");
       }
      </script>
      <script language="javascript">
    <!--
    //初始化选中节点
    function initchecknode()
    {
     var node=TreeView1.getTreeNode("1");
     node.setAttribute("Checked","true");
     setcheck(node,"true"); 
     FindCheckedFromNode(TreeView1);
    }
    //oncheck事件
    function tree_oncheck(tree)
    {
     var node=tree.getTreeNode(tree.clickedNodeIndex);
     var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked");
     setcheck(node,Pchecked);
     document.all.checked.value="";
     document.all.unchecked.value="";
     FindCheckedFromNode(TreeView1);
    }
    //设置子节点选中
    function setcheck(node,Pc)
    {
     var i;
     var ChildNode=new Array();
     ChildNode=node.getChildren();
     
     if(parseInt(ChildNode.length)==0)
      return;
     else
     {
      for(i=0;i<ChildNode.length;i++)
      {
       var cNode;
       cNode=ChildNode[i];
       if(parseInt(cNode.getChildren().length)!=0)
        setcheck(cNode,Pc);
       cNode.setAttribute("Checked",Pc);
      }
     }
    }
    //获取所有节点状态
    function FindCheckedFromNode(node) {
     var i = 0;
     var nodes = new Array();
     nodes = node.getChildren();
     
     for (i = 0; i < nodes.length; i++) {
      var cNode;
      cNode=nodes[i];
      if (cNode.getAttribute("Checked"))
       AddChecked(cNode);
      else
          AddUnChecked(cNode);
      
      if (parseInt(cNode.getChildren().length) != 0 ) {
       FindCheckedFromNode(cNode);
      }
     }
    }
    //添加选中节点
    function AddChecked(node) {
     document.all.checked.value += node.getAttribute("NodeData");
     document.all.checked.value += ',';
    }
    //添加未选中节点
    function AddUnChecked(node) {
     document.all.unchecked.value += node.getAttribute("NodeData");
     document.all.unchecked.value += ',';
    }
    //-->
      </script> <title>WebForm6</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name="vs_defaultClientScript" content="JavaScript">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server">
    <FONT face="宋体">
    <iewc:TreeView id="TreeView1" style="Z-INDEX: 101; LEFT: 48px; POSITION: absolute; TOP: 40px" runat="server"
    Width="200px" Height="352px">
    <iewc:TreeNode CheckBox="True" Text="Root">
    <iewc:TreeNode CheckBox="True" Text="Node1"></iewc:TreeNode>
    <iewc:TreeNode CheckBox="True" Text="Node2">
    <iewc:TreeNode CheckBox="True" Text="Node4">
    <iewc:TreeNode CheckBox="True" Text="Node7"></iewc:TreeNode>
    <iewc:TreeNode CheckBox="True" Text="Node8"></iewc:TreeNode>
    </iewc:TreeNode>
    <iewc:TreeNode CheckBox="True" Text="Node5"></iewc:TreeNode>
    </iewc:TreeNode>
    <iewc:TreeNode CheckBox="True" Text="Node3">
    <iewc:TreeNode CheckBox="True" Text="Node6"></iewc:TreeNode>
    </iewc:TreeNode>
    </iewc:TreeNode>
    </iewc:TreeView>
    <asp:ListBox id="ListBox1" style="Z-INDEX: 102; LEFT: 416px; POSITION: absolute; TOP: 136px"
    runat="server" Width="152px" Height="168px"></asp:ListBox>
    <asp:Button id="Button1" style="Z-INDEX: 103; LEFT: 328px; POSITION: absolute; TOP: 184px" runat="server"
    Width="56px" Height="88px" Text=">>"></asp:Button></FONT>
    </form>
    </body>
    </HTML>
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.Odbc;
    using System.Data.OracleClient;
    using   Microsoft.Web.UI.WebControls;  
    namespace wl
    {
    /// <summary>
    /// Summary description for WebForm6.
    /// </summary>
    public class WebForm6 : System.Web.UI.Page
    {
    protected Microsoft.Web.UI.WebControls.TreeView TreeView1;
    protected System.Web.UI.WebControls.ListBox ListBox1;
    protected System.Web.UI.WebControls.Button Button1;
        protected   DataSet   ds;

    private void Page_Load(object sender, System.EventArgs e)
    {
             TreeView1.Attributes.Add("oncheck","tree_oncheck(document.getElementById('TreeView1'))"); 
    }
    private void GetCheckedNodeText(Microsoft.Web.UI.WebControls.TreeView TreeView1, out ArrayList nodeTexts)
    {
    ArrayList nodes = new ArrayList();
    nodeTexts = new ArrayList();
    nodes.Add(TreeView1.Nodes[0]);
    for(int i = 0; i < nodes.Count; i++)
    {
    Microsoft.Web.UI.WebControls.TreeNode treeNode = (Microsoft.Web.UI.WebControls.TreeNode)nodes[i];
    if(treeNode.Checked == true)
    nodeTexts.Add(treeNode.Text);
    if(treeNode.Nodes.Count > 0)
    {
    foreach(Microsoft.Web.UI.WebControls.TreeNode child in treeNode.Nodes)
    {
    nodes.Add(child);
    }
    }
    nodes.Remove(treeNode);
    i--;
    }
    }
    #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: This call is required by the ASP.NET Web Form Designer.
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {    
    this.Button1.Click += new System.EventHandler(this.Button1_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void Button1_Click(object sender, System.EventArgs e)
    {

    ArrayList texts = null;
    GetCheckedNodeText(TreeView1, out texts);
    for(int i = 0; i < texts.Count; i++)
    {
    ListBox1.Items.Add((string)texts[i]);
    }
    } }
    }
      

  9.   

    你的代码看得不是很明白,我写了一个实现同样功能得函数(即钩选某个节点,该节点下的分支也被选中):
    void SetBranchChecked(System.Windows.Forms.TreeNode node)
    {
    System.Collections.ArrayList al = new System.Collections.ArrayList();
    bool IsChecked = node.Checked;
    foreach(System.Windows.Forms.TreeNode curNode in node.Nodes)
    {
    curNode.Checked = IsChecked;
    foreach(System.Windows.Forms.TreeNode childNode in curNode.Nodes)
    {
    al.Add(childNode);
    }
    al.Remove(curNode);
    }
    }*注:我是在WinForm下做的测试,所以你可能需要修改一下.在调用取出钩选的节点的值的那个函数之前先调用这个函数就行了.