http://expert.csdn.net/Expert/topic/1385/1385726.xml

解决方案 »

  1.   

    呵呵,在江雨兄的帮助下我在20分钟前刚刚完成这个函数,我也共享,希望对你有帮助。
    这是我写的一个关于操作TreeView的ascx组件。客户端完成check的任务。服务器端代码是从Treeview写入xml,和从xml写入Treeview.
    -----------------------------------------------------------
    <%@ Control Language="c#" AutoEventWireup="false" Codebehind="TreeViewLib.ascx.cs" Inherits="WACR.TreeViewLib" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
    <script language="javascript">////////////设置父节点下所有的子节点的Check值
    function CheckChildren(parentNode,checked)
    {
    var i;
    var len=parentNode.getChildren().length;
        var subNode=new Array();
        var s;
        subNode=parentNode.getChildren();    if(parseInt(subNode.length)!=0)
        {
    for(i=0;i<subNode.length;i++)
    {
      var bCheckBox;
      bCheckBox=subNode[i].getAttribute("checkbox");
      if(bCheckBox!=null)
      {
    subNode[i].setAttribute("checked",checked);
      }
    }    }
    }
    ////////////根据子节点设置ParentNode的Check值,如果父节点的所有子节点都为选中,则它为选中,否则为非选中
    function CheckParentNode(node)
    {
    var i;
    var parentNode=node.getParent();
    if(parentNode!=null)
    {
    var len=parentNode.getChildren().length;
            var subNode=new Array();
            var s;
            subNode=parentNode.getChildren();        bChecked=false;
            if(parseInt(subNode.length)!=0)
            {
    for(i=0;i<subNode.length;i++)
    {
      var bCheckBox;
      var l_bChecked;
      bCheckBox=subNode[i].getAttribute("checkbox");
      if(bCheckBox!=null)
          {
        l_bChecked=subNode[i].getAttribute("checked");
        if(l_bChecked!=null &&l_bChecked==true)
        {
    bChecked=true;
    break;
        }
          }
         }
            }
            alert(bChecked);
            parentNode.setAttribute("checked",bChecked);
    }
    }</script>
    --------------------------------------------------
    /// <summary>
    /// 从TreeView中生成XML文件
    /// </summary>
    /// <param name="tv">Treevie控件</param>
    /// <param name="rootText">根的名称</param>
    /// <returns></returns>
    public string GenXMLFromTreeview(TreeView tv,string rootText)
    {
    MemoryStream s=new MemoryStream();
    XmlTextWriter x = new XmlTextWriter (s, System.Text.Encoding.GetEncoding("GB2312"));
    x.Formatting = Formatting.Indented;
    x.WriteStartDocument(false);
    x.WriteComment("This file represents another fragment of a book store inventory database");

    x.WriteStartElement(rootText);
    x.WriteAttributeString("text",rootText); foreach(TreeNode tn in tv.Nodes)
    {

    AddXMLFromTreeView(tn,x); }
    x.WriteEndElement();
    //Write the XML to file and close the myXmlTextWriter
    x.Flush();
          
    String sXml = System.Text.Encoding.Default.GetString(s.ToArray());
    x.Close();
    return sXml; } public string GenTreeViewFromXML(TreeView tv,string xml)
    {
    string sError="";
    try 
    {
    // SECTION 1. Create a DOM Document and load the XML data into it.
    XmlDocument dom = new XmlDocument();
    dom.LoadXml(xml);
    // SECTION 2. Initialize the TreeView control.
    tv.Nodes.Clear();
    AddTreeViewFromXML(dom.DocumentElement,tv.Nodes); }
    catch(XmlException xmlEx)
    {
    sError=xmlEx.Message;
    }
    catch(Exception ex)
    {
    sError=ex.Message; }
    return sError;
    }

    /// <summary>
    /// 从TreeView中生成XML文件
    /// </summary>
    /// <param name="tn">树结点</param>
    /// <param name="xtw">xmlTextWrite节点</param>
    private void AddXMLFromTreeView(TreeNode tn,XmlTextWriter xtw)
    {
    if(tn==null)
    {
    return;
    } xtw.WriteStartElement("treenode");
    xtw.WriteAttributeString("id",tn.ID);
    xtw.WriteAttributeString("text",tn.Text);
    xtw.WriteAttributeString("checkbox",tn.CheckBox.ToString());
    xtw.WriteAttributeString("checked",tn.Checked.ToString());
    xtw.WriteAttributeString("navigateurl",tn.NavigateUrl);
    xtw.WriteAttributeString("target",tn.Target);
    xtw.WriteAttributeString("imageurl",tn.ImageUrl);
    xtw.WriteAttributeString("expandedimageurl",tn.ExpandedImageUrl); if(tn.Nodes.Count>0)
    {
    foreach(TreeNode node in tn.Nodes)
    { AddXMLFromTreeView(node,xtw);
    } }
    xtw.WriteEndElement(); } /// <summary>
    /// 向TreeView增加节点,数据源来自于xml
    /// </summary>
    /// <param name="inXmlNode">xml node</param>
    /// <param name="tnc">Tree节点集合</param>
    private void AddTreeViewFromXML(XmlNode inXmlNode,TreeNodeCollection  tnc)
    {
    TreeNode tn=null;
    if(inXmlNode==null)
    return;
    tn=new TreeNode();
    if(inXmlNode.Attributes.Count>0)
    {
    tn.Text=inXmlNode.Attributes["text"].Value;
    }
    if(inXmlNode.Attributes.Count>1)
    { tn.ID=inXmlNode.Attributes["id"].Value;
    tn.CheckBox=bool.Parse(inXmlNode.Attributes["checkbox"].Value);
    tn.Checked=bool.Parse(inXmlNode.Attributes["checked"].Value);
    tn.NavigateUrl=inXmlNode.Attributes["navigateurl"].Value;
    tn.Target=inXmlNode.Attributes["target"].Value;
    tn.ImageUrl=inXmlNode.Attributes["imageurl"].Value;
    tn.ExpandedImageUrl=inXmlNode.Attributes["expandedimageurl"].Value;
    } tnc.Add(tn); if(inXmlNode.HasChildNodes)
    {
    foreach(XmlNode xn in inXmlNode.ChildNodes)
    {
    AddTreeViewFromXML(xn,tn.Nodes);
    }
    }
    }
    ----------------------------------------------
    如果好用,就谢江雨兄吧。
    春节快乐
      

  2.   

    调用页面
            function checknode(tree)
            {
             var node;
             node=tree.getTreeNode(tree.clickedNodeIndex);
             CheckChildren(node,node.getAttribute("checked"));
             CheckParentNode(node);
            }如果仅仅为check下面的子节点,那么服务器端的代码就不用要了
      

  3.   

    不过,为什么用以上脚本改变了节点的checkbox属性后,在服务器端遍历treeview时,得到的节点的checkbox属性还是原来的一样??