CSDN-浩淼的天空

专注于GIS的开发:ArcObject | ArcGIS Engine | ArcGIS Server | ArcIMS

蒋波涛ID:chiangbt
22610次访问,排名4923好友3人,关注者11
专心于基于ArcGIS的地理信息系统(GIS)知识的学习和研究
chiangbt的文章
原创 10 篇
翻译 0 篇
转载 0 篇
评论 48 篇
浩淼的公告
主Blog为www.hmgis.cn。专注于GIS开发,尤其是ArcGIS的开发研究工作。著有《ArcObjects开发基础与技巧》(2006.5 武汉大学出版社),目前正全力撰写《插件式GIS框架的设计与实现》,敬请期待......
最近评论
chiangbt:表格会出来啊,只是没有数据而已,但一样有表头的。
tubage408:不知道博主想过没有这样情况:如果开始var data = [
['1','male','name1','descn1'],
['2','male','name1','descn2'],
['3','male','name3','descn3'],
['4','male','name4','descn4'],
……
chiangbt:是这样的,ARCIMS是一个无状态的WEB服务,无需用户名和密码去访问。
qjk1234:你这么写确实可以指定跨域网站发送东西,但是发送用户名和密码的话,生成不了登陆session?
ASP_lover:
www.soAsp.net 站里的 软件开发技术资料
也很不错的。 推荐大家去看看, 我一直在看。
文章分类
收藏
    相册
    blog
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Ext2.0框架的Grid使用介绍收藏

    新一篇: 多Paht和Ring的Geometry的坐标转换问题 | 旧一篇: 使用Ext2.0的Ajax连接ArcIMS例子

    最近空闲时间在学习Ext2.0框架,只有一个字的感叹“强”,我从未想到JS代码能够写出这么绚丽的Web页面出来,以前看到YUI,惊若天人,如今看到EXT2.0的东西,更是感觉震撼。

     Ext2.0是一个JS框架,它的Grid控件和其它可以显示数据的控件,能够支持多种数据类型,如二维数组、Json数据和XML数据,甚至包括我们自定义的数据类型。Ext为我们提供了一个桥梁Ext.data.Store,通过它我们可以把任何格式的数据转化成grid可以使用的形式,这样就不需要为每种数据格式写一个grid的实现了。

      首先,一个表格应该有列定义,即定义表头ColumnModel:
    // 定义一个ColumnModel,表头中有四列
    var cm = new Ext.grid.ColumnModel([
        {header:
    '编号',dataIndex:'id'
    },
        {header:
    '性别',dataIndex:'sex'
    },
        {header:
    '名称',dataIndex:'name'
    },
        {header:
    '描述',dataIndex:'descn'
    }
    ]);
    cm.defaultSortable 
    = true
    ;
        该ColumnModel定义了表格的四个列,其每列的名称和对应的数据键。请注意defaultSortable属性,即为每个列都安上一个可以排序的功能。如果只想某些列举有该功能,可以设置:
    {header:'编号',dataIndex:'id',Sortable:true},

      现在就来看看这个Ext.data.Store是如何转换三种数据的。

    1.二维数组:
    // ArrayData
    var data = [
        [
    '1','male','name1','descn1'
    ],
        [
    '2','male','name1','descn2'
    ],
        [
    '3','male','name3','descn3'
    ],
        [
    '4','male','name4','descn4'
    ],
        [
    '5','male','name5','descn5'
    ]
    ];
    // ArrayReader
    var ds = new Ext.data.Store({
        proxy: 
    new
     Ext.data.MemoryProxy(data),
        reader: 
    new
     Ext.data.ArrayReader({}, [
            {name: 
    'id',mapping: 0
    },
            {name: 
    'sex',mapping: 1
    },
            {name: 
    'name',mapping: 2
    },
            {name: 
    'descn',mapping: 3
    }
        ])
    });
    ds.load();
      ds要对应两个部分:proxy和reader。proxy告诉我们从哪里获得数据,reader告诉我们如何解析这个数据。
    现在用的是Ext.data.MemoryProxy,它将内存中的数据data作为参数传递。Ext.data.ArrayReader专门用来解析数组,并且告诉我们它会按照定义的规范进行解析,每行按顺序读取四个数据,第一个叫id,第二个叫sex,第三个叫name,第四个descn。这些是跟cm定义中的dataIndex对应的。这样cm就知道哪列应该显示那条数据了。
      mapping属性用于标记data中的读取后的数据与标头的映射关系,一般是不用设置的。但如果我们想让sex的数据中name栏中出现,可以设置mapping值。即id的mapping为2,后者为0。
      记得要执行一次ds.load(),对数据进行初始化。

      数据的显示显得非常简单:
    HTML文件:
    <div id='grid'></div>
    JS文件:
    var grid = new Ext.grid.GridPanel({
        el: 
    'grid'
    ,
        ds: ds,
        cm: cm
    });
    grid.render();

    其显示结果为:

    2.如何在表格中添加CheckBox呢?

    var sm = new Ext.grid.CheckboxSelectionModel();
    var cm = new Ext.grid.ColumnModel([
        new Ext.grid.RowNumberer(),//自动行号
        sm,//添加的地方

        {header:'编号',dataIndex:'id'},
        {header:'性别',dataIndex:'sex'},
        {header:'名称',dataIndex:'name'},
        {header:'描述',dataIndex:'descn'}
    ]);

    var grid = new Ext.grid.GridPanel({
        el: 'grid3',
        ds: ds,
        cm: cm,
        sm: sm,//添加的地方
        title: 'HelloWorld'
    });

    3. 如何做Grid上触发事件呢?
    下面是一个cellclick事件
    grid.addListener('cellclick', cellclick);
    function cellclick(grid, rowIndex, columnIndex, e) {
        var record = grid.getStore().getAt(rowIndex);   //Get the Record
        var fieldName = grid.getColumnModel().getDataIndex(columnIndex);  //Get field name
        var data = record.get(fieldName);
        Ext.MessageBox.alert('show','当前选中的数据是'+data);
    }

    4.如何做Grid中做出快捷菜单效果:
    grid.addListener('rowcontextmenu', rightClickFn);//右键菜单代码关键部分
    var rightClick = new Ext.menu.Menu({
        id:'rightClickCont',  //在HTML文件中必须有个rightClickCont的DIV元素
        items: [
            {
                id: 'rMenu1',
                handler: rMenu1Fn,//点击后触发的事件
                text: '右键菜单1'
            },
            {
                //id: 'rMenu2',
                //handler: rMenu2Fn,
                text: '右键菜单2'
            }
        ]
    });
    function rightClickFn(grid,rowindex,e){
        e.preventDefault();
        rightClick.showAt(e.getXY());
    }
    function rMenu1Fn(){
       Ext.MessageBox.alert('right','rightClick');
    }
    其Grid如下:
     

    5.如何将一列中的数据根据要求进行改变呢?
    比如说性别字段根据其male或female改变显示的颜色,这种ColumnMode中设计:
    var cm = new Ext.grid.ColumnModel([
        new Ext.grid.RowNumberer(),
        sm,
        {header:'编号',dataIndex:'id'},
        {header:'性别',dataIndex:'sex',renderer:changeSex},
        {header:'名称',dataIndex:'name'},
        {header:'描述',dataIndex:'descn'}
    ]);
    cm.defaultSortable = true;

    function changeSex(value){
        if (value == 'male') {
            return "<span style='color:red;font-weight:bold;'>红男</span>";
        } else {
            return "<span style='color:green;font-weight:bold;'>绿女</span>";
        }
    }

     其它两种数据的Grid显示是相同的,其不同之处在于数据获取的过程:

    6.Json数据
    至于这种数据的类型请大家自己看Ajax的书籍:

     //JsonData
    var data = {
        'coders': [
            { 'id': '1', 'sex': 'male', 'name':'McLaughlin', 'descn': 'brett@newInstance.com' },
            { 'id': '2', 'sex': 'male','name':'Hunter', 'descn': 'jason@servlets.com' },
            { 'id': '3', 'sex': 'female','name':'Harold', 'descn': 'elharo@macfaq.com' },
            { 'id': '4', 'sex': 'male','name':'Harolds', 'descn': 'elhaross@macfaq.com' }
        ],
        'musicians': [
            { 'id': '1', 'name': 'Clapton', 'descn': 'guitar' },
            { 'id': '2', 'name': 'Rachmaninoff', 'descn': 'piano' }
        ]
    }
    //ds使用的MemoryProxy对象和JsonReader对象
    var ds = new Ext.data.Store({
            proxy: new Ext.data.MemoryProxy(data),
            reader: new Ext.data.JsonReader({root: 'coders'}, [
                {name: 'id'},
                {name: 'sex'},
                {name: 'name'},
                {name: 'descn'}
            ])
        });
    ds.load();

    var grid = new Ext.grid.GridPanel({
        el: 'grid3',
        ds: ds,
        cm: cm,
        sm: sm,
        title: 'HelloWorld',
        autoHeight: true//一定要写,否则显示的数据会少一行
    });
    grid.render();

    7.使用XML数据:
    注意,读取XML数据必须在服务器上进行。
    XML数据test.xml的内容:
    <?xml version="1.0" encoding="UTF-8"?>
    <dataset>
         <results>2</results>
         <item>
               <id>1</id>
               <sex>male</sex>
               <name>Taylor</name>
               <descn>Coder</descn>
         </item>
    </dataset>var ds3 = new Ext.data.Store({
        url: 'test.xml',   //XML数据
        reader: new Ext.data.XmlReader({record: 'item'}, [  //使用XmlReader对象
            {name: 'id'},
            {name: 'sex'},
            {name: 'name'},
            {name: 'descn'}
        ])
    });

    8.从服务器获取数据和数据翻页控件
    从一个服务器文件,如ASP、JSP或Servlet中获得数据二维Array、JSON或XML数据,也可以被Ext读取,并被Grid显示:
    服务器文件data.asp:
    <%
        start = cint(request("start"))
        limit = cint(request("limit"))

        dim json
        json=cstr("{totalProperty:100,root:[")
       
        for i = start to limit + start-1
            json =json + cstr("{'id':'") +cstr(i) + cstr("','name':'name") + cstr(i) + cstr("','descn':'descn") + cstr(i) + cstr("'}")
            if i <> limit + start - 1 then
                json =json + ","
            end if
        next
        json = json +"]}"
        response.write(json)
    %>

    我们可以看到,这个页面会根据传入的start和limit的不同,返回不同的数据,其实质是个分页的代码。下面是start=0,limit=10的JSON数据:
    {totalProperty:100,root:[{'id':'0','name':'name0','descn':'descn0'},{'id':'1','name':'name1','descn':'descn1'},{'id':'2','name':'name2','descn':'descn2'},{'id':'3','name':'name3','descn':'descn3'},{'id':'4','name':'name4','descn':'descn4'},{'id':'5','name':'name5','descn':'descn5'},{'id':'6','name':'name6','descn':'descn6'},{'id':'7','name':'name7','descn':'descn7'},{'id':'8','name':'name8','descn':'descn8'},{'id':'9','name':'name9','descn':'descn9'}]}

    我们使用分页控件来控制Grid的数据:
    Ext.onReady(function(){
        var sm = new Ext.grid.CheckboxSelectionModel();
       
        var cm = new Ext.grid.ColumnModel([
            new Ext.grid.RowNumberer(),
            sm,
            {header:'编号',dataIndex:'id'},
            {header:'性别',dataIndex:'sex'},
            {header:'名称',dataIndex:'name'},
            {header:'描述',dataIndex:'descn'}
        ]);
        cm.defaultSortable = true;

        var ds = new Ext.data.Store({
            proxy: new Ext.data.HttpProxy({url:'data.asp'}),
            reader: new Ext.data.JsonReader({
                totalProperty: 'totalProperty',
                root: 'root'
            }, [
                {name: 'id'},
                {name: 'name'},
                {name: 'descn'}
            ])
        });
        ds.load({params:{start:0,limit:10}});
       
        var grid = new Ext.grid.GridPanel({
            el: 'grid3',
            ds: ds,
            cm: cm,
            sm: sm,
            title: 'ASP->JSON',
            bbar: new Ext.PagingToolbar({
                pageSize: 10,
                store: ds,
                displayInfo: true,
                displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
                emptyMsg: "没有记录"
            }),
            tbar: new Ext.PagingToolbar({
                pageSize: 10,
                store: ds,
                displayInfo: true,
                displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
                emptyMsg: "没有记录"
            })
        });
        grid.render();

    })

    10.如何在Grid的上方添加按钮呢?
    添加按钮的关键之处在于tbar或bbar属性设置Toolbar工具条:
    var grid = new Ext.grid.GridPanel({
        el: 'grid3',
        ds: ds,
        cm: cm,
        sm: sm,
        title: 'HelloWorld',
        tbar: new Ext.Toolbar({
            items:[
                    {
                        id:'buttonA'
                        ,text:"Button A"
                        ,handler: function(){ alert("You clicked Button A"); }
                    }
                    ,
                    new Ext.Toolbar.SplitButton({})
                    ,{
                        id:'buttonB'
                        ,text:"Button B"
                        ,handler: function(){ alert("You clicked Button B"); }
                    }
                    ,
                    '-'
                    ,{
                        id:'buttonc'
                        ,text:"Button c"
                    }
                ]
            })

    });

    11.将GridPanel放入一个Panel或TabPanel中
    var tabs = new Ext.TabPanel({
        collapsible: true
        ,renderTo: 'product-exceptions'
        ,width: 450
        ,height:400
        ,activeTab: 0
        ,items:[
            {
                title: 'Unmatched'
            },{
                title: 'Matched'
            }
        ]
    });
    tabs.doLayout();

    var panel = new Ext.Panel({
        renderTo: 'panel',
        title:'panel',
        collapsible:true,
        width:450,
        height:400,
        items:[grid] //管理grid
    });

    Panel必须有DIV存在。其包含的Component有items管理。

    本文是在学习Ext2.0的基础上写的,因此,参考了许多网上存在的Blog文章。在此表示致敬!

    发表于 @ 2008年01月24日 21:58:00|评论(loading...)|编辑

    新一篇: 多Paht和Ring的Geometry的坐标转换问题 | 旧一篇: 使用Ext2.0的Ajax连接ArcIMS例子

    评论

    #endstar520 发表于2008-01-25 12:01:27  IP: 219.131.234.*
    很好很强大。不然知道加载速度如何?

    是否能做成服务器端控件?
    #zhoulonghuan 发表于2008-01-25 14:01:16  IP: 58.62.119.*
    太强了吧!
    我第一次看到js弄出这样的效果~~~
    #loglos 发表于2008-01-25 14:06:39  IP: 220.248.4.*
    非常不错的文章!
    希望能有更多关于ext的信息,ext我小试了一下,可以直接拷贝到自己的项目中使用,确实很方便。
    但是好多是使用div做的,在提交数据的时候不是太方便,特别是中文的时候。
    #chiangbt 发表于2008-01-25 14:58:01  IP: 60.190.56.*
    Ext2.0是客户端的JS库,不是在服务器端运行的。
    #mingyangkj 发表于2008-01-25 16:41:43  IP: 221.2.230.*
    太强了!
    非常不错的文章!

    #ygq581113 发表于2008-01-25 23:36:25  IP: 221.10.184.*
    不错
    #hjmaAsC 发表于2008-01-26 08:09:19  IP: 220.173.25.*
    好象是从NetBeans的样例里面拿出来似的
    #cozo 发表于2008-01-26 15:09:36  IP: 58.247.255.*
    这个玩意儿的JS压缩了还要500多K,另外还要加上100多K的CSS和图片文件,慢的要死。不过的确比较漂亮就是了。
    #dingdangxiaoma 发表于2008-01-26 16:34:33  IP: 121.22.24.*
    还行吧.ext2.0,也还可以吧.很强,,,有时间用一用.!
    #supper_wgr 发表于2008-01-28 00:03:03  IP: 124.78.169.*
    能否提供完整的例子啊,很想学习,另外问一下chiangbt,你做的例子上grid的中文是怎么改的啊,还有grid里面的数据为什么我改成中文它却显示成乱码了,,谢谢!
    #chiangbt 发表于2008-01-28 09:02:59  IP: 60.190.56.*
    将source\locale文件夹中的ext-lang-zh_CN.js文件引入即可搞定乱码。
    #xiaoliaolcy 发表于2008-01-28 10:18:42  IP: 125.71.99.*
    我最近也在研究这个grid,能否把这个例子发我参考一下,谢谢先

    java1982@126.com
    #supper_wgr 发表于2008-01-28 11:44:04  IP: 218.242.134.*
    我引入ext-lang-zh_CN.js这个后,gird上的中文是变了,但我里面的数据还是乱码啊,像自定义的中文列名,和里面中文数据都是乱码,不知道怎么回事,请帮忙给解决一下。
    另外能不能给一下你的例子啊,邮箱是0luo_ye0@163.com。非常感谢!
    #nstwolf 发表于2008-04-14 23:55:29  IP: 220.181.54.*
    在显示页面里面编码改成GB2312就可以了。
    #stlwhx 发表于2008-04-25 11:40:04  IP: 121.29.133.*
    楼主,我想问下,用Ext实现搜索功能,要用到什么东东啊?
    #javalfans 发表于2008-04-28 15:57:22  IP: 58.251.33.*
    公司即将用这个东东,正在找这方面的资料,很不错的文章,非常感谢...
    #tianze98 发表于2008-05-31 22:53:03  IP: 222.79.17.*
    我想请问一下,表格数据初始化完成后,要手动重新加载,该怎么写?
    store.({params:{start:0,limit:10}});这样不行好像
    #tubage408 发表于2008-07-04 20:19:42  IP: 222.82.157.*
    不知道博主想过没有这样情况:如果开始var data = [
    ['1','male','name1','descn1'],
    ['2','male','name1','descn2'],
    ['3','male','name3','descn3'],
    ['4','male','name4','descn4'],
    ['5','male','name5','descn5']
    ];中data中没有数据那表格就显示不出来了,这样情况如何处理呀?比如有这样的要求,我知道业务每次都查出不多的数据,就几条,这样显示在表格,开始的时候data中无数据....开始加载页面的时候data中是没有数据的,表格还要显示出来,该怎么做呢?
    #chiangbt 发表于2008-07-09 12:57:31  IP: 211.140.48.*
    表格会出来啊,只是没有数据而已,但一样有表头的。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 浩淼