`

ExtJS4.2学习(15)树形表格

    博客分类:
  • EXT
 
阅读更多
本节为ExtJS表格学习的最后一节,学完我将学习表单与输入控件的内容。

树形表格(TreeGrid)同时具备树形的分级结构和表格的丰富内容。
先引入扩展组件,老规矩:
//引入扩展组件  
Ext.Loader.setConfig({enabled: true});  
  
Ext.Loader.setPath('Ext.ux', '../ExtJS4.2/ux/');  
  
Ext.require([  
             'Ext.data.*',  
             'Ext.grid.*',  
             'Ext.tree.*',  
             'Ext.ux.CheckColumn'  
         ]);  


接下来创建TreeGrid
Ext.onReady(function(){  
    Ext.QuickTips.init();  
  
    //we want to setup a model and store instead of using dataUrl  
    Ext.define('Task', {  
        extend: 'Ext.data.Model',  
        fields: [  
            {name: 'task',     type: 'string'},  
            {name: 'user',     type: 'string'},  
            {name: 'duration', type: 'string'}  
        ]  
    });  
    var store = Ext.create('Ext.data.TreeStore', {  
        model: 'Task',  
        proxy: {  
            type: 'ajax',  
            //the store will get the content from the .json file  
            url: 'treegrid-data.json'  
        },  
        folderSort: true  
    });  
      
  //Ext.ux.tree.TreeGrid在UX扩展中也有,但不常用,您可以简单地使用一个tree.TreePanel  
    var tree = Ext.create('Ext.tree.Panel', {  
        title: 'Core Team Projects',  
        width: 500,  
        height: 300,  
        renderTo: 'treegrid',  
        collapsible: true,  
        useArrows: true,  
        rootVisible: false,  
        store: store,  
        multiSelect: true,  
        singleExpand: true,  
          
      //the 'columns' property is now 'headers'  
        columns: [{  
            xtype: 'treecolumn', //this is so we know which column will show the tree  
            text: 'Task',  
            flex: 2,  
            sortable: true,  
            dataIndex: 'task'  
        },{  
            //we must use the templateheader component so we can use a custom tpl  
            xtype: 'templatecolumn',  
            text: 'Duration',  
            flex: 1,  
            sortable: true,  
            dataIndex: 'duration',  
            align: 'center',  
            //add in the custom tpl for the rows  
            tpl: Ext.create('Ext.XTemplate', '{duration:this.formatHours}', {  
                formatHours: function(v) {  
                    if (v < 1) {  
                        return Math.round(v * 60) + ' mins';  
                    } else if (Math.floor(v) !== v) {  
                        var min = v - Math.floor(v);  
                        return Math.floor(v) + 'h ' + Math.round(min * 60) + 'm';  
                    } else {  
                        return v + ' hour' + (v === 1 ? '' : 's');  
                    }  
                }  
            })  
        },{  
            text: 'Assigned To',  
            flex: 1,  
            dataIndex: 'user',  
            sortable: true  
        }, {  
            xtype: 'checkcolumn',  
            header: 'Done',  
            dataIndex: 'done',  
            width: 40,  
            stopSelection: false  
        }, {  
            text: 'Edit',  
            width: 40,  
            menuDisabled: true,  
            xtype: 'actioncolumn',  
            tooltip: 'Edit task',  
            align: 'center',  
            icon: '../MyDemo/images/edit.png',  
            handler: function(grid, rowIndex, colIndex, actionItem, event, record, row) {  
                Ext.Msg.alert('Editing' + (record.get('done') ? ' completed task' : '') , record.get('task'));  
            }  
        }]  
    });  
});  


在列定义中有xtype: 'treecolumn',这是告诉列要以树形列来显示,在以后的表单或其他容器中也会以这样的方式来显示,有panelcolumn等,这里等以后讲到再说。

再看下JSON数据格式,后台只要符合这种形式,EXTJS就会给你自动解析出来:
{"text":".","children": [  
    {  
        task:'Project: Shopping',  
        duration:13.25,  
        user:'Tommy Maintz',  
        iconCls:'task-folder',  
        expanded: true,  
        children:[{  
            task:'Housewares',  
            duration:1.25,  
            user:'Tommy Maintz',  
            iconCls:'task-folder',  
            children:[{  
                task:'Kitchen supplies',  
                duration:0.25,  
                user:'Tommy Maintz',  
                leaf:true,  
                iconCls:'task'  
            },{  
                task:'Groceries',  
                duration:.4,  
                user:'Tommy Maintz',  
                leaf:true,  
                iconCls:'task',  
                done: true  
            },{  
                task:'Cleaning supplies',  
                duration:.4,  
                user:'Tommy Maintz',  
                leaf:true,  
                iconCls:'task'  
            },{  
                task: 'Office supplies',  
                duration: .2,  
                user: 'Tommy Maintz',  
                leaf: true,  
                iconCls: 'task'  
            }]  
        }, {  
            task:'Remodeling',  
            duration:12,  
            user:'Tommy Maintz',  
            iconCls:'task-folder',  
            expanded: true,  
            children:[{  
                task:'Retile kitchen',  
                duration:6.5,  
                user:'Tommy Maintz',  
                leaf:true,  
                iconCls:'task'  
            },{  
                task:'Paint bedroom',  
                duration: 2.75,  
                user:'Tommy Maintz',  
                iconCls:'task-folder',  
                children: [{  
                    task: 'Ceiling',  
                    duration: 1.25,  
                    user: 'Tommy Maintz',  
                    iconCls: 'task',  
                    leaf: true  
                }, {  
                    task: 'Walls',  
                    duration: 1.5,  
                    user: 'Tommy Maintz',  
                    iconCls: 'task',  
                    leaf: true  
                }]  
            },{  
                task:'Decorate living room',  
                duration:2.75,  
                user:'Tommy Maintz',  
                leaf:true,  
                iconCls:'task',  
                done: true  
            },{  
                task: 'Fix lights',  
                duration: .75,  
                user: 'Tommy Maintz',  
                leaf: true,  
                iconCls: 'task',  
                done: true  
            }, {  
                task: 'Reattach screen door',  
                duration: 2,  
                user: 'Tommy Maintz',  
                leaf: true,  
                iconCls: 'task'  
            }]  
        }]  
    },{  
        task:'Project: Testing',  
        duration:2,  
        user:'Core Team',  
        iconCls:'task-folder',  
        children:[{  
            task: 'Mac OSX',  
            duration: 0.75,  
            user: 'Tommy Maintz',  
            iconCls: 'task-folder',  
            children: [{  
                task: 'FireFox',  
                duration: 0.25,  
                user: 'Tommy Maintz',  
                iconCls: 'task',  
                leaf: true  
            }, {  
                task: 'Safari',  
                duration: 0.25,  
                user: 'Tommy Maintz',  
                iconCls: 'task',  
                leaf: true  
            }, {  
                task: 'Chrome',  
                duration: 0.25,  
                user: 'Tommy Maintz',  
                iconCls: 'task',  
                leaf: true  
            }]  
        },{  
            task: 'Windows',  
            duration: 3.75,  
            user: 'Darrell Meyer',  
            iconCls: 'task-folder',  
            children: [{  
                task: 'FireFox',  
                duration: 0.25,  
                user: 'Darrell Meyer',  
                iconCls: 'task',  
                leaf: true  
            }, {  
                task: 'Safari',  
                duration: 0.25,  
                user: 'Darrell Meyer',  
                iconCls: 'task',  
                leaf: true  
            }, {  
                task: 'Chrome',  
                duration: 0.25,  
                user: 'Darrell Meyer',  
                iconCls: 'task',  
                leaf: true  
            },{  
                task: 'Internet Exploder',  
                duration: 3,  
                user: 'Darrell Meyer',  
                iconCls: 'task',  
                leaf: true  
            }]  
        },{  
            task: 'Linux',  
            duration: 0.5,  
            user: 'Aaron Conran',  
            iconCls: 'task-folder',  
            children: [{  
                task: 'FireFox',  
                duration: 0.25,  
                user: 'Aaron Conran',  
                iconCls: 'task',  
                leaf: true  
            }, {  
                task: 'Chrome',  
                duration: 0.25,  
                user: 'Aaron Conran',  
                iconCls: 'task',  
                leaf: true  
            }]  
        }]  
    }  
]}  


这里还有一个扩展功能,如下:
表头点击箭头就会出现过滤组件,便于筛选数据,每列都有,是不是很丰富啊。

下面看代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Hello Extjs4.2</title>  
<link href="../ExtJS4.2/resources/css/ext-all.css" rel="stylesheet">  
<script src="../ExtJS4.2/ext-all.js"></script>  
<script src="../ExtJS4.2/locale/ext-lang-zh_CN.js"></script>  
<script type="text/javascript">  
//引入扩展组件  
Ext.Loader.setConfig({enabled: true});  
  
Ext.Loader.setPath('Ext.ux', '../ExtJS4.2/ux/');  
  
Ext.require([  
             'Ext.grid.*',  
             'Ext.data.*',  
             'Ext.ux.grid.FiltersFeature',  
             'Ext.toolbar.Paging',  
             'Ext.ux.ajax.JsonSimlet',  
             'Ext.ux.ajax.SimManager'  
         ]);  
Ext.define('Product', {  
    extend: 'Ext.data.Model',  
    fields: [{  
        name: 'id',  
        type: 'int'  
    }, {  
        name: 'company'  
    }, {  
        name: 'price',  
        type: 'float'  
    }, {  
        name: 'date',  
        type: 'date',  
        dateFormat: 'Y-m-d'  
    }, {  
        name: 'visible',  
        type: 'boolean'  
    }, {  
        name: 'size'  
    }]  
});  
Ext.onReady(function(){  
  
    Ext.ux.ajax.SimManager.init({  
        delay: 300,  
        defaultSimlet: null  
    }).register({  
        'myData': {  
            data: [  
                ['small', 'small'],  
                ['medium', 'medium'],  
                ['large', 'large'],  
                ['extra large', 'extra large']  
            ],  
            stype: 'json'  
        }  
    });  
  
    var optionsStore = Ext.create('Ext.data.Store', {  
        fields: ['id', 'text'],  
        proxy: {  
            type: 'ajax',  
            url: 'myData',  
            reader: 'array'  
        }  
    });  
  
    Ext.QuickTips.init();  
  
    // for this demo configure local and remote urls for demo purposes  
    var url = {  
        local:  'grid-filter.json',  // static data file  
        remote: 'grid-filter.php'  
    };  
  
    // configure whether filter query is encoded or not (initially)  
    var encode = false;  
  
    // configure whether filtering is performed locally or remotely (initially)  
    var local = true;  
  
    var store = Ext.create('Ext.data.JsonStore', {  
        // store configs  
        autoDestroy: true,  
        model: 'Product',  
        proxy: {  
            type: 'ajax',  
            url: (local ? url.local : url.remote),  
            reader: {  
                type: 'json',  
                root: 'data',  
                idProperty: 'id',  
                totalProperty: 'total'  
            }  
        },  
        remoteSort: false,  
        sorters: [{  
            property: 'company',  
            direction: 'ASC'  
        }],  
        pageSize: 50  
    });  
  
    var filters = {  
        ftype: 'filters',  
        // encode and local configuration options defined previously for easier reuse  
        encode: encode, // json encode the filter query  
        local: local,   // defaults to false (remote filtering)  
  
        // Filters are most naturally placed in the column definition, but can also be  
        // added here.  
        filters: [{  
            type: 'boolean',  
            dataIndex: 'visible'  
        }]  
    };  
  
    // use a factory method to reduce code while demonstrating  
    // that the GridFilter plugin may be configured with or without  
    // the filter types (the filters may be specified on the column model  
    var createColumns = function (finish, start) {  
  
        var columns = [{  
            dataIndex: 'id',  
            text: 'Id',  
            // instead of specifying filter config just specify filterable=true  
            // to use store's field's type property (if type property not  
            // explicitly specified in store config it will be 'auto' which  
            // GridFilters will assume to be 'StringFilter'  
            filterable: true,  
            width: 30  
            //,filter: {type: 'numeric'}  
        }, {  
            dataIndex: 'company',  
            text: 'Company',  
            id: 'company',  
            flex: 1,  
            filter: {  
                type: 'string'  
                // specify disabled to disable the filter menu  
                //, disabled: true  
            }  
        }, {  
            dataIndex: 'price',  
            text: 'Price',  
            filter: {  
                //type: 'numeric'  // specify type here or in store fields config  
            },  
            width: 70  
        }, {  
            dataIndex: 'size',  
            text: 'Size',  
            filter: {  
                type: 'list',  
                store: optionsStore  
                //,phpMode: true  
            }  
        }, {  
            dataIndex: 'date',  
            text: 'Date',  
            filter: true,  
            renderer: Ext.util.Format.dateRenderer('m/d/Y')  
        }, {  
            dataIndex: 'visible',  
            text: 'Visible'  
            // this column's filter is defined in the filters feature config  
        }];  
  
        return columns.slice(start || 0, finish);  
    };  
  
    var grid = Ext.create('Ext.grid.Panel', {  
        border: false,  
        store: store,  
        columns: createColumns(4),  
        loadMask: true,  
        features: [filters],  
        dockedItems: [Ext.create('Ext.toolbar.Paging', {  
            dock: 'bottom',  
            store: store  
        })],  
        emptyText: 'No Matching Records'  
    });  
  
    // add some buttons to bottom toolbar just for demonstration purposes  
    grid.child('pagingtoolbar').add([  
        '->',  
        {  
            text: 'Encode: ' + (encode ? 'On' : 'Off'),  
            tooltip: 'Toggle Filter encoding on/off',  
            enableToggle: true,  
            handler: function (button, state) {  
                var encode = (grid.filters.encode !== true);  
                var text = 'Encode: ' + (encode ? 'On' : 'Off');  
                grid.filters.encode = encode;  
                grid.filters.reload();  
                button.setText(text);  
            }  
        },  
        {  
            text: 'Local Filtering: ' + (local ? 'On' : 'Off'),  
            tooltip: 'Toggle Filtering between remote/local',  
            enableToggle: true,  
            handler: function (button, state) {  
                var local = (grid.filters.local !== true),  
                    text = 'Local Filtering: ' + (local ? 'On' : 'Off'),  
                    newUrl = local ? url.local : url.remote,  
                    store = grid.view.getStore();  
  
                // update the GridFilter setting  
                grid.filters.local = local;  
                // bind the store again so GridFilters is listening to appropriate store event  
                grid.filters.bindStore(store);  
                // update the url for the proxy  
                store.proxy.url = newUrl;  
  
                button.setText(text);  
                store.load();  
            }  
        },  
        {  
            text: 'All Filter Data',  
            tooltip: 'Get Filter Data for Grid',  
            handler: function () {  
                var data = Ext.encode(grid.filters.getFilterData());  
                Ext.Msg.alert('All Filter Data',data);  
            }  
        },{  
            text: 'Clear Filter Data',  
            handler: function () {  
                grid.filters.clearFilters();  
            }  
        },{  
            text: 'Add Columns',  
            handler: function () {  
                if (grid.headerCt.items.length < 6) {  
                    grid.headerCt.add(createColumns(6, 4));  
                    grid.view.refresh();  
                    this.disable();  
                }  
            }  
        }  
    ]);  
  
    var win = Ext.create('Ext.Window', {  
        title: 'Grid Filters Example',  
        height: 400,  
        width: 700,  
        layout: 'fit',  
        items: grid  
    }).show();  
  
    store.load();  
});  
</script>  
</head>  
<body>  
<h1>我的ExtJS4.2学习之路</h1>  
<hr />  
作者:束洋洋  
开始日期:2013年11月26日 22:57:53  
<h2>深入浅出ExtJS之树形表格</h2>  
<div id="grid"></div>  
</body>  
</html>  
  • 大小: 155.1 KB
分享到:
评论

相关推荐

    nodejs+extjs4.2+mysql

    它提供了大量的组件,如表格、面板、表单、树形视图等,以及一套完整的 MVC(模型-视图-控制器)架构。在这个项目中,ExtJS 4.2 被用于构建前端用户界面,展示数据,处理用户交互,并通过 AJAX 技术与后端 Node.js ...

    ExtJs4.2 下拉框树

    综上所述,`ExtJs4.2 下拉框树`的实现涉及到了组件扩展、树形数据处理、界面布局和交互设计等多个方面,通过对`TreePicker.js`的修改,开发者成功地克服了原生框架的限制,提供了更符合需求的下拉树功能。

    extjs4.2+java经典

    它提供了大量的UI组件,如表格、图表、表单、树形菜单等,以及一个强大的数据包管理器,可以方便地与服务器通信。此外,ExtJS支持响应式设计,确保了在不同设备上的良好表现。 ### Java与ExtJS的集成 在企业级开发...

    springMVC+Extjs4.2实现用户增删改查功能

    它的组件库丰富,支持拖放、表格、表单、树形视图等多种UI元素,使得开发出的界面具有很高的交互性和美观性。在用户管理场景下,ExtJS可以用于创建表格展示用户信息,表单用于输入和编辑用户数据,以及各种按钮实现...

    基于Spring+Struts2.3+ExtJS4.2的简单文件管理系统

    在这个文件管理系统中,ExtJS4.2可能被用于创建用户界面,提供交互式的组件,如表格、树形结构和表单,用于展示文件列表、进行文件操作以及用户管理等。 4. **HTML5预览**:HTML5引入了一系列新特性,如File API,...

    Ext JS 4.2.6.1811主题classic

    2. **组件丰富**:经典主题支持大量的组件,如表格、树形视图、图表、表单、窗口、面板等,这些组件都经过精心设计,可以方便地组合成复杂的应用界面。 3. **可扩展性**:Ext JS允许开发者创建自定义主题,通过SASS...

    ExtJS-4.2.6扩展ux插件89个

    它支持现代浏览器,包括IE8+,并且提供了一套完整的组件库,如表格、面板、窗口、树形视图等,以及数据绑定和模型层,使得开发响应式和数据驱动的应用变得简单。 2. **ux 插件** - `ux`目录下的插件是社区贡献的...

    extjs 树型分页组件

    通过上述内容,我们可以看到EXTJS的树型分页组件是如何有效地处理大量树节点的。它通过分批加载数据,显著提高了大尺寸树结构的加载速度,同时也保持了良好的用户体验。在实际项目中,结合适当的服务器端策略,EXTJS...

    EXTJS4+STRUTS2+JAVA增删改查

    它提供了丰富的组件库,如表格、表单、树形结构和图表,以及强大的数据绑定和远程数据通信机制。EXTJS4的MVC架构使得代码组织清晰,易于维护。在本示例中,EXTJS4将负责前端的用户界面展示,包括表格显示数据、表单...

    ext-4.2.1.883

    1. **组件化架构**:ExtJS的核心是它的组件系统,这使得开发者可以方便地组合和复用各种UI元素,如表格、面板、表单、树形视图等。每个组件都有自己的属性、方法和事件,可以独立工作,也可以与其他组件相互嵌套。 ...

    extjs 简单框架搭建

    5. **创建组件**:EXTJS提供了大量的预定义组件,如面板(Panel)、表格(Grid)、树形控件(Tree)、表单(Form)等。在`app`目录下创建对应的类文件,如`views/MyPanel.js`,定义组件的配置和行为。 6. **数据...

    EXTJS4.0视频教程

    - **Tree Panel**:树形结构组件,适用于展示层级关系数据。 - **Button**:按钮组件,触发事件或动作的基本单元。 - **Checkbox**:复选框组件,用于实现多选功能。 - **Radio Button**:单选按钮组件,用于实现...

    ExtJS4下拉树组件

    在ExtJS4中,下拉树组件(TreeComboBox)是一种特殊的组合框,它结合了下拉列表和树形结构的功能,允许用户通过选择树节点来填充组合框的值。这种组件广泛应用于需要展示分层数据结构的应用场景中。 #### 二、核心...

    extjs4.2.3

    3. **组件增强**:EXTJS中的各个组件,如表格(Grid)、树形视图(Tree)、表单(Form)等,可能在4.2.3版本中得到了改进。例如,表格排序和过滤可能更加智能,表单验证更准确,树形视图的展开和折叠性能提升。 4. ...

    comboBoxDemo

    下拉树是一种特殊类型的下拉列表,其中的选项以树形结构组织,这在处理层次关系的数据时非常有用,比如部门结构、地区层级等。 在ExtJS 4.2中实现下拉树,我们需要配置ComboBox的以下关键属性: 1. **store**: 这...

    struts2+ext4.2

    EXTJS 4.2版本包含了丰富的组件库,如表格、面板、表单、树形视图等,以及强大的数据绑定和布局管理功能。在Struts2框架下,EXTJS可以用于创建前端用户界面,提供美观且交互性强的网页效果,与后端的Struts2进行数据...

    Java + ExtJs示例

    1. **ExtJS组件库**:ExtJS包含了大量的预定义UI组件,如表格、树形视图、表单、按钮、面板等,这些组件可以帮助快速构建用户界面。 2. **数据模型和Store**:ExtJS的数据模型(Model)用于定义数据结构,Store则...

    ExtJs教程_完整版.pdf

    - **特点**: 展示了如何使用ExtJS创建复杂的用户界面,如网格、树形视图等。 **7.2 SimpleTask任务跟踪程序** - **概述**: SimpleTask是一个基于Google Gears数据库的任务跟踪程序,演示了如何使用ExtJS与本地存储...

    精通JS脚本之ExtJS框架.part2.rar

    10.12 表格与树形的结合——Ext.ux.tree.ColumnTree 第11章 其他布局类简介 11.1 标准布局类 11.1.1 折叠布局——AccordionLayout 11.1.2 边框布局——BorderLayout 11.1.3 卡片式布局——CardLayout 11.1.4 ...

    Ext表格获取后台数据

    ExtJS框架提供了许多强大的功能和组件,例如表格控件、树形控件、表单控件等,使开发者能够快速构建RIA应用程序。 知识点: 1. ExtJS框架的基本概念和功能 2. Ext.grid.GridPanel的基本使用和配置 3. Ext....

Global site tag (gtag.js) - Google Analytics