如果可以的话,把treeview 的AutoPostBack="True"加上,这样就好了, 但是老是刷新啊

解决方案 »

  1.   

    之所以会出现那种错误,可能就是没有及时刷新,viewstate保存了以前的控件状态
      

  2.   

    1、将AutoPostBack设为false,避免频繁刷新。
    2、参考http://expert.csdn.net/Expert/topic/1300/1300576.xml?temp=.9916498帖子中楼主的方法。
    3、这样可以做到展开时不刷新,其它操作会刷新,但可以保存工作状态。
      

  3.   

    嗯,我看了。但是我的目的不是展开不刷新。而是我已经在客户端设置了check的状态,我希望它能在刷新后保留。
    或者您这样试一下。
    找一个TreeView.设置他的第一个节点有checkbox.
    然后把这段js代码放到文件的最后面
    function TreeView1.oncheck()
    {
                 var node;
     if (this.clickedNodeIndex!= null) 
     {
    this.queueEvent('oncheck', this.clickedNodeIndex);    
     }

               node=this.getTreeNode(this.clickedNodeIndex);
               alert(node.getAttribute("checked"));
             CheckChildren(this,node,node.getAttribute("checked"));
             CheckParentNode(this,node);        }应该说是正确的,可是刷新一次后(随便放一个Server button 点击),他就不正确了,呵呵,而且还挺有规律,如果这个节点的checked为true,然后刷新,你会看到这个那个checked(勾)依然保留,说明已经保存到服务器端了,可是你再点一下,那个勾没了,状态应该为False,可是他显示的仍然是true.
    我本想找个免费的网站传上去,可是现在网上好像找不到了。
      

  4.   

    楼主, 我在我的vs环境下试过, 把AutoPostBack="True"加上后, 可以保存treeview的状态,并没有开始时出现的刷新后本来没有选上的选上了, 除了频繁刷新外并没有发现异常
      

  5.   

    猫兄:可是如果那样,就失去了客户端操作的意义了。我感觉这可能是TreeView的问题(bug?),我正在想用另外的方法解决,就是把一切都在客户端上完成,正在解决中。
    不知哪位做过这方面的研究,请指教。谢谢。
      

  6.   

    我也碰到同样问题,我认为是在设置node.setAttribute["checked",true];时
    虽然把checkbox的状态改变了,但是没有把这个状态保存到treeview的viewstate中去,这样下次再刷新是就丢失了,而手动check上的过程是1、将checked设为true;2、将状态保存到viewstate中。现在是不知道如何去模拟这个过程。希望高人指点
    郁闷中!!!
      

  7.   

    经过一段时间的努力,总算是找到了一个解决方案,当然不是很好,那就是完全在客户端操作。函数如下
    ------------------------------------------------------------------------------
    /////根据ID获取TreeNode
    //node:调用时就是TreeView
    function GetNodeByID(node,id)
    {
        var l_node=null;
        var subNode=node.getChildren();
        if(subNode==null)
    return null;
    //alert("sub node "+subNode.length);
    var l_length=subNode.length;
        if(parseInt(subNode.length)!=0)
        {
    for(var i=0;i<l_length;i++)
    {
      var sID;
      //alert("i="+i);
      sID=subNode[i].getAttribute("id");
      if(sID!=null)
      {
    //alert(sID);
    if(sID==id)
    {
    l_node=subNode[i];
    break;
    }
    else
    {
      //alert("前"+sID+"循环"+i+" length="+l_length);
      l_node=GetNodeByID(subNode[i],id);
     // alert(sID+"循环"+i+" length="+l_length);
      if(l_node!=null)
    break;
      //alert(sID+"Length="+l_length);
    }
      }
    }
    }
    return l_node;
    }
    function CheckNodeByID(tree,node,id)
    {
        var l_node=null;
        var subNode=node.getChildren();
        if(subNode==null)
    return null;
    var l_length=subNode.length;
        if(parseInt(l_length)!=0)
        {
    for(var i=0;i<l_length;i++)
    {
      var sID;
      sID=subNode[i].getAttribute("id");
      if(sID!=null)
      {
    if(sID==id)
    {
    l_node=subNode[i];
    var bCheckBox=subNode[i].getAttribute("checkbox");
            if(bCheckBox!=null)
            {
           subNode[i].setAttribute("checked",true);
           tree.queueEvent('oncheck',subNode[i].getNodeIndex());
            }

    break;
    }
    else
    {
      l_node=CheckNodeByID(tree,subNode[i],id);
      if(l_node!=null)
    break;
    }
      }
    }
    }
    return l_node;
    }
    ////////////设置父节点下所有的子节点的Check值
    function CheckChildren(tree,parentNode,checked)
    {
    var i;
    var len=parentNode.getChildren().length;
        var subNode=new Array();
        var s;
        subNode=parentNode.getChildren();
        if(subNode==null)
    return;    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);
    tree.queueEvent('oncheck',subNode[i].getNodeIndex());
      }
      CheckChildren(tree,subNode[i],checked);
    }
        }
    }
    ////////////根据子节点设置ParentNode的Check值,如果父节点的所有子节点都为选中,则它为选中,否则为非选中
    function CheckParentNode(tree,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;
        }
          }
         }
            }
            parentNode.setAttribute("checked",bChecked);
            tree.queueEvent('oncheck',parentNode.getNodeIndex());
            CheckParentNode(tree,parentNode);
    }
    }function  GenXMLFromTreeview(treeView,rootText)
    {
    var xmlDoc = new ActiveXObject("MSXML2.DOMDOCUMENT");
    var str= "version='1.0' encoding='GB2312'";
    node = xmlDoc.createProcessingInstruction("xml", str);
    xmlDoc.appendChild(node);
    node = xmlDoc.createElement(rootText);
    node.text = "treenode";
    xmlDoc.appendChild(node);
    AddXMLFromTreeView(treeView,xmlDoc,node);
    var l_xml=xmlDoc.xml;
    xmlDoc = null;
    return l_xml;}
    function AddXMLFromTreeView(treeNode,xmlDoc,xmlNode)
    {
       if(treeNode==null)
       {
    return;
       }
       var bExpanded=treeNode.getAttribute("expanded");
       treeNode.setAttribute("expanded",true);
       treeNode.setAttribute("expanded",bExpanded);
       var subNode=treeNode.getChildren();
       if(subNode==null)
    return null;

       
       var l_length=subNode.length;
       
       var l_subNode=null;
       var l_value="";
       var l_NewXmlNode=null;
       var l_NewAttribute=null;
       
       if(parseInt(l_length,10)!=0)
       {
         for(var i=0;i<l_length;i++)
     {

    l_subNode=subNode[i];
    l_value=""+l_subNode.getAttribute("text");
    l_value=l_value.Trim();
    l_NewXmlNode = xmlDoc.createElement(l_value); l_value=""+l_subNode.getAttribute("id");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("id");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute); l_value=""+l_subNode.getAttribute("text");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("text");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute); l_value=""+l_subNode.getAttribute("checkbox");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("checkbox");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute); l_value=""+l_subNode.getAttribute("checked");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("checked");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute); l_value=""+l_subNode.getAttribute("navigateurl");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("navigateurl");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute);

    l_value=""+l_subNode.getAttribute("target");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("target");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute);

    l_value=""+l_subNode.getAttribute("imageurl");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("imageurl");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute);

    l_value=""+l_subNode.getAttribute("expandedimageurl");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("expandedimageurl");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute);

    xmlNode.appendChild(l_NewXmlNode);
    AddXMLFromTreeView(l_subNode,xmlDoc,l_NewXmlNode);

     }
    }
    }----------------------------------------
    我的一个调用例子。
    <SCRIPT language="javascript">
    var iCallID = 0; //Web服务句柄
                      //在这里我是把Treeview先绑定到一个TreeNode的Xml文件上,当然他们都没有被Check,然后我把已经存储好的id和Check的内容从数据库里取出放到HidddenIndex这个Hidden控件里。这些都是在C#端完成的   var arr = document.all.HiddenIndex.value.split(",");
    if(arr!=null)
    {
    for (var i=0; i<arr.length; i++)
    {
    CheckNodeByID(TreeView1,TreeView1,arr[i]);

    }
    }

    function TreeView1.oncheck()
    {
                 var node;
             ///先将点击的节点状态保存
     if (this.clickedNodeIndex!= null) 
     {
    this.queueEvent('oncheck', this.clickedNodeIndex);    
     }

               node=this.getTreeNode(this.clickedNodeIndex);
               //alert(node.getAttribute("checked"));
             CheckChildren(this,node,node.getAttribute("checked"));
             CheckParentNode(this,node);        }
            //由于我做的是权限控制的数,所以我把这个TreeView的结构生成Xml文件存在数据表里
            function OnOK()
            {
    document.all.HiddenXml.value=GenXMLFromTreeview(TreeView1,"TreeNode");

    if(document.all.HiddenEdit.value!="1") //插入
    {
    CallWS();
    }
    else
    {
    document.all.ButtonSubmit.click(); //submit
    }

            }
    </SCRIPT>
    -----------------------------------------
    上述代码不能直接使用,仅供您参考,您要使用可能要进行修改。
    下面我把这个文件完整的贴出来。
      

  8.   

    aspx
    ----------------------------------
    <%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
    <%@ Register TagPrefix="uc1" TagName="PathModule" Src="../Modules/PathModule.ascx" %>
    <%@ Page language="c#" Codebehind="UserEdit.aspx.cs" AutoEventWireup="false" Inherits="Traffic.Web.Manage.User.UserEdit" %>
    <%@ Register TagPrefix="uc1" TagName="TreeViewLib" Src="../Modules/TreeViewLib.ascx" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    <HEAD>
    <title>UserEdit</title>
    <meta content="Microsoft Visual Studio 7.0" name="GENERATOR">
    <meta content="C#" name="CODE_LANGUAGE">
    <meta content="JavaScript" name="vs_defaultClientScript">
    <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    <meta http-equiv="Pragma" content="no-cache">
    <script language="javascript">
    function init()
    {
      service.useService("User.asmx?WSDL","User");
    }
    </script>
    </HEAD>
    <body onload="init();" MS_POSITIONING="GridLayout">
    <form id="UserEdit" method="post" runat="server">
    <FONT face="宋体">
    <TABLE id="Table1" style="Z-INDEX: 101; LEFT: 0px; WIDTH: 100%; POSITION: absolute; TOP: 0px" cellSpacing="1" cellPadding="1" width="300" border="0">
    <TR>
    <TD><uc1:pathmodule id="PathModule1" runat="server"></uc1:pathmodule></TD>
    </TR>
    <TR>
    <TD>
    <TABLE id="Table2" cellSpacing="1" cellPadding="1" width="100%" align="center" border="0">
    <TR bgColor="#f3bb30">
    <TD colSpan="4" height="20">
    <DIV align="center"><asp:label id="PracticeLabel1" runat="server" Font-Size="12px" Font-Bold="True" ForeColor="Black">人员</asp:label></DIV>
    </TD>
    </TR>
    <TR>
    <TD style="HEIGHT: 29px" bgColor="#fcf0d1"><FONT color="#ff0000"><FONT color="#000000">登录名</FONT>*</FONT></TD>
    <TD style="HEIGHT: 29px" bgColor="#fcf0d1"><asp:textbox id="TextBoxLoginName" runat="server" CssClass="inputbox"></asp:textbox><asp:requiredfieldvalidator id="ValidatorName" runat="server" ErrorMessage="*登录名不能为空" ControlToValidate="TextBoxLoginName"></asp:requiredfieldvalidator></TD>
    </TR>
    <TR>
    <TD style="HEIGHT: 29px" bgColor="#fcf0d1">口令</TD>
    <TD style="HEIGHT: 29px" bgColor="#fcf0d1"><asp:textbox id="TextBoxPassword1" runat="server" TextMode="Password"></asp:textbox>&nbsp;</TD>
    </TR>
    <TR>
    <TD style="HEIGHT: 29px" bgColor="#fcf0d1">确认口令</TD>
    <TD style="HEIGHT: 29px" bgColor="#fcf0d1"><asp:textbox id="TextBoxPassword2" runat="server" TextMode="Password"></asp:textbox><asp:comparevalidator id="CompareValidator1" runat="server" ErrorMessage="*口令不匹配" ControlToValidate="TextBoxPassword2" ControlToCompare="TextBoxPassword1"></asp:comparevalidator></TD>
    </TR>
    <TR>
    <TD style="HEIGHT: 29px" bgColor="#fcf0d1"><FONT color="#ff0000"><FONT color="#000000">姓名</FONT>*</FONT></TD>
    <TD style="HEIGHT: 29px" bgColor="#fcf0d1"><asp:textbox id="TextBoxUserName" runat="server" CssClass="inputbox"></asp:textbox><asp:requiredfieldvalidator id="Requiredfieldvalidator1" runat="server" ErrorMessage="*姓名不能为空" ControlToValidate="TextBoxUserName"></asp:requiredfieldvalidator></TD>
    </TR>
    <TR>
    <TD style="HEIGHT: 29px" bgColor="#fcf0d1">权限</TD>
    <TD style="HEIGHT: 29px" bgColor="#fcf0d1"><iewc:treeview id="TreeView1" runat="server" TreeNodeSrc="user.xml" Width="200px" Height="300px" ExpandLevel="10"></iewc:treeview><uc1:treeviewlib id="TreeViewLib1" runat="server"></uc1:treeviewlib><INPUT id="HiddenIndex" style="WIDTH: 23px; HEIGHT: 22px" type="hidden" size="1" name="Hidden1" runat="server">
    <INPUT id="HiddenEdit" style="WIDTH: 25px; HEIGHT: 22px" type="hidden" size="1" name="Hidden1" runat="server">
    <INPUT id="HiddenXml" style="WIDTH: 25px; HEIGHT: 22px" type="hidden" size="1" name="Hidden1" runat="server"></TD>
    </TR>
    <TR>
    <TD bgColor="#fcf0d1" colSpan="4">
    <DIV align="center"><asp:button id="ButtonSubmit" style="VISIBILITY: hidden" tabIndex="1" runat="server" CssClass="inputbox" Text="确定"></asp:button>&nbsp;&nbsp;&nbsp;&nbsp;<INPUT style="WIDTH: 78px; HEIGHT: 24px" onclick="OnOK();" type="button" value="确定"></DIV>
    </TD>
    </TR>
    </TABLE>
    <asp:label id="LabelMSG" runat="server" ForeColor="Red" Visible="False">信息</asp:label>
    <DIV id="service" style="BEHAVIOR: url(../../webservice.htc)">&nbsp;</DIV>
    </TD>
    </TR>
    </TABLE>
    </FONT>
    </form>
    <SCRIPT language="javascript">
    var iCallID = 0; //Web服务句柄
       var arr = document.all.HiddenIndex.value.split(",");
    if(arr!=null)
    {
    for (var i=0; i<arr.length; i++)
    {
    CheckNodeByID(TreeView1,TreeView1,arr[i]);

    }
    }

    function TreeView1.oncheck()
    {
                 var node;
             ///先将点击的节点状态保存
     if (this.clickedNodeIndex!= null) 
     {
    this.queueEvent('oncheck', this.clickedNodeIndex);    
     }

               node=this.getTreeNode(this.clickedNodeIndex);
               //alert(node.getAttribute("checked"));
             CheckChildren(this,node,node.getAttribute("checked"));
             CheckParentNode(this,node);        }
            function OnOK()
            {
    document.all.HiddenXml.value=GenXMLFromTreeview(TreeView1,"TreeNode");

    if(document.all.HiddenEdit.value!="1") //插入
    {
    CallWS();
    }
    else
    {
    document.all.ButtonSubmit.click(); //submit
    }

            }
    function CallWS()
    {

    //init();
    iCallID = service.User.callService(OnWsResult,"GetCountByLoginName",document.all.TextBoxLoginName.value);
    }
    function OnWsResult(result)
    {
       // if there is an error, and the call came from the call() in init()
     if(result.error)
     {
    // Pull the error information from the event.result.errorDetail properties
    var xfaultcode   = result.errorDetail.code;
    var xfaultstring = result.errorDetail.string;
    var xfaultsoap   = result.errorDetail.raw; // Add code to handle specific error codes here
    alert("调用WEB服务错误。请确认服务器可用.");
      }
      // if there was no error
      else
      {
    // Show the arithmetic
    if(parseInt(result.value)>0)
    {
    alert("登录名["+document.all.TextBoxLoginName.value+"]已存在!");
    }
    else
    {
    document.all.ButtonSubmit.click(); //submit
    }   }
    }

    </SCRIPT>
    </body>
    </HTML>
    --------------------------------------------
      

  9.   

    c#
    --------------------------------------------- private void GetData()
    {
    Components.User user=new Components.User();
    Components.User.UserDetails ud;
    ud=user.UserGetDetails(m_UserID);
    TextBoxLoginName.Text=ud.loginName;
    TextBoxPassword1.Attributes["Value"]=ud.password;
    TextBoxPassword2.Attributes["Value"]=ud.password;
    TextBoxUserName.Text=ud.userName;

    /////从数据库中找出权限的xml内容,解析出哪一个node被选中 HiddenIndex.Value=TreeViewLib1.GetCheckedIndexFromXml(ud.authority); 

    } private void ButtonSubmit_Click(object sender, System.EventArgs e)
    {
    LabelMSG.Visible=false;
    string l_authority=HiddenXml.Value; //这个HiddenXml就存放着树的xml文件
    Components.User user=new Components.User();
    if(m_Edit==null) //新增 
    {
    if(user.GetCountByLoginName(TextBoxLoginName.Text.Trim())>0)
    {
    LabelMSG.Visible=true;
    LabelMSG.Text="登录名["+TextBoxLoginName.Text.Trim()+"]已存在";
    return;
    }
    user.UserAdd(TextBoxLoginName.Text.Trim(),TextBoxPassword1.Text,l_authority,m_SectionID,TextBoxUserName.Text.Trim());
    }
    else
    {

    user.UserUpdate(m_UserID,TextBoxLoginName.Text.Trim(),TextBoxPassword1.Text,l_authority,m_SectionID,TextBoxUserName.Text.Trim());
    }
    Response.Redirect("UserList.aspx?Key="+m_SectionID.ToString());

    }
      

  10.   

    谢谢紫光,其实我还有两沱没贴,可惜到三次了,补上。因为我把操作TreeView的方法都写在 TreeViewLib这个用户控件中了,所以
    TreeViewLib.ascx<%@ Control Language="c#" AutoEventWireup="false" Codebehind="TreeViewLib.ascx.cs" Inherits="Traffic.Web.Manage.Modules.TreeViewLib" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
    <script language="javascript">
    String.prototype.Trim=function(){return this.replace(/(^\s*)|(\s*$)/g,"");}
    String.prototype.Ltrim = function(){return this.replace(/(^\s*)/g, "");}
    String.prototype.Rtrim = function(){return this.replace(/(\s*$)/g, "");}/////根据ID获取TreeNode
    //node:调用时就是TreeView
    function GetNodeByID(node,id)
    {
        var l_node=null;
        var subNode=node.getChildren();
        if(subNode==null)
    return null;
    //alert("sub node "+subNode.length);
    var l_length=subNode.length;
        if(parseInt(subNode.length)!=0)
        {
    for(var i=0;i<l_length;i++)
    {
      var sID;
      //alert("i="+i);
      sID=subNode[i].getAttribute("id");
      if(sID!=null)
      {
    //alert(sID);
    if(sID==id)
    {
    l_node=subNode[i];
    break;
    }
    else
    {
      //alert("前"+sID+"循环"+i+" length="+l_length);
      l_node=GetNodeByID(subNode[i],id);
     // alert(sID+"循环"+i+" length="+l_length);
      if(l_node!=null)
    break;
      //alert(sID+"Length="+l_length);
    }
      }
    }
    }
    return l_node;
    }
    function CheckNodeByID(tree,node,id)
    {
        var l_node=null;
        var subNode=node.getChildren();
        if(subNode==null)
    return null;
    var l_length=subNode.length;
        if(parseInt(l_length)!=0)
        {
    for(var i=0;i<l_length;i++)
    {
      var sID;
      sID=subNode[i].getAttribute("id");
      if(sID!=null)
      {
    if(sID==id)
    {
    l_node=subNode[i];
    var bCheckBox=subNode[i].getAttribute("checkbox");
            if(bCheckBox!=null)
            {
           subNode[i].setAttribute("checked",true);
           tree.queueEvent('oncheck',subNode[i].getNodeIndex());
            }

    break;
    }
    else
    {
      l_node=CheckNodeByID(tree,subNode[i],id);
      if(l_node!=null)
    break;
    }
      }
    }
    }
    return l_node;
    }
    ////////////设置父节点下所有的子节点的Check值
    function CheckChildren(tree,parentNode,checked)
    {
    var i;
    var len=parentNode.getChildren().length;
        var subNode=new Array();
        var s;
        subNode=parentNode.getChildren();
        if(subNode==null)
    return;    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);
    tree.queueEvent('oncheck',subNode[i].getNodeIndex());
      }
      CheckChildren(tree,subNode[i],checked);
    }
        }
    }
    ////////////根据子节点设置ParentNode的Check值,如果父节点的所有子节点都为选中,则它为选中,否则为非选中
    function CheckParentNode(tree,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;
        }
          }
         }
            }
            parentNode.setAttribute("checked",bChecked);
            tree.queueEvent('oncheck',parentNode.getNodeIndex());
            CheckParentNode(tree,parentNode);
    }
    }function  GenXMLFromTreeview(treeView,rootText)
    {
    var xmlDoc = new ActiveXObject("MSXML2.DOMDOCUMENT");
    var str= "version='1.0' encoding='GB2312'";
    node = xmlDoc.createProcessingInstruction("xml", str);
    xmlDoc.appendChild(node);
    node = xmlDoc.createElement(rootText);
    node.text = "treenode";
    xmlDoc.appendChild(node);
    AddXMLFromTreeView(treeView,xmlDoc,node);
    var l_xml=xmlDoc.xml;
    xmlDoc = null;
    return l_xml;}
    function AddXMLFromTreeView(treeNode,xmlDoc,xmlNode)
    {
       if(treeNode==null)
       {
    return;
       }
       var bExpanded=treeNode.getAttribute("expanded");
       treeNode.setAttribute("expanded",true);
       treeNode.setAttribute("expanded",bExpanded);
       var subNode=treeNode.getChildren();
       if(subNode==null)
    return null;

       
       var l_length=subNode.length;
       
       var l_subNode=null;
       var l_value="";
       var l_NewXmlNode=null;
       var l_NewAttribute=null;
       
       if(parseInt(l_length,10)!=0)
       {
         for(var i=0;i<l_length;i++)
     {

    l_subNode=subNode[i];
    l_value=""+l_subNode.getAttribute("text");
    l_value=l_value.Trim();
    l_NewXmlNode = xmlDoc.createElement(l_value); l_value=""+l_subNode.getAttribute("id");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("id");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute); l_value=""+l_subNode.getAttribute("text");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("text");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute); l_value=""+l_subNode.getAttribute("checkbox");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("checkbox");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute); l_value=""+l_subNode.getAttribute("checked");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("checked");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute); l_value=""+l_subNode.getAttribute("navigateurl");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("navigateurl");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute);

    l_value=""+l_subNode.getAttribute("target");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("target");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute);

    l_value=""+l_subNode.getAttribute("imageurl");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("imageurl");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute);

    l_value=""+l_subNode.getAttribute("expandedimageurl");
    l_value=l_value.Trim();
    l_NewAttribute=xmlDoc.createAttribute("expandedimageurl");
    l_NewAttribute.value = l_value;
    l_NewXmlNode.attributes.setNamedItem(l_NewAttribute);

    xmlNode.appendChild(l_NewXmlNode);
    AddXMLFromTreeView(l_subNode,xmlDoc,l_NewXmlNode);

     }
    }
    }</script>
    <FONT face="宋体"></FONT>
      

  11.   

    TreeViewLib.ascx.cs
    -------------------------------------------namespace Traffic.Web.Manage.Modules
    {
    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using Microsoft.Web.UI.WebControls;
    using System.Xml;
    using System.IO;
    using System.Text; /// <summary>
    /// TreeViewLib 的摘要说明。
    /// </summary>
    public abstract class TreeViewLib : System.Web.UI.UserControl
    { private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    } public string GetCheckedIndexFromXml(string xml)
    {
    string l_r="";
    string sError="";
    StringBuilder sb=new StringBuilder();
    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.
    GetCheckedIndex(dom.DocumentElement,sb);
    l_r=sb.ToString();
    if(l_r.Length>0)
    {
    l_r=l_r.Substring(0,l_r.Length-1);
    } }
    catch(XmlException xmlEx)
    {
    sError=xmlEx.Message;
    }
    catch(Exception ex)
    {
    sError=ex.Message; }
    return l_r;
    } private void GetCheckedIndex(XmlNode xn,StringBuilder sb)
    {
    if(xn==null)
    return;
    if((xn.Attributes!=null)&&(xn.Attributes.Count>2)) //保证该节点有check属性
    {
    if(bool.Parse(xn.Attributes["checked"].Value.ToString())==true)
    {
    sb.Append(xn.Attributes["id"].Value.ToString());
    sb.Append(",");
    }
    }
    if(xn.HasChildNodes)
    {
    foreach(XmlNode x in xn.ChildNodes)
    {
    GetCheckedIndex(x,sb);
    }
    }
    }
    /// <summary>
    /// 根据属性的名称和值查找到某个xml节点
    /// 调用方法(范例)
    ///XmlDocument x=new XmlDocument();
    ///x.LoadXml(TextBox1.Text);
    ///x.GetEnumerator();
    ///if(x.DocumentElement==null)
    ///   return;
    ///XmlNode n;
    ///if((n=GetXmlNodeByAttributeName(x.DocumentElement,"text",TextBox4.Text))!=null)
    ///   TextBox3.Text=n.Name;
    /// </summary>
    /// <param name="xmlNode">节点</param>
    /// <param name="attributeName">属性名称</param>
    /// <param name="attributeValue">属性值</param>
    /// <returns></returns>
    public XmlNode GetXmlNodeByAttributeName(XmlNode xmlNode,string attributeName,string attributeValue)
    {
    string aaa=xmlNode.Name;
    XmlNode l_xn=null;
    if(xmlNode.Attributes==null)
    return l_xn;
    if(xmlNode.Attributes[attributeName]!=null)  //具有这个属性
    {
    if(xmlNode.Attributes[attributeName].Value==attributeValue)
    return xmlNode;
    }

    foreach(XmlNode node in xmlNode.ChildNodes)
    {
    l_xn=GetXmlNodeByAttributeName(node,attributeName,attributeValue);
    if(l_xn!=null)
    {
    return l_xn;
    }
    }
    return l_xn;
    } /// <summary>
    /// 根据xml决定treeview中Node的check值
    /// </summary>
    /// <param name="tv"></param>
    /// <param name="xml"></param>
    public void SetNodeCheckByXml(TreeView tv,string xml)
    {
    if(xml.Trim()=="")
    return;
    if(tv==null)
    return; XmlDocument x=new XmlDocument();
    x.LoadXml(xml);
    x.GetEnumerator();
    if(x.DocumentElement==null)
       return;
    SetNodeCheck(x.DocumentElement,tv.Nodes);
    } private  void SetNodeCheck(XmlNode xmlNode,TreeNodeCollection tvc)
    {
    if(tvc==null)
    return;
    XmlNode xn=null;
    foreach(TreeNode tn in tvc)
    {
    if((xn=GetXmlNodeByAttributeName(xmlNode,"id",tn.ID))!=null)
    {
    tn.Checked=bool.Parse(xn.Attributes["checked"].Value.ToString());

    }
    SetNodeCheck(xmlNode,tn.Nodes);
    }
    } /// <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);
    }
    }
    }
    }
    }累死我了,好大沱啊,希望对您有帮助,同时感谢江雨兄对我的帮助。
      

  12.   

    说明:
    1.对于TreeviewLib.ascx.cs中的函数,其实并没有都用上,只有public string GetCheckedIndexFromXml(string xml) 这个是结合客户端使用的,其他的都是在c#端生成树的xml结构的方法,因为写的很辛苦,所以没舍得删除掉。
    2.因为在客户端用JavaScript生成最终的xml结构和Check父节点下的子节点,所以必须保证不可以让页面刷新,因为一旦刷新,值就乱了。可能您已经看到了我对于判断是否有重复用户存在的时候是利用javeScript+WebService完成的,这点可谓不爽。但是反正用treeview也得IE 6,所以还可以让我接受。
    3.因为时间紧,这些是三个夜晚赶出来的,所以注释很少。您将就看。