[Ext.Net]TreePanel 异步加载数据
异步加载数据指的是页面加载的时候只显示根目录,点击根目录再去加载其子目录。
下面就来介绍下这种异步加载的树结构要怎么实现
现将例子的图 
- 前台画面中要布局下树TreePanel ,在异步加载中,这个树一定要有根节点(root),而且这个根节点可以隐藏,但不可以消失,如果没有的话,浏览页面的时候就会报错。
- <ext:TreePanel ID ="tpl_left" runat ="server" Border ="true" RootVisible="false" AutoScroll="true" ContainerScroll="true" >
- <Root >
- <ext:AsyncTreeNode Text ="root" NodeID ="root" Expanded ="true" ></ext:AsyncTreeNode> <%--treepanel中的rootvisible="true"是隐藏root这个节点,但是展开了,异步加载的时候如果接下来的节点不确定是否一定有节点,最好不用root这个节点做为第一个节点,如果确定就节点就不用隐藏,直接用root节点--%>
- </Root>
- <Listeners >
- <BeforeLoad Handler ="nodeLoad(node,'','');" /> <%--这个是点击展开响应的事件 --%>
- <Click Handler="onClickSource(node.id);" /> <%--这个是单击节点响应的事件--%>
- </Listeners>
- </ext:TreePanel>
复制代码
- 在前台js中写下点击展开的节点的事件和单击节点的事件,这些事件再去调用到后台取出数据。
单击节点响应的事件(将选中的节点的ID记录下来,方便绑定其他数据以及刷新时使用)- function onClickSource(nid){
- hSelPosId.setValue(nid);
- Ext.net.DirectMethods.BindPosInfo();//根据选中的节点的ID绑定其他数据
- }
单击展开响应的事件()
- //加載子節點
- function nodeLoad(node,strSign,strParentId) {
- Ext.net.DirectMethods.NodeLoad(node.id, { //加载子节点
- success: function(result) {
- if (result == "" || result == "undefined" || result == "[]")
- { return; }
- var data = eval("(" + result + ")");//这时返回回来的值
- node.loadNodes(data);
- tpl_left.body.unmask();
- //接下来这段是刷新的时候做的,由于我实现的功能比较复杂就不一一解释了,大概的思路是这样的,首先根据之前记录下来的选中的ID找出所有的父节点的ID,对当前树的节点进行查找该选中ID,如果找到,则选中,没有找到,则从该节点的最前面一个父节点ID开始查找下来,找到父节点则展开,这样一级级找下来就可以找到之前选中的节点
- if(strSign=="reload"){
- var strSelId=hSelPosId.getValue();
- if(strSelId !=""){
- //第一層
- var curNode = tpl_left.getNodeById(hSelPosId.getValue());
- if (curNode != null && curNode != undefined) {
- curNode.select();
- onClickSource(curNode.id);
- }else {
- var arrSelId=strSelId .split('|');
- if(arrSelId .length>1){
- switch (arrSelId [0]){
- case "g_id": //職等
- if(strParentId !=arrSelId [0]){
- curNode = tpl_left.getNodeById(arrSelId [0]);
- if(curNode.hasChildNodes()==true){
- nodeLoad(curNode,"reload",arrSelId [0]);
- }
- }else {
- onClickSource('');
- }
- break ;
- case "t_id"://職稱
- if(arrSelId.length ==2){
- if(strParentId !=arrSelId [0]){
- curNode = tpl_left.getNodeById(arrSelId [0]);
- if(curNode.hasChildNodes()==true){
- nodeLoad(curNode,"reload",arrSelId [0]);
- }
- }else {
- onClickSource('');
- }
- }else {
- if(strParentId==""){
- curNode = tpl_left.getNodeById(arrSelId[0]);
- if(curNode.hasChildNodes()==true){
- nodeLoad(curNode,"reload",arrSelId [0]);
- }
- }else if(strParentId ==arrSelId [0]){
- curNode = tpl_left.getNodeById(arrSelId[0]+"|"+arrSelId [1]);
- if(curNode.hasChildNodes()==true){
- nodeLoad(curNode,"reload",arrSelId[0]+"|"+arrSelId [1]);
- }
- }else {
- onClickSource('');
- }
- }
- break ;
- case "f_id"://職務
- if(arrSelId.length ==2){
- if(strParentId !=arrSelId [0]){
- curNode = tpl_left.getNodeById(arrSelId [0]);
- if(curNode.hasChildNodes()==true){
- nodeLoad(curNode,"reload",arrSelId [0]);
- }
- }else {
- onClickSource('');
- }
- }else {
- if(strParentId==""){
- curNode = tpl_left.getNodeById(arrSelId[0]);
- if(curNode.hasChildNodes()==true){
- nodeLoad(curNode,"reload",arrSelId [0]);
- }
- }else {
- if(strParentId ==arrSelId [0]){
- curNode = tpl_left.getNodeById(arrSelId[0]+"|"+arrSelId [1]);
- if(curNode.hasChildNodes()==true){
- nodeLoad(curNode,"reload",arrSelId[0]+"|"+arrSelId [1]);
- }
- }else if(strParentId ==(arrSelId[0]+"|"+arrSelId [1])){
- if(arrSelId .length ==4){
- curNode = tpl_left.getNodeById(arrSelId[0]+"|"+arrSelId [1]+"|"+arrSelId [2]);
- if(curNode.hasChildNodes()==true){
- nodeLoad(curNode,"reload",arrSelId[0]+"|"+arrSelId [1]+"|"+arrSelId [2]);
- }
- }else {
- onClickSource('');
- }
- }else{
- onClickSource('');
- }
- }
- }
- break ;
- }
- }
- }
- }
- }
- },
- failure: function(errorMsg) {
- Ext.Msg.alert('Failure', errorMsg);
- }
- });
- }
复制代码
- 在后台写下前台所调用的事件,并返回相应的值.
在后台取数据的时候要注意的问题:
后台加载节点时,如果该节点下有子节点,那么该节点应该定义为AsyncTreeNode ,如果没有则应该定义为TreeNode,并且Leaf属性为true 表明是叶子节点
后台加载节点时,节点的ID要设置好,建议最好是 父节点的ID+分隔符号(自己设定)+当前节点的ID,这样子,如果刷新树,还可以做定位到当前选中的节点
(例子中的节点 ID说明 "root":root节点 ,"00":所有分类的节点,"f_id"、"g_id"、"t_id" 为所有分类下第一级的节点,"f_id|XXX"为所有分类下第二级到第N级的节点)。
- [Ext.Net.DirectMethod(ViewStateMode = Ext.Net.ViewStateMode.Enabled)]
- public string NodeLoad(string nodeID)
- {
- if (nodeID == "root")//綁定根目錄的節點(所有職位)
- {
- return BindPosRoot("");
- }
- else if (nodeID == "00")//職位大分類(職等、職稱、職務)
- {
- return BindPosCat();
- }
- else//職位大分類下的分類的小分類
- {
- return BindPosCatChild(nodeID);
- }
- }
复制代码
- //下面这段是注意第二点要注意的
- //職位大分類下的分類
- public string BindPosCatChild(string strNodeId)
- {
- string[] arrStr=strNodeId .Split ('|');
- Ext.Net.TreeNodeCollection nodes = new Ext.Net.TreeNodeCollection();
- Ext.Net.AsyncTreeNode curNodes = new Ext.Net.AsyncTreeNode();
- Ext.Net.TreeNode curTreeNode = new Ext.Net.TreeNode();
- DataTable dt=null;
- DataTable dtChild=null;
- DataRow[] drsChild=null;
- string strParentId = arrStr [0];
- string strId = "";
- string strIdField = "";//顯示編號的字段
- string strTextField = ""; //顯示名稱的字段
- int ICount = 0;
- ICount = arrStr.Length
- switch (strParentId)
- {
- case "g_id"://職等
- if (ICount == 1)
- {
- dt = getInitData("ods_grade", "g_id,grade", " and g_status=1");
- strId = strParentId+"|";
- strIdField = "g_id";
- strTextField = "grade";
- }
- break;
- case "t_id"://職稱
- if (ICount == 1)
- {
- dt = getInitData("ods_title_cat", "t_cat_id,t_cat", "");
- dtChild = getInitData("ods_title", "t_id,title,t_cat_id", "and t_status=1");
- strId = strParentId + "|";
- strIdField = "t_cat_id";
- strTextField = "t_cat";
- }
- else {
- dt = getInitData("ods_title", "t_id,title,t_cat_id", "and t_status=1 and t_cat_id='"+arrStr [1]+"'");
- strId = strNodeId + "|";
- strIdField = "t_id";
- strTextField = "title";
- }
- break;
- case "f_id"://職務
- if (ICount ==1 )
- {
- dt = getInitData("ods_function_cat", "f_cat,f_cat_id", "");
- dtChild = getInitData("ods_function_dog", "f_dog_id,f_dog,f_cat_id", "");
- strId = strParentId + "|";
- strIdField = "f_cat_id";
- strTextField = "f_cat";
- }
- else if (ICount == 2)
- {
- dt = getInitData("ods_function_dog", "f_dog_id,f_dog,f_cat_id", " and f_cat_id='" + arrStr[1] + "'");
- dtChild = getInitData("ods_function", "f_id ,functionName,f_dog_id", " and f_status=1");
- strId = strNodeId + "|";
- strIdField = "f_dog_id";
- strTextField = "f_dog";
- }
- else {
- dt = getInitData("ods_function", "f_id ,functionName,f_dog_id", " and f_status=1 and f_dog_id='"+arrStr [2]+"'");
- strId = strNodeId + "|";
- strIdField = "f_id";
- strTextField = "functionName";
- }
- break;
- }
- //增加子節點
- foreach (DataRow dr in dt.Rows)
- {
- if (dtChild != null) {
- drsChild = dtChild.Select(strIdField + "='" + dr[strIdField].ToString() + "'");
- }
- //如果有子节点则用 AsyncTreeNode
- if (drsChild !=null &&drsChild.Length > 0)
- {
- curNodes = new Ext.Net.AsyncTreeNode();
- curNodes.NodeID = strId + dr[strIdField].ToString();
- curNodes.Text = dr[strTextField].ToString();
- nodes.Add(curNodes);
- }
- else
- {
- curTreeNode = new Ext.Net.TreeNode();
- curTreeNode.NodeID = strId + dr[strIdField].ToString(); ;
- curTreeNode.Text = dr[strTextField].ToString ();
- curTreeNode.Leaf = true;
- nodes.Add(curTreeNode);
- }
- }
- return nodes.ToJson();
- }
转自:http://www.ext.net.cn/forum.php?mod=viewthread&tid=11945
[Ext.Net]TreePanel 异步加载数据的更多相关文章
- Extjs-树 Ext.tree.TreePanel 动态加载数据
先上效果图 1.说明Ext.tree.Panel 控件是树形控件,大家知道树形结构在软件开发过程中的应用是很广泛的,树形控件的数据有本地数据.服务器端返回的数据两种.对于本地数据的加载,在extjs的 ...
- winform异步加载数据到界面
做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...
- 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]
/**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...
- 淘宝购物车页面 智能搜索框Ajax异步加载数据
如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...
- Jquery zTree结合Asp.net实现异步加载数据
zTree结合Asp.net实现异步加载数据 实现简单操作 zTree 下载 api 访问 :http://www.ztree.me/v3/main.php 例子中用到json数据转化 newtons ...
- jquery easyui easyui-treegrid 使用异步加载数据
jquery easyui easyui-treegrid 使用异步加载数据 jquery easyui easyui-treegrid 异步请求 >>>>>>&g ...
- Highcharts 异步加载数据曲线图表
导入 data.js 文件 异步加载数据需要引入以下js 文件: <script src="http://code.highcharts.com/modules/data.js&quo ...
- 新手教程:不写JS,在MIP页中实现异步加载数据
从需求谈起:在 MIP 页中异步加载数据 MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统.所有 JS 交互都需要使用 MIP 组件实现 ...
- iScroll.js 向上滑动异步加载数据回弹问题
iScroll是一款用于移动设备web开发的一款插件.像缩放.下拉刷新.滑动切换等移动应用上常见的一些效果都可以轻松实现. 现在最新版本是5.X,官网这里:http://iscrolljs.com/ ...
随机推荐
- 中间件——canal小记
接到个小需求,将mysql的部分数据增量同步到es,但是不仅仅是使用canal而已,整体的流程是mysql>>canal>>flume>>kafka>> ...
- FJUT寒假作业涨姿势题解
题意非常简单易懂,对于涨姿势0,数据非常小,比较容易想到的是直接循环暴力解题完成任务.把数据放入数组arr,循环i,j控制所有区间算和.结果记入vis. 到了涨姿势1,2,3,我们观察数据变化,发现数 ...
- Java常用集合学习总结
一 数组 数组可以存储基本数据类型和对象的一种容器,长度固定,所以不适合在对象数量未知的情况下使用. Arrays : 用于操作数组对象的工具类,里面都是静态方法. Arrays.asList:把A ...
- Java第7次实验提纲(多线程)
PTA与参考资料 题集:多线程 多线程实验参考文件 ThreadReading 实验-基础部分 1.1 基础题目MyThread类.自行完成题集合的:PrintTask 1.2 Runnable与匿名 ...
- 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )
初学者遇到 Android Studio, 导入工程后, 会出现各种奇葩错误, 如果管理好各个插件, gradle, SDK, SDK Tools, 各种官方依赖库 的版本, 会将错误大大的减少; 这 ...
- 《读书报告 -- Elasticsearch入门 》-- 安装以及简单使用(1)
<读书报告 – Elasticsearch入门 > 第一章 Elasticsearch入门 Elasticsearch是一个实时的分布式搜索和分析引擎,使得人们可以在一定规模上和一定速度上 ...
- Gazebo機器人仿真學習探索筆記(一)安裝與使用
Gazebo提供了多平臺的安裝和使用支持,大部分主流的linux,Mac以及Windows,這裏結合ROS以Ubuntu爲例進行介紹. 首先是參考資料:http://gazebosim.org/tut ...
- Java学习之控制跳转语句
控制跳转语句 控制跳转语句: (1)break:中断的意思 A:用在循环和switch语句中,离开此应用场景无意义. B:作用 a:跳出单层循环 b:跳出多层循环,需要标签语句的配合 (2)conti ...
- Dynamics CRM 站点地图中URL的&号编码问题
现在大多数人对站点地图的操作都通过工具来执行,但如果你使用原始的编辑XML方式,并且你的SubArea中对应的不是某个Entity而是一串URL时,要注意了你的URL中如果带有与符号即&,那就 ...
- How to generate the complex data regularly to Ministry of Transport of P.R.C by DB Query Analyzer
How to generate the complex data regularly to Ministry of Transport of P.R.C by DB Query Analyzer 1 ...