//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 } } }
2、参考http://expert.csdn.net/Expert/topic/1300/1300576.xml?temp=.9916498帖子中楼主的方法。
3、这样可以做到展开时不刷新,其它操作会刷新,但可以保存工作状态。
或者您这样试一下。
找一个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.
我本想找个免费的网站传上去,可是现在网上好像找不到了。
不知哪位做过这方面的研究,请指教。谢谢。
虽然把checkbox的状态改变了,但是没有把这个状态保存到treeview的viewstate中去,这样下次再刷新是就丢失了,而手动check上的过程是1、将checked设为true;2、将状态保存到viewstate中。现在是不知道如何去模拟这个过程。希望高人指点
郁闷中!!!
------------------------------------------------------------------------------
/////根据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>
-----------------------------------------
上述代码不能直接使用,仅供您参考,您要使用可能要进行修改。
下面我把这个文件完整的贴出来。
----------------------------------
<%@ 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> </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> <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)"> </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>
--------------------------------------------
--------------------------------------------- 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());
}
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>
-------------------------------------------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);
}
}
}
}
}累死我了,好大沱啊,希望对您有帮助,同时感谢江雨兄对我的帮助。
1.对于TreeviewLib.ascx.cs中的函数,其实并没有都用上,只有public string GetCheckedIndexFromXml(string xml) 这个是结合客户端使用的,其他的都是在c#端生成树的xml结构的方法,因为写的很辛苦,所以没舍得删除掉。
2.因为在客户端用JavaScript生成最终的xml结构和Check父节点下的子节点,所以必须保证不可以让页面刷新,因为一旦刷新,值就乱了。可能您已经看到了我对于判断是否有重复用户存在的时候是利用javeScript+WebService完成的,这点可谓不爽。但是反正用treeview也得IE 6,所以还可以让我接受。
3.因为时间紧,这些是三个夜晚赶出来的,所以注释很少。您将就看。