用json数据模拟后端传回来的结果,Extjs tree支持两种类型的结构,一种是带children属性的嵌套式的数据,一种是扁平的,每条记录带pid的数据,带pid的添加配置项可以自动解析成树形结构。

{
"text": "根目录",
"children": [
{
"id": "1",
"name": "基础设置",
"children": [
{
"id": "1-1",
"name": "部门档案",
"total": 3,
"children": [
{
"id": "1-1-1",
"name": "增加部门",
"nd": "1"
}, {
"id": "1-1-2",
"name": "修改部门"
}
]
}, {
"id": "1-2",
"name": "客户档案",
"nd": "2",
"total": 1,
"children": [
{
"id": "1-2-1",
"name": "增加客户"
}, {
"id": "1-2-2",
"name": "客户设置"
}
]
}
]
}, {
"id": "2",
"name": "综合业务",
"children": [
{
"id": "2-1",
"name": "凭证",
"nd": "1",
"total": 3,
"children": [
{
"id": "2-1-1",
"name": "填制凭证"
}, {
"id": "2-1-2",
"name": "凭证审核"
}
]
}, {
"id": "2-2",
"name": "采购",
"nd": "3",
"total": 1,
"children": [
{
"id": "2-2-1",
"name": "采购订单"
}, {
"id": "2-2-2",
"name": "采购结算"
}
]
}
]
}
]
}

Tree grid代码

Ext.require([ 'Ext.form.*', 'Ext.tip.QuickTipManager' ]);

Ext.onReady(function() {

    Ext.define('myTreeModel', {
extend : 'Ext.data.Model',
idProperty: 'id',
fields : [
{name : 'id'},
{name : 'name'},
{name : 'nd'},
{name : 'total'},
]
}); // tree组件要求数据的叶子节点必须有leaf=true,此函数递归tree数据检查和自动添加leaf=true
function recursiveSetLeaf(treeNode) {
if (treeNode.children) { console.log('当前节点有children');
Ext.each(treeNode.children, function(child){
recursiveSetLeaf(child);
});
} else {
console.log('当前节点为末级节点');
treeNode.leaf = true;
}
} // 创建grid
var sdPaperRules = Ext.create('Ext.tree.Panel', {
id : "sdPaperRules",
store : new Ext.data.TreeStore({
model: "myTreeModel",
proxy: {
type: 'ajax',
url: '/exam_admin/admin/service/gkpapers_rule/tree_grid_test.json',
extractResponseData(response) {
// 非pid
/**
* 如果是扁平的带pid的记录,可参考
* http://t.zoukankan.com/love-omnus-p-4196603.html
*
*/
// var json = Ext.loadFilter(Ext.JSON.decode(response.responseText),{parentField : 'pid'});
console.log('response', response);
var rootNode = Ext.JSON.decode(response.responseText);
recursiveSetLeaf(rootNode);
response.responseText = Ext.JSON.encode(rootNode);
return response
},
},
folderSort: true
}),// 指定数据源
// 可编辑单元格插件,配置此插件后就可以在列配置中启用列的编辑
plugins: Ext.create('Ext.grid.plugin.CellEditing', {
clicksToEdit : 1,
}),
viewConfig: {
// 给表格行添加样式
getRowClass(record, rowIndex, rowParams, store){
if (rowIndex % 2 !== 0) {
return "treegrid-row-style-even"; // 给偶数行设置样式
}
}
},
autoScroll : true,
bodyStyle : 'overflow-x:auto; overflow-y:auto',
autoHeight : true,
autoWidth : true,
rootVisible: false,
// border : true,
columns : [
{
xtype : 'treecolumn',
text : "功能点",
width : 250,
dataIndex : 'name',
headersDisabled : true,
menuDisabled : true,
editable: false
},
{
dataIndex: 'nd',
text: '难度',
width : 250,
// flex: 1,
align: 'left',
headersDisabled : true,
menuDisabled : true,
renderer(value, metaData, record, rowIndex, colIndex, store, view) {
if (!value) return;
var html = '';
html += `<div style="display:flex;justify-content: flex-start;align-items: center;">`;
var radioOptions = [{ "value": "1", "label": "简单" }, { "value": "2", "label": "普通" }, { "value": "3", "label": "困难" }];
for (option of radioOptions) {
// console.log('option', option);
var checked = option.value == value ? `checked='checked'` : '';
var name = "grid_column_radio_" + record.data.id;
var domId = 'radio_' + record.data.id + '_' + option.value;
html += `<div style="display:flex;justify-content: center;align-items: center;margin-right:16px;">`;
html += ` <input id="${domId}" name='${name}' type='radio' ${checked} value='${option.value}'/>`;
html += ` <label for="${domId}">&nbsp;${option.label}</label>`;
html += `</div>`;
}
html += `</div>`;
return html;
} },
{
text : "数量",
width : 100,
dataIndex : 'total',
headersDisabled : true,
menuDisabled : true,
border: 1,
editor : {
xtype : 'textfield'
}
}
],
listeners: {
beforeitemcollapse() {
console.log('beforeitemcollapse');
return false; // 禁止收缩节点
},
itemclick(treePanel, record, rowTag, rowIndex, event) {
// 处理单选按钮选择事件
var radio = event.getTarget('input[type="radio"]');
if (radio) {
console.log('要更改的nd', radio.value);
record.set({nd: radio.value});
}
},
beforeedit(treePanel, cell, events) {
console.log('record', cell.record.data);
if (!cell.record.data.nd) { // 如果当前节点没有难度设置,则禁止编辑
return false;
}
}
},
bbar : Ext.create("Ext.toolbar.Toolbar", {
items: [
{
xtype: 'button',
text: '获取结果数据',
handler() {
getTreeGridData(sdPaperRules.getRootNode());
// console.log('1:1', sdPaperRules.getView().getCell(1, 1)); // Ext.encode(record.data)
// 好像grid有个dirty属性,判断修改过没有,可以把有修改的record过滤出来
}
},
{
xtype : 'tbtext',
text: 'test...<span style="color:red;">lsdjfoiej</span>'
}
]
})
}); window.getTreeGridData = function(node) {
// console.log('node', node);
if (node.data.nd) {
console.log('nd', node.data.nd)
}
if (node.childNodes) {
for (n of node.childNodes) {
getTreeGridData(n);
}
}
}
// 获得当前选中的tab,下面将向这个tab添加模块组件
var tab = Ext.getCmp("treeGridTest"); // 展开所有节点
sdPaperRules.expandAll(); // 向tab里添加一个按钮
tab.add(sdPaperRules); });

由于Extjs的Tree组件和grid结合的话,默认情况数据行没有样式,在多列情况下,不易区分当前单元格属于哪一样。因此需要添加全局样式控制补充效果。

        .treegrid-row-style-even .x-grid-cell {
border-top: 1px solid #ededed;
border-bottom: 1px solid #ededed;
background-color: #fafafa;
}
.treegrid-row-style-even:hover .x-grid-cell {
background-color: #ededed;
}

Extjs4 Tree Grid 综合示例(展开、编辑列、获取数据)的更多相关文章

  1. ExtJs4之Grid详细

    ExtJs博客前奏 由于这段时间事情比较杂乱,博客就主要以项目中例子来说明编写. ExtJs4中的Grid非常强大,有展示,选中,搜索,排序,编辑,拖拽等基本功能,这篇博客我就这几个功能做写累述. 1 ...

  2. ExtJS4.2学习(七)EditorGrid可编辑表格(转)

    鸣谢地址:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-14/176.html ------------- ...

  3. 图解DataGridView编辑列

    WinForm中DataGridView功能强大,除了可以自动绑定数据源外,还可以根据需求编辑列.下面以截图说明添加编辑列的步骤(HoverTreeSCJ 项目实际界面). 1.选择DataGridV ...

  4. oracle+servlet+extjs4 分页表格布局示例代码

    Log.java package com.example.entity; import java.util.Date; public class Log { private int id; priva ...

  5. Spring MVC 学习总结(四)——视图与综合示例

    一.表单标签库 1.1.简介 从Spring2.0起就提供了一组全面的自动数据绑定标签来处理表单元素.生成的标签兼容HTML 4.01与XHTML 1.0.表单标签库中包含了可以用在JSP页面中渲染H ...

  6. C#与数据库访问技术总结(七)综合示例

    综合示例 说明:前面介绍了那么多,光说不练假把式,还是做个实例吧. 表:首先你要准备一张表,这个自己准备吧.我们以学生表为例. 1.ExecuteScalar方法 ExecuteScalar方法执行返 ...

  7. 前端MVC Vue2学习总结(一)——MVC与vue2概要、模板、数据绑定与综合示例

    一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.Vue是框架而jQuery则是库. 1.2.AMD与CM ...

  8. LayUI后台管理与综合示例

    一.LayUI介绍 layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的内在,体 ...

  9. 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续2篇-模板导出综合示例)

    自ExcelUtility类推出以来,经过项目中的实际使用与不断完善,现在又做了许多的优化并增加了许多的功能,本篇不再讲述原理,直接贴出示例代码以及相关的模板.结果图,以便大家快速掌握,另外这些示例说 ...

  10. 在ASPxGridView的主从表显示中,有什么属性可以只让其每次选择只展开一列?

    在ASPxGridView的主从表显示中,有什么属性可以只让其每次选择只展开一列?(效果图如下:): 在ASPxGridView的主从表显示中,有什么属性可以只让其每次选择只展开一列(效果图) 实现该 ...

随机推荐

  1. js/css实现图片轮播

    实现样式: tplb.css ul, li { padding: 0; margin: 0; list-style: none; } .adver { margin: 0 auto; width: 7 ...

  2. C语言中~与!的区别

    ! 是逻辑非or否定 ​ 凡是a的值不为0的,!a 就等于0: ​ 如果a的值为0,则 !a 的值为1 而~这个是 按位取反 比如 int a=2 ; 用二进制表示为00 00 00 10; 则 !a ...

  3. winform导出excel报'object' does not contain a definition for 'get_Range'的问题

    现手上有个老项目采用.net framework3.0开发,改成4.0后,excel导出报'object' does not contain a definition for 'get_Range'的 ...

  4. sql 查询大数据 常用 50列优化

    大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到. 下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能 ...

  5. odoo 权限管理学习总结

    环境 odoo-14.0.post20221212.tar base_user_role-12.0.2.1.2.zip 下载地址: https://apps.odoo.com/apps/modules ...

  6. 今日Python练习--正则表达式的相关练习import re

    1.如何利用Python在文本中国提取手机号码 # 如何利用Python在文本中提取手机号码 import re content="白日依山尽,黄河入180320213699999909海流 ...

  7. 关于jsp页面中的小细节们

    细节一:利用jsp判断文本框的输入格式是否正确 也就是主要利用script标签进行判断,主要用到的是正则表达式(判断是否为整数): 再加上if语句的配合,就能够在文本框的格式不正确时,发出错误警告啦! ...

  8. MySQL Mock大量数据做查询响应测试

    上个迭代版本发布后,生产环境业务同事反馈仓配订单查询的页面加载时间过长. 因为页面原来是有的,这次开发是在原来基础上改的,因此没有额外做性能.测试环境只调用接口请求了少量数据去验证功能.在对比该迭代添 ...

  9. Why WebRTC丨“浅入深出”的工作原理详解

    前言 近几年实时音视频通信应用呈现出了大爆发的趋势.在这些实时通信技术的背后,有一项不得不提的技术--WebRTC. 今年 1 月,WebRTC 被 W3C 和 IETF 发布为正式标准.据调研机构 ...

  10. Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序

    前言   之前在ubuntu上发布qt程序相对还好,使用脚本,在麒麟上发布的时候,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdeployqt发布qt程序.  本篇文 ...