`

Ext动态grid

阅读更多
我们知道,实现extjs的Grid必须先定义一个ColumnModel,指定列名称、列标题、宽度、对齐方式,然后定义一个Record和Store,指定数据源的字段名、类型,最后定义一个Grid,完整过程的代码类似如下:     // the column model has information about grid columns
    // dataIndex maps the column to the specific data field in
    // the data store (created below)
    var cmCust = new Ext.grid.ColumnModel([{
           header: "客户编码",
           dataIndex: 'CUSTID',
           width: 70
        }, {
           header: "客户简称",
           dataIndex: 'CUSTSHORTNAME',
           width: 200
        }, {   
           header: "预收金额",
           dataIndex: 'PREPAYMENT',
           width: 100,
           align: 'right',
           renderer: Ext.util.Format.gbMoney
        },{
           header: "应收金额",
           dataIndex: 'PAYMENT',
           width: 100,
           align: 'right',
           renderer: Ext.util.Format.gbMoney
        },{
           header: "实际欠款",
           dataIndex: 'SJQK',
           width: 100,
           align: 'right',
           renderer: Ext.util.Format.gbMoney
        },{
           header: "信用期限",
           dataIndex: 'LICENSEPERIOD',
           width: 100,
           align: 'right'
        },{
           header: "信用额度",
           dataIndex: 'LICENSEMONEY',
           width: 100,
           align: 'right',
           renderer: Ext.util.Format.gbMoney
        }]);

    // by default columns are sortable
    cmCust.defaultSortable = true;

    // this could be inline, but we want to define the order record
    // type so we can add records dynamically
    var cust = Ext.data.Record.create([
           {name: 'CUSTID', type: 'string' },
           {name: 'CUSTSHORTNAME', type: 'string'},
           {name: 'PREPAYMENT', type: 'float'},
           {name: 'PAYMENT', type: 'float'},
           {name: 'SJQK', type: 'float'},
           {name: 'LICENSEPERIOD', type: 'float'},
           {name: 'LICENSEMONEY', type: 'float'}
      ]);

    // create the Data Store
    var dsCust = new Ext.data.Store({
        // load using HTTP
        proxy: new Ext.data.HttpProxy({url: '../getCustList.do'}),
       
        // the return will be XML, so lets set up a reader
        reader: new Ext.data.DynamicXmlReader({
               // records will have a "customer" tag
               record: 'table',
               totalRecords: 'records'
           }, cust)
    });

var gridCust = new Ext.grid.DynamicGrid( 'customer-grid', {
        ds: dsCust,
        cm: cmCust,
        selModel: new Ext.grid.RowSelectionModel(),
        enableColLock:false,
        loadMask: true,    });

gridCust.render();

此过程相当繁琐。很多情况下,我们需要一个通用的动态Grid,不必指定字段名、字段类型、列头等信息,而是根据返回记录(通常是json或xml格式)的结构和内容,自动将记录展现在Grid中,这就是Dynamic Grid。

extjs的论坛上有两种方式实现Dynamic Grid,一种是json,另一种是xml。前者请看http://extjs.com/learn/Ext_Extensions。对于xml方式,需要扩展Ext.data.XmlReader和Ext.grid.Grid,具体根据返回的xml的结构,假设返回的xml类似:

<?xml version="1.0" encoding="UTF-8"?>
<response success='true'>
        <database>
            <record>
                <SUPPLIERID><![CDATA[1]]></SUPPLIERID>
                <SUPPLIERSHORTNAME><![CDATA[中原公司]]></SUPPLIERSHORTNAME>
                <PREPAYMENT><![CDATA[0.00000000]]></PREPAYMENT>
                <PAYMENT><![CDATA[0.00000000]]></PAYMENT>
                <SJQK><![CDATA[0.00000000]]></SJQK>
            </record>
            <record>
                <SUPPLIERID><![CDATA[2]]></SUPPLIERID>
                <SUPPLIERSHORTNAME><![CDATA[广州市五金公司]]></SUPPLIERSHORTNAME>
                <PREPAYMENT><![CDATA[0.00000000]]></PREPAYMENT>
                <PAYMENT><![CDATA[6855.00000000]]></PAYMENT>
                <SJQK><![CDATA[6855.00000000]]></SJQK>
            </record>

                                            </database>
</response>
在上面的xml内容中,每个<record>是一个记录,我们必须得到<record>中所有子元素的名称,做为Grid的列标题:

Ext.grid.DynamicColumnModel = function(store) {
    var cols = [];
    var recordType = store.reader.recordType;
    var fields = recordType.prototype.fields;
  
    for (var i = 0; i < fields.keys.length; i++) {
        var fieldName = fields.keys[i];
        var field = recordType.getField(fieldName);
        cols[i] = {
            header: field.header,
            dataIndex: field.name,
            tooltip: field.tooltip,
            hidden: field.hidden,
            sortable:true,
            renderer: eval(field.renderer)
        };
    }
    store.fields = fields;this, cols);
};
Ext.extend(Ext.grid.DynamicColumnModel, Ext.grid.ColumnModel, {});

Ext.data.DynamicXmlReader = function(config) {
    Ext.data.DynamicXmlReader.superclass.constructor.call(this, config, []);
};
Ext.extend(Ext.data.DynamicXmlReader, Ext.data.XmlReader, {
    getRecordType : function(data) {
        recordDefinition = Ext.DomQuery.select( this.meta.record + ':first-child > *', data);
        var arr = [];
        for (var i = 0; i < recordDefinition.length; i++) {
            arr[i] = {
                name:recordDefinition[i].tagName,
                header:recordDefinition[i].tagName
            };
        }

        this.recordType = Ext.data.Record.create(arr);
        return this.recordType;
    },
      
    readRecords : function(doc) {
        this.xmlData = doc;
        var root = doc.documentElement || doc;
        this.getRecordType(root);
        return Ext.data.DynamicXmlReader.superclass.readRecords.call(this, doc);
    }
});

Ext.grid.GridView.prototype.bindColumnModel = function(cm) {
    if(this.cm){
        this.cm.un("widthchange", this.updateColumns, this);
        this.cm.un("headerchange", this.updateHeaders, this);
        this.cm.un("hiddenchange", this.handleHiddenChange, this);
        this.cm.un("columnmoved", this.handleColumnMove, this);
        this.cm.un("columnlockchange", this.handleLockChange, this);
    }
    if(cm){
        this.generateRules(cm);
        cm.on("widthchange", this.updateColumns, this);
        cm.on("headerchange", this.updateHeaders, this);
        cm.on("hiddenchange", this.handleHiddenChange, this);
        cm.on("columnmoved", this.handleColumnMove, this);
        cm.on("columnlockchange", this.handleLockChange, this);
    }
    this.cm = cm;
};

Ext.grid.DynamicGrid = function(container, config) {
    Ext.grid.DynamicGrid.superclass.constructor.call(this, container, config);
};
Ext.extend(Ext.grid.DynamicGrid, Ext.grid.Grid, {
    render : function() {
        this.dataSource.addListener('load', this.doReconfiguration, this);
        this.colModel = new Ext.grid.DefaultColumnModel([{ header: '', dataIndex: '' }]);
        Ext.grid.DynamicGrid.superclass.render.call(this);
    },

    doReconfiguration : function() {
        this.colModel = new Ext.grid.DynamicColumnModel(this.dataSource);
        this.view.bindColumnModel(this.colModel);
        this.view.refresh(true);
        //this.dataSource.removeListener("load", this.doReconfiguration);
    }
});

    Ext.grid.DynamicColumnModel.superclass.constructor.call(
上面的代码实现了DynamicColumnModel、DynamicXmlReader和DynamicGrid,DynamicXmlReader根据xml文件的结构和内容,自动配置一个ColumnModel和Store,这样最终的Dynamic Grid实现代码如下所示:

var dsCust = new Ext.data.Store({
        // load using HTTP
        proxy: new Ext.data.HttpProxy({url: '../getCustList.do'}),   
        // the return will be XML, so lets set up a reader
        reader: new Ext.data.DynamicXmlReader({
               record: 'record',
               totalRecords: 'records'
           })
    });

var gridCust = new Ext.grid.DynamicGrid( 'customer-grid', {
        ds: dsCust,
        //cm: cmCust,
        selModel: new Ext.grid.RowSelectionModel(),
        enableColLock:false,
        loadMask: true
    });
   gridCust.render();
相比本文开头的代码简化了很多。当然还有很多地方需要优化,例如实现描述性的列标题(而不是以字段名做为列标题),配置列宽和对齐方式,实现Dynamic EditorGrid等,通常我们还需要一个配置档,将这些原先硬编码的信息在配置档里配置好,然后在返回的json和xml中,除了有结果记录外,还有配置档中的meta信息,以便根据这些信息自动展现Dyanmic Grid。

相比而言,由于json较xml简洁,而且JsonReader本身就支持meta数据,使用JsonReader实现DynamicGrid较XmlReader方式简单,运行效率也高。当然,前提是必须将记录转换成json格式,目前json格式可能不如xml格式使用的多。

需要注意的是,由于Dynamic Grid是在运行时生成ColumnModel,如果你设置了状态管理器,即:Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
那么一旦Dynamic Grid的状态改变,如columnmove/columnresize/sortchange,当重新创建Dynamic Grid时
(例如刷新页面后重新访问),ext会试图先从cookie中读取状态信息,而此时ColumnModel还没有生成,系统就会报错。所以,可考虑关闭状态管理器,或重写Grid的applyState()方法

分享到:
评论

相关推荐

    Ext grid 动态添加字段、列扩展

    Ext grid 动态添加字段、列扩展, 如何动态添加或者删除一个grid的列

    EXT2.0 GRID 示例

    6. **事件监听**:EXT提供了丰富的事件系统,如`rowselect`、`cellclick`等,可以监听用户的交互行为,实现动态响应。 7. **Ajax交互**:GRID通常与服务器进行异步数据交换,EXT的AJAX组件(如AjaxProxy)用于发送...

    Ext grid中渲染进度条,超帅 源码-----下载不扣分,回帖加1分,欢迎下载,童叟无欺。

    Ext grid中渲染进度条,超帅 源码-----下载不扣分,回帖加1分,欢迎下载,童叟无欺。Ext grid中渲染进度条,超帅 源码-----下载不扣分,回帖加1分,欢迎下载,童叟无欺。Ext grid中渲染进度条,超帅 源码-----下载不扣分...

    Ext自定义Grid Cell插件

    在Ext JS这个强大的JavaScript框架中,`Grid`是用于展示数据的一种常见组件,它提供了灵活的数据展示和操作功能。在实际开发中,我们有时需要在Grid的单元格(Cell)中添加更丰富的交互元素,例如输入框、下拉选择器...

    EXT 通用动态Grid封装js

    对ext Grid进行了封装,动态加载数据源,动态生成列

    Ext jsGrid 锁列问题

    用于Ext开发Grid中遇到的所锁列的问题,这个很有帮助

    Ext4 grid打印

    Ext4 Grid提供了丰富的功能,包括数据排序、筛选、分页以及列的动态调整等。在这个场景下,"grid打印"指的是将Grid中的数据导出或者可视化地呈现到纸上,以便于用户进行查阅或存档。这通常涉及到打印预览,确保数据...

    Ext grid合并单元格

    根据提供的文件信息,我们可以深入探讨如何在 Ext JS 中实现 Grid 的单元格合并功能。此案例主要涉及到了自定义 GridView 的 `renderHeaders` 方法来达到单元格合并的目的,并且还涉及了模板(Template)的使用、...

    ext grid 动态扩展

    本篇将详细介绍如何实现 `Ext Grid` 的列动态添加。 1. **创建 ColumnModel** `Ext.grid.ColumnModel` 是用于定义 `GridPanel` 列结构的类。在创建 `ColumnModel` 时,我们需要提供一个包含列信息的 JavaScript ...

    Ext Grid 导出Excel

    在IT领域,特别是Web开发中,Ext Grid是一个广泛使用的组件,用于展示和管理大量数据。它提供了丰富的功能,包括排序、筛选、分页等,使得数据的交互和操作变得非常便捷。当我们需要将Ext Grid中的数据导出为Excel...

    Ext grid panel 滚动条位置不变

    ### Ext grid panel 滚动条位置不变 在前端开发领域,特别是在使用Ext JS框架时,保持滚动条位置不变是一个非常实用的功能。特别是在处理实时数据更新的场景下,这一功能可以确保用户在数据刷新后仍然停留在之前...

    JSP中使用EXT实现grid table

    在JavaServer Pages (JSP) 开发中,EXT 是一个流行的JavaScript 框架,它提供了丰富的用户界面组件,包括Grid(数据网格)和Table。EXT 提供了一种优雅的方式来展示和操作数据,尤其适用于创建交互式的Web应用程序,...

    Ext.grid.GridPanel属性祥解

    ### Ext.grid.GridPanel属性详析 #### 一、Ext.grid.GridPanel概述 `Ext.grid.GridPanel`是ExtJS中用于展示表格数据的核心组件之一。它提供了丰富的配置选项和方法来帮助开发者灵活地控制表格的表现形式及功能。...

    ext grid tree 应用

    综上所述,"ext grid tree 应用"展示了EXT JS在构建动态、交互式Web应用程序的强大能力,包括数据展示、数据管理、用户交互以及个性化设置等多个方面。通过学习和理解这些知识点,开发者可以更好地利用EXT JS创建...

    ExtJs动态grid的生成

    我们首先从标题"ExtJs动态grid的生成"开始,了解动态生成Grid的基本概念和实现方法。 动态生成Grid意味着在运行时根据需求创建和更新Grid组件,而不是在应用初始化时静态定义。这种灵活性允许开发者更好地响应数据...

    Ext框架的Grid使用介绍

    这篇"Ext框架的Grid使用介绍"将深入探讨Grid的使用方法和技巧。 Grid组件在EXT JS中扮演着数据表格的角色,可以展示多列数据,并且支持排序、分页、筛选、编辑等功能。它的灵活性在于能够根据需求定制各种复杂的...

    Ext grid 简单实例

    Ext Grid是Ext JS库中的一个核心组件,用于展示和操作数据集。在Web应用程序中,它经常被用来作为数据表格,允许用户查看、排序、筛选和编辑数据。在这个"Ext Grid简单实例"中,我们将探讨如何从Web服务提取数据并将...

    ext-grid+json简单应用

    在"EXT-GRID+JSON简单应用"中,我们将探讨如何使用EXT-JS的Grid组件与JSON数据源进行集成,以创建一个动态的数据表格。 EXT-JS的Grid组件允许开发者通过定义列模型、存储器和视图来展示数据。在JSON方面,它是一种...

    ext grid 显示数据

    在EXT JS这个强大的JavaScript框架中,Grid组件是用于展示大量结构化数据的核心组件。"ext grid 显示数据"这一主题,是深入理解EXT JS开发的关键知识点之一,特别是在处理表格和列表展示时。在"LearningExtJS 第五...

    ext grid 合计行

    找了半天,结果在extjs的老家找到一个前辈写的代码,可以在grid上面加上合计, &lt;br&gt;但是却只能合计grid里面的数据,但是我们平常一般是只显示20行或者30行,这样的合计就没有什么意义,我们的合计数据是单独从...

Global site tag (gtag.js) - Google Analytics