您的位置:首页 > 编程语言 > ASP

即使asp:TreeView有几万个节点,也让IE不死的解决方法

2009-04-21 18:27 288 查看
背景介绍:


<ReturnInfo>
<Success>true</Success>
<OrganizationData>
<Organization unitid='0' punitid = '' unitcode='BELLE' unitname = 'XXX国际控股' hasauthoriry = '1'>
<Organization unitid=' 12205083-c0a7-4f54-b8e5-8f0643fe3b84' punitid = '0' unitcode=' YG' unitname = '云贵'
hasauthoriry = '0'>
<Organization unitid=' ab68bcb7-4e10-49b7-8923-527bafa340ec' punitid = '12205083-c0a7-4f54-b8e5-8f0643fe3b84'
unitcode=' YGYN' unitname = '云南省' hasauthoriry = '0'>
<Organization unitid=' 61dd0f74-d576-4963-988e-ff9cec4b92ee' punitid = 'ab68bcb7-4e10-49b7-8923-527bafa340ec'
unitcode=' YGYN1' unitname = '总经理室' hasauthoriry = '1'>
</Organization>
</Organization>
</Organization>
</Organization>
</OrganizationData>
</ReturnInfo>
下面是前台HTML代码:

用了UpdatePanel是为了在展开子节点时实现局部刷新。
在OnTreeNodeExpanded展开节点事件中加载此节点的孙子节点。
在OnTreeNodeCheckChanged点选CheckBox事件中,处理哪些节点被选中,定义了一个Session变量,向Session中添加或移除此组织及它的子组织。

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:TreeView ID="TreeViewOrg" runat="server" OnClick="OnTreeNodeChecked()" ShowCheckBoxes="All"
OnTreeNodeExpanded="TreeViewOrg_TreeNodeExpanded"
OnTreeNodeCheckChanged="TreeViewOrg_TreeNodeCheckChanged"
ExpandDepth="1" ShowLines="true">
<DataBindings>
<asp:TreeNodeBinding DataMember="Organization" SelectAction="None" ValueField="UnitID"
TextField="UnitName" TargetField="HasAuthority" />
</DataBindings>
</asp:TreeView>
<asp:XmlDataSource ID="XmlDataSource1" runat="server"></asp:XmlDataSource>
</ContentTemplate>
</asp:UpdatePanel>

下面是前台JS代码:

OnTreeNodeChecked() 方法实现了在Treeview上选中某一个节点时自动选中其所有子节点。
postBackByObject() 方法是为了在点CheckBox时,可以提交到后台去处理。

<script language='javascript' type='text/javascript'>
function OnTreeNodeChecked() {
var ele = event.srcElement;
if (ele.type == 'checkbox') {
var childrenDivID = ele.id.replace('CheckBox', 'Nodes');
var div = document.getElementById(childrenDivID);
if (div == null) return;
var checkBoxs = div.getElementsByTagName('INPUT');
for (var i = 0; i < checkBoxs.length; i++) {
if (checkBoxs[i].type == 'checkbox')
checkBoxs[i].checked = ele.checked;
}
postBackByObject();
}
}

//点击复选框时触发事件
function postBackByObject() {
var o = window.event.srcElement;
if (o.tagName == "INPUT" && o.type == "checkbox") {
//这里的第一个参数是UpdatePanel ID,因为我使用了MS的ASPAJAX来实现局部刷新
//如果没有使用MS的ASPAJAX,这里的两个参数都可以为空
__doPostBack("UpdatePanel1", "");
}
}
</script>

后台代码

第一次进入页面给TreeView绑定前三层组织(注释中有详细说明):

private void BindOrgTree()
private string GetNewXmlNodeString(XmlNode xmlNode)
public void HiddenNoAuthorityNodeCheckBox(TreeNodeCollection treeNodes)
protected void TreeViewOrg_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
private XmlNodeList GetXmlNodeChildNodeListByValue(string value)
protected void TreeViewOrg_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
private XmlNode GetXmlNodeByValue(string value)
public void GetSelectedOrganization(XmlNodeList nodeList, bool selected)
foreach (XmlNode xmlNode in nodeList)
if (selected)
string xx = xmlNode.Attributes["UnitName"].Value;
if (Session["SelectedOrganizationIDs"] != null)
if (Session["SelectedOrganizationIDs"].ToString().IndexOf(xmlNode.Attributes["UnitID"].Value + ";") < 0)
Session["SelectedOrganizationIDs"] = Session["SelectedOrganizationIDs"].ToString()
+ xmlNode.Attributes["UnitID"].Value + ";";
}
}
else
Session["SelectedOrganizationIDs"] = xmlNode.Attributes["UnitID"].Value + ";";
}
}
else
string xx = xmlNode.Attributes["UnitName"].Value;
if (Session["SelectedOrganizationIDs"] != null)
Session["SelectedOrganizationIDs"] = Session["SelectedOrganizationIDs"].ToString().Replace(xmlNode.Attributes["UnitID"].Value + ";", "");
}
}
GetSelectedOrganization(xmlNode.ChildNodes, selected);
}
}

大家如果用更好的解决方法,请不忘跟贴赐教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: