AjaxPro.NET框架生成高效率的Tree(Asp.net 2.0)(示例代码下载)

2024-03-28 01:08

本文主要是介绍AjaxPro.NET框架生成高效率的Tree(Asp.net 2.0)(示例代码下载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AjaxPro.NET框架生成高效率的Tree(Asp.net 2.0)(示例代码下载)

 

(一). 说明

        用Tree显示菜单及物品列表(从服务端获取数据)比较方便, 当前显示Tree 主要有两种方式:

        1. 在Tree初始化时将数据全部一次性从服务端获取, 获取完数据后页面展开或收缩时就不再需要获取数据,          

            这样, 获取完数据使用时效率比较高, 但当树节点很多时, 在每次初始化时会有较大的延迟.

        2. 初始化时只加载展开的节点, 当用户需要查看某个节点下的数据时, 再去取数据, 这样, 初始化时延迟会相

            对减少, 但每次单击节点时要获取数据, 页面每次都要刷新, 所以也会产生延迟.

        此事例用Ajax实现第二种方式, 每次只动态加载要展开的节点数据(闭合节点不展开时,则不获取其子节点的

        数据),  另外加载节点时页面不会刷新.

(二). 运行示例图

(三). AjaxPro.NET简介

         首先对AjaxPro.NET作一下介绍, AjaxPro.NET是一个优秀的Ajax框架, 在实际应用中只要添加其DLL

         引用并进行简单的配置, 即可以非常方便的在客户端直接调用服务端方法, 来获取Tree节点.

(四).使用AjaxPro.NET预配置

       1. 添加 AjaxPro.dll 文件的引用(示例代码中已经包含,直接COPY过来使用即可).

       2. 在Web.config文件中添加以下配置,           

1  < httpHandlers >
2               < add verb = " POST,GET "  path = " ajaxpro/*.ashx "  type = " AjaxPro.AjaxHandlerFactory, AjaxPro "   />             
3 </ httpHandlers >
3. 在要使用AjaxPro.NET框架的页面 *.aspx.cs 的 Page_Load事件中加如下代码:
AjaxPro.Utility.RegisterTypeForAjax( typeof (_Default));
4. 经过以上三步骤后, 只要在后台服务端的方法前面增加属性[AjaxMethod]后:
 1   [AjaxMethod()]     //  or [AjaxPro.AjaxMethod] 
 2  public  ArrayList GetSearchItems(  string  strQuery )
 3  {
 4        // 生成数据源
 5       ArrayList items  =   new  ArrayList();
 6       items.Add( " King " );
 7       items.Add( " Rose " );
 8        return  items ;
 9 
10 
就可以在客户端直接使用服务端方法, 非常方便, 客户端调用后台代码如下:
var returnValue  =  后台代码类名.GetSearchItems(参数);

(五). 代码

  1. 页面 Tree.aspx 代码:

  1  <% @ Page Language = " C# "  AutoEventWireup = " true "   CodeFile = " Tree.aspx.cs "  Inherits = " _Default "   %>
  2 
  3  <! DOCTYPE html PUBLIC  " -//W3C//DTD XHTML 1.0 Transitional//EN "   " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
  4 
  5  < html xmlns = " http://www.w3.org/1999/xhtml "   >
  6  < head runat = " server " >
  7       < title > Ajax Efficient Tree </ title >
  8       < link type = " text/css "  href = " css/tree.css "  rel = " stylesheet " >
  9  </ head >
 10  < body >
 11       < form id = " form1 "  runat = " server " >
 12       < div >
 13           < asp:Panel ID = " Panel1 "  runat = " server "  Height = " 424px "  Width = " 251px " >
 14               < div id = " CategoryTree "   class = " TreeMenu " ></ div >
 15           </ asp:Panel >
 16           < script language = " jscript " >
 17              var tree  =  document.getElementById( " CategoryTree " );
 18              var root  =  document.createElement( " li " );
 19              root.id  =   " li_0 " ;
 20              tree.appendChild( root );
 21              ExpandSubCategory(  0  );
 22              function ExpandSubCategory( categoryID )
 23              {
 24                  var liFather  =  document.getElementById(  " li_ "   +  categoryID );
 25                   if ( liFather.getElementsByTagName( " li " ).length  >   0 )
 26                  {
 27                      ChangeStatus( categoryID );
 28                       return ;
 29                  }
 30                  liFather.className  =   " Opened " ;
 31                  SwitchNode( categoryID,  true  );
 32                  
 33                   // 仅获取当前节点的子Nodes
 34                  _Default.GetSubCategory( categoryID, GetSubCategory_callback );
 35              }            
 36              function SwitchNode( CategoryID, show )
 37              {
 38                  var li_father  =  document.getElementById( " li_ "   +  CategoryID);
 39                   if ( show )
 40                  {
 41                      var ul  =  document.createElement( " ul " );
 42                      ul.id  =   " ul_note_ "   +  CategoryID;
 43                      
 44                      var note  =  document.createElement( " li " );
 45                      note.className  =   " Child " ;              
 46                      
 47                      var img  =  document.createElement( " img " );
 48                      img.className  =   " s " ;
 49                      img.src  =   " css/s.gif " ;                    
 50                      
 51                      var a  =  document.createElement( " a " );
 52                      a.href  =   " javascript:void(0); " ;
 53                      a.innerHTML  =   " Please waiting " ;
 54                      
 55                      note.appendChild(img);
 56                      note.appendChild(a);
 57                      ul.appendChild(note);
 58                      li_father.appendChild(ul);                                        
 59                  }   
 60                   else
 61                  {
 62                      var ul  =  document.getElementById( " ul_note_ "   +  CategoryID );
 63                       if ( ul )
 64                      {
 65                          li_father.removeChild(ul);
 66                      }
 67                  }             
 68              }
 69              function GetSubCategory_callback( response )
 70              {
 71                 var dt  =  response.value.Tables[ 0 ];
 72                  if ( dt.Rows.length  >   0  )
 73                 {
 74                      var iCategoryID  =  dt.Rows[ 0 ].FatherID;               
 75                 }                                
 76                 var li_father  =  document.getElementById( " li_ "   +  iCategoryID );
 77                 var ul  =  document.createElement( " ul " );
 78                  for ( var i  =   0 ; i  <  dt.Rows.length; i ++  )
 79                 {
 80                       if ( dt.Rows[i].IsChild  ==   1  )
 81                      {
 82                          var li  =  document.createElement( " li " );
 83                          li.className  =   " Child " ;
 84                          li.id  =   " li_ "   +  dt.Rows[i].CategoryID;
 85                          var img  =  document.createElement( " img " );
 86                          img.id  =  dt.Rows[i].CategoryID;
 87                          img.className  =   " s " ;
 88                          img.src  =   " css/s.gif " ;
 89                          var a  =  document.createElement( " a " );
 90                          a.href  =   " javascript:OpenDocument(' "   +  dt.Rows[i].CategoryID  +   " '); " ;
 91                          a.innerHTML  =  dt.Rows[i].CategoryName;                                          
 92                      }
 93                       else
 94                      {
 95                          var li  =  document.createElement( " li " );
 96                          li.className  =   " Closed " ;
 97                          li.id  =   " li_ "   +  dt.Rows[i].CategoryID;
 98                          var img  =  document.createElement( " img " );
 99                          img.id  =  dt.Rows[i].CategoryID;
100                          img.className  =   " s " ;
101                          img.src  =   " css/s.gif " ;
102                          img.onclick  =  function(){ ExpandSubCategory(  this .id ); };
103                          img.alt  =   " Expand/collapse " ;
104                          var a  =  document.createElement( " a " );
105                          a.href  =   " javascript:ExpandSubCategory(' "   +  dt.Rows[i].CategoryID  +   " '); " ;
106                          a.innerHTML  =  dt.Rows[i].CategoryName;                                         
107                      }
108                      li.appendChild(img);
109                      li.appendChild(a);
110                      ul.appendChild(li);
111                 }
112                 li_father.appendChild(ul);
113                 SwitchNode( iCategoryID,  false  );
114              }          
115              
116               // 单击叶节点时, 异步从服务端获取单个节点的数据.
117              function OpenDocument( CategoryID )
118              {                
119                  _Default.GetNameByCategoryID( CategoryID, GetNameByCategoryID_callback );
120              }
121              
122              function GetNameByCategoryID_callback( response )
123              {
124                  alert( response.value );
125              }
126              
127              function ChangeStatus( CategoryID )
128              {
129                  var li_father  =  document.getElementById( " li_ "   +  CategoryID );
130                   if ( li_father.className  ==   " Closed "  )
131                  {
132                      li_father.className  =   " Opened " ;
133                  }
134                   else
135                  {
136                      li_father.className  =   " Closed " ;
137                  }
138             }              
139           </ script >           
140       </ div >
141       </ form >     
142  </ body >       
143  </ html >

 2. 页面后台文件 Tree.aspx.cs 代码:

  1  using  System;
  2  using  System.Data;
  3  using  System.Configuration;
  4  using  System.Web;
  5  using  System.Web.Security;
  6  using  System.Web.UI;
  7  using  System.Web.UI.WebControls;
  8  using  System.Web.UI.WebControls.WebParts;
  9  using  System.Web.UI.HtmlControls;
 10 
 11  public  partial  class  _Default : System.Web.UI.Page 
 12  {
 13      // 此对象用于存放所有的节点数
 14      public   static  DataSet dsAllNodes  =   new  DataSet();
 15 
 16      protected   void  Page_Load( object  sender, EventArgs e)
 17     {
 18         AjaxPro.Utility.RegisterTypeForAjax( typeof (_Default));       
 19         CreateNodes();
 20     }
 21 
 22      private  DataTable CreateStructure()
 23     {
 24        DataTable dt  =   new  DataTable();
 25        dt.Columns.Add( new  DataColumn( " CategoryID " typeof ( int )));
 26        dt.Columns.Add( new  DataColumn( " CategoryName " typeof ( string )));
 27        dt.Columns.Add( new  DataColumn( " FatherID " typeof ( string )));
 28        dt.Columns.Add( new  DataColumn( " IsChild " typeof ( bool )));
 29         return  dt;
 30     }
 31      public   void  CreateNodes()
 32     {
 33        DataTable dt  =   this .CreateStructure();
 34 
 35        DataRow drNew  =  dt.NewRow();
 36        drNew[ " CategoryID " =   1 ;
 37        drNew[ " CategoryName " =   " 物品类别 " ;
 38        drNew[ " FatherID " =   0 ;
 39        dt.Rows.Add( drNew );
 40 
 41        drNew  =  dt.NewRow();
 42        drNew[ " CategoryID " =   2 ;
 43        drNew[ " CategoryName " =   " 水果 " ;
 44        drNew[ " FatherID " =   1 ;
 45        dt.Rows.Add( drNew );
 46 
 47        drNew  =  dt.NewRow();
 48        drNew[ " CategoryID " =   3 ;
 49        drNew[ " CategoryName " =   " 工具 " ;
 50        drNew[ " FatherID " =   1 ;
 51        dt.Rows.Add( drNew );
 52 
 53        drNew  =  dt.NewRow();
 54        drNew[ " CategoryID " =   4 ;
 55        drNew[ " CategoryName " =   " 萍果 " ;
 56        drNew[ " FatherID " =   2 ;
 57        dt.Rows.Add( drNew );
 58 
 59        drNew  =  dt.NewRow();
 60        drNew[ " CategoryID " =   5 ;
 61        drNew[ " CategoryName " =   " 香蕉 " ;
 62        drNew[ " FatherID " =   2 ;
 63        dt.Rows.Add( drNew );
 64 
 65        drNew  =  dt.NewRow();
 66        drNew[ " CategoryID " =   6 ;
 67        drNew[ " CategoryName " =   " 桔子 " ;
 68        drNew[ " FatherID " =   2 ;
 69        dt.Rows.Add( drNew );
 70 
 71        drNew  =  dt.NewRow();
 72        drNew[ " CategoryID " =   7 ;
 73        drNew[ " CategoryName " =   " 萝卜 " ;
 74        drNew[ " FatherID " =   2 ;
 75        dt.Rows.Add( drNew );
 76 
 77        drNew  =  dt.NewRow();
 78        drNew[ " CategoryID " =   8 ;
 79        drNew[ " CategoryName " =   " 钢笔 " ;
 80        drNew[ " FatherID " =   3 ;
 81        dt.Rows.Add( drNew );
 82 
 83        drNew  =  dt.NewRow();
 84        drNew[ " CategoryID " =   9 ;
 85        drNew[ " CategoryName " =   " 铅笔 " ;
 86        drNew[ " FatherID " =   3 ;
 87        dt.Rows.Add( drNew );
 88 
 89        drNew  =  dt.NewRow();
 90        drNew[ " CategoryID " =   10 ;
 91        drNew[ " CategoryName " =   " 尺子 " ;
 92        drNew[ " FatherID " =   3 ;
 93        dt.Rows.Add( drNew );
 94        
 95        drNew  =  dt.NewRow();
 96        drNew[ " CategoryID " =   11 ;
 97        drNew[ " CategoryName " =   " 橡皮 " ;
 98        drNew[ " FatherID " =   3 ;
 99        dt.Rows.Add( drNew );
100 
101        dsAllNodes.Tables.Add(dt);
102     }
103 
104     [AjaxPro.AjaxMethod]
105      public  DataSet GetSubCategory( int  CategoryID)
106     {
107        DataSet ds  =   new  DataSet();
108        DataTable dt  =   this .CreateStructure();
109        DataRow[] drSelect  =  dsAllNodes.Tables[ 0 ].Select( " FatherID= "   +  CategoryID.ToString());
110         foreach  (DataRow drTemp  in  drSelect)
111        {
112           DataRow dr  =  dt.NewRow();
113           dr[ " CategoryID " =  drTemp[ " CategoryID " ];
114           dr[ " CategoryName " =  drTemp[ " CategoryName " ];
115           dr[ " FatherID " =  drTemp[ " FatherID " ];
116           dr[ " IsChild " =  IsLeaf(  int .Parse( drTemp[ " CategoryID " ].ToString() ) );
117           dt.Rows.Add(dr);
118        }
119        ds.Tables.Add(dt);
120         return  ds;
121     }
122 
123     [AjaxPro.AjaxMethod]
124      public   bool  IsLeaf( int  Category)
125     {
126          foreach (DataRow dr  in  dsAllNodes.Tables[ 0 ].Rows)
127         {
128             if  (dr[ " FatherID " !=   null   &&   int .Parse(dr[ " FatherID " ].ToString())  ==  Category)
129            {
130                return   false ;  
131            }
132         }
133          return   true ;
134     }
135 
136     [AjaxPro.AjaxMethod]
137      public   string  GetNameByCategoryID( string  CategoryID )
138     {
139         foreach ( DataRow dr  in  dsAllNodes.Tables[ 0 ].Rows )
140        {
141            if ( dr[ " CategoryID " ].ToString()  ==  CategoryID.ToString() )
142           {
143               return  dr[ " CategoryName " ].ToString();
144           }
145        }
146         return   "" ;
147     }
148  }

(六). 示例代码下载:

        http://www.cnitblog.com/Files/ChengKing/AjaxPro.net_EfficientTree.rar

 

 

这篇关于AjaxPro.NET框架生成高效率的Tree(Asp.net 2.0)(示例代码下载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853998

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

android 带与不带logo的二维码生成

该代码基于ZXing项目,这个网上能下载得到。 定义的控件以及属性: public static final int SCAN_CODE = 1;private ImageView iv;private EditText et;private Button qr_btn,add_logo;private Bitmap logo,bitmap,bmp; //logo图标private st

Android多线程下载见解

通过for循环开启N个线程,这是多线程,但每次循环都new一个线程肯定很耗内存的。那可以改用线程池来。 就以我个人对多线程下载的理解是开启一个线程后: 1.通过HttpUrlConnection对象获取要下载文件的总长度 2.通过RandomAccessFile流对象在本地创建一个跟远程文件长度一样大小的空文件。 3.通过文件总长度/线程个数=得到每个线程大概要下载的量(线程块大小)。

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共

Windows中,.net framework 3.5安装

安装.net framework,目前已知2种方法,如下: 一、在MSDN下载对应的安装包,安装,这种可能无法安装成功,概率很大,不成功使用第二种方法,基本上没问题。 二、win8/8.1/10 下安装 .net framework 3.5.1: 1. 打开 win8/8.1/10 安装盘(这里指系统安装镜像文件),提取 sources\sxs 文件夹到 X:\sources\sxs (X代

麻了!一觉醒来,代码全挂了。。

作为⼀名程序员,相信大家平时都有代码托管的需求。 相信有不少同学或者团队都习惯把自己的代码托管到GitHub平台上。 但是GitHub大家知道,经常在访问速度这方面并不是很快,有时候因为网络问题甚至根本连网站都打不开了,所以导致使用体验并不友好。 经常一觉醒来,居然发现我竟然看不到我自己上传的代码了。。 那在国内,除了GitHub,另外还有一个比较常用的Gitee平台也可以用于