先上效果图

1、说明
Ext.tree.Panel 控件是树形控件,大家知道树形结构在软件开发过程中的应用是很广泛的,树形控件的数据有本地数据、服务器端返回的数据两种。
对于本地数据的加载,在extjs的 api文档中都有介绍,但是Extjs.tree.Panel怎么动态加载数据库中的数据,API文档介绍的较少,
以至于初学者,不知道怎么实现。

本篇文章将介绍Extjs.tree.Panel动态加载数据的思路。

本篇文章的主要内容有:
(1)、搭建环境
(2)、创建数据表
(3)、创建实体类
(4)、创建ViewModel
(5)、编写后台代码
(6)、编写前台代码

注意:虽然本文写的非常详细,但是也要求读者具有mvc、fluentdata方面的知识准备。

一、搭建环境
            开发环境:visualstudio 2012
                   ORM  :   fluentdata
            开发语言:c#
            项目类型:asp.net mvc4

搭建环境步骤:
   (1)、打开visualstudio 2012 ,新建-项目-模板-visual c#-web-asp.net mvc4    (基本)
   (2)、引用fluentd.dll
          在方案资源管理器中,找到刚刚创建的项目,右键单击“引用”文件夹,在弹出菜单选择“添加引用”,浏览,找到fluentd.dll 单击“确定”按钮即可
   (3)、在项目下添加一个文件夹,命名为“DAL”,在该文件夹中添加一个类DBHelper.cs
   (4)、在web.config文件中添加数据库连接字符串
<connectionStrings>    
    <add name="testDBContext" connectionString="server=192.168.1.105;uid=sa;pwd=***;database=NewDB;"/>
  </connectionStrings>

DBHelper.cs类代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FluentData;
namespace MvcExtJsTree.DAL
{
public class DBHelper
{
public static IDbContext Context()
{
return new DbContext().ConnectionStringName("testDBContext",
new SqlServerProvider());
}
}
}

注意:用别的orm也可以,只要能访问数据库即可。
二、创建数据表
首先在sql数据库中创建一个数据库,命名为NewDB
接下来,在该数据库下创建数据表,命名为testTree
1、创建数据表的脚本如下:

USE NewDB
GO CREATE TABLE testTree
(
id int primary key identity(,) NOT NULL,
myTitle nvarchar() NULL,
iconCls nvarchar() NULL,
fatherId int NOT NULL
)
2、数据表数据
三、在项目的Models文件夹中添加实体类,命名为testTree.cs

该类的作用是方法数据,查询数据用的
代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcExtJsTree.Models
{
public class testTree
{
public int id { get; set; }
public string myTitle { get; set; }
public string iconCls { get; set; }
public int fatherId { get; set; }
}
}

四、创建ViewModel
在项目下添加一个文件夹,命名为ViewModel
在该文件夹下添加一个类,命名为Tree.cs
该类的作用就是把后台从数据库查询出的数据转换为前台treePanel支持的数据格式
Tree.cs类的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcExtJsTree.ViewModel
{
public class Tree
{
public String id; public String text; public String iconCls; public Boolean leaf; public String fatherId; public List<Tree> children; }
}

五、mvc项目Home控制器的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using FluentData;
using MvcExtJsTree.Models;
using MvcExtJsTree.ViewModel; namespace MvcExtJsTree.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/ public ActionResult Index()
{
return View();
} public ActionResult HandlerTreeFromDB()
{
var categoryList = DAL.DBHelper.Context().Select<testTree>("*").From("testTree").QueryMany();
var result = this.ConvertTreeNodes(categoryList);
return Json(result, JsonRequestBehavior.AllowGet);
} #region 和树节点相关的
private List<Tree> ConvertTreeNodes(List<testTree> listCategory)
{
List<Tree> listTreeNodes = new List<Tree>();
LoadTreeNode(listCategory, listTreeNodes, -);
return listTreeNodes;
}
private void LoadTreeNode(List<testTree> listCategory, List<Tree> listTreeNodes, int pid)
{
foreach (testTree category in listCategory)
{
if (category.fatherId == pid)
{
Tree node = this.TransformTreeNode(category);
listTreeNodes.Add(node); LoadTreeNode(listCategory, node.children,Convert.ToInt32(node.id));
}
}
} private Tree TransformTreeNode(testTree category)
{
Tree treeNode = new Tree()
{
id = category.id.ToString(),
text = category.myTitle,
leaf=false,
fatherId=category.fatherId.ToString(),
iconCls=category.iconCls,
children = new List<Tree>() };
var categoryId = category.id;
var childrens = DAL.DBHelper.Context().Select<testTree>("*").From("testTree").Where("fatherId=@0").Parameters(categoryId).QueryMany(); //判断节点是否有子节点
if (childrens.Count == )
{
treeNode.leaf=true;
treeNode.children = null;
}
return treeNode;
}
#endregion }
}

六、Home控制器的Index方法对应的Index.cshtml页面的代码如下:

@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<link href="~/ExtJS4.2/resources/css/ext-all-neptune-rtl.css" rel="stylesheet" />
<link href="~/ExtJS4.2/resources/css/ext-all.css" rel="stylesheet" />
<script type="text/javascript" src="~/ExtJS4.2/ext-all.js"></script>
<script src="~/ExtJS4.2/locale/ext-lang-zh_CN.js"></script>
<script type="text/javascript">
Ext.onReady(function () {
var model = Ext.define("TreeModel", { // 定义树节点数据模型
extend: "Ext.data.Model",
fields: [
{ name: "id", type: "string" },
{ name: "text", type: "string" },
{ name: "iconCls", type: "string" },
{ name: "leaf", type: "boolean" },
{ name: 'url', type: "string" },
{ name: 'description', type: "string" }]
});
var store = Ext.create('Ext.data.TreeStore', {
model: model,//定义当前store对象的Model数据模型
// autoLoad : true,
proxy: {
type: 'ajax',
url: 'Home/HandlerTreeFromDB',//请求
reader: {
type: 'json',
// root : 'data'//数据
}
},
root: {//定义根节点,此配置是必须的
// text : '管理菜单',
expanded: true
} });
Ext.create('Ext.tree.Panel', {
title: 'Simple Tree',
width: ,
height: ,
store: store,
rootVisible: false,//隐藏根节点
renderTo: Ext.getBody()
});
});
</script>
</head>
<body>
</body>
</html>

注意:
   (1)、需要注意的是,在项目下添加文件夹“ExtJS4.2”,并把extjs4.2的源文件拷贝到该文件夹下,即给项目引用extjs4.2框架。
  (2)、后台代码处理思路:通过递归,把从数据库中查询的数据转换为Ext.tree.Panel所支持的数据

七、土豪打赏

   

Extjs-树 Ext.tree.TreePanel 动态加载数据的更多相关文章

  1. [Ext.Net]TreePanel 异步加载数据

    异步加载数据指的是页面加载的时候只显示根目录,点击根目录再去加载其子目录. 下面就来介绍下这种异步加载的树结构要怎么实现 现将例子的图 QQ图片20131225134353.jpg (12.1 KB, ...

  2. MiniUI treeGrid 动态加载数据与静态加载数据的区别

    说明:treegrid静态数据加载时数据结构是一棵树包含children节点集合,而采用动态加载数据时数据是List结构的具体项. 静态加载数据 test1.html <!DOCTYPE htm ...

  3. 爬虫开发6.selenuim和phantonJs处理网页动态加载数据的爬取

    selenuim和phantonJs处理网页动态加载数据的爬取阅读量: 1203 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/ ...

  4. (五)selenuim和phantonJs处理网页动态加载数据的爬取

    selenuim和phantonJs处理网页动态加载数据的爬取 一 图片懒加载 自己理解------就是在打开一个页面的时候,图片数量特别多,图片加载会增加服务器的压力,所以我们在这个时候,就会用到- ...

  5. AppCan学习笔记----关闭页面listview动态加载数据

    AppCan页面关闭 AppCan 的页面是由两个HTML组成,如果要完全关闭的话需要在主HTML eg.index.html中关闭,关闭方法:appcan.window.close(-1); 管道 ...

  6. [JS前端开发] js/jquery控制页面动态加载数据 滑动滚动条自动加载事件

    页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空 ...

  7. 微信小程序(五) 利用模板动态加载数据

    利用模板动态加载数据,其实是对上一节静态数据替换成动态数据:

  8. mui 动态加载数据出现的问题处理 (silder轮播组件 indexedList索引列表 下拉刷新不能继续加载数据)

    mui-slider 问题:动态给mui的图片轮播添加图片,轮播不滚动. 解决:最后把滚动轮播图片的mui(".mui-slider").slider({interval: 300 ...

  9. ASP.NET MVC动态加载数据

    ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分:  Source Code 上图中,有一行代码: <tbody ...

随机推荐

  1. 【CF1023A】Single Wildcard Pattern Matching(模拟)

    题意:给定两个串s与t,其中s可能有至多一个通配符*可以被当做任意长度与内容的串,问t能否与s匹配 n,m<=2e5 思路: #include<cstdio> #include< ...

  2. 【CF679B】Theseus and labyrinth(数学,贪心)

    题意: 给一个m<=10^15,每次都减最接近当前值的立方数 让你找一个不大于m的最大的数并且这个数是减法次数最多的数 思路:见http://blog.csdn.net/miracle_ma/a ...

  3. 应用gulp工具构建个自动算rem布局的小例子

    因为最近可能需要做移动端rem布局,因为rem布局需要将px转化成rem,如果次都需要拿计算器算就太low了,所以就想到用less和gulp. 因为也是初学gulp,站点的文件结构还没想到太好,也只是 ...

  4. canvas之webgl的浏览器开启方式

    引自百度知道的回答 1.开启方式: 第一种:打开cmd,切换到Chorme的安装目录,敲入chrome.exe --enable -webgl,回车就会打开一个chrome浏览器窗口: 第二种:找到C ...

  5. 10深入理解C指针之---指针运算和比较

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针运算有很多种,主要有指针的声明*.指针的解引*.指针指向(*).或->.指针 ...

  6. 安装apache2.4和php7.1的方法记录

    下载扩展 这是PHP官方扩展下载的地址 http://pecl.php.net 点击下载dll文件,放到php的ext目录. 看这个说明下载你PHP版本支持的版本.

  7. 使用Zint和Zxing实现二维码的编码与解码(Using open-source tools to generate and decode Q-R code)

    1.Zint生成二维码 http://sourceforge.net/projects/zint/ [1]从上述站点下载Zint工具 [2]安装Zint工具 [3]使用Zint工具生成二维码,注意选择 ...

  8. VUE之Router命令行警告:Named Route 'Home' has a default child route. 解决办法

    Named Route 'Home' has a default child route. When navigating to this named route (:to="{name: ...

  9. CCCC L2-024 部落【并查集】

    https://www.patest.cn/contests/gplt/L2-024 首先在一行中输出这个社区的总人数.以及互不相交的部落的个数.随后对每一次查询,如果他们属于同一个部落,则在一行中输 ...

  10. Software Engineering | Factory method pattern

    工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象.这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象. 有时,特定类型对象的控制过程比简单地创建一个对象更复杂.在 ...