Chinaunix首页 | 论坛 | 博客

acc

  • 博客访问: 802708
  • 博文数量: 170
  • 博客积分: 7011
  • 博客等级: 少将
  • 技术积分: 1660
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-31 12:02
文章分类

全部博文(170)

文章存档

2014年(7)

2010年(2)

2009年(62)

2008年(25)

2007年(67)

2006年(7)

我的朋友

分类: Java

2009-09-01 17:49:16

ExtJS中的表格功能非常强大,包括了排序、缓存、拖动、隐藏某一列、自动显示行号、列汇总、单元格编辑等实用功能。
    表格由类Ext.grid.GridPanel定义,继承自Panel,其xtype为grid。ExtJS中,表格Grid必须包含列定义信息,并指定表格的数据存储器Store。表格的列信息由类Ext.grid.ColumnModel定义、而表格的数据存储器由Ext.data.Store定义,数据存储器根据解析的数据不同分为SimpleStroe、JsonStore、GroupingStore等。
    1、首先来看最简单的使用表格(SimpleStroe)的代码:
 /// 
Ext.onReady(function(){
    var data=[ [1, 'EasyJWeb', 'EasyJF',''],
            [2, 'jfox', 'huihoo',''],
            [3, 'jdon', 'jdon',''],
            [4, 'springside', 'springside',''] ];
    var store=new Ext.data.SimpleStore({data:data,fields:["id","name","organization","homepage"]});
    var grid = new Ext.grid.GridPanel({
        renderTo:"hello",
        title:"中国Java开源产品及团队",
        height:150,
        width:600,
        columns:[{header:"项目名称",dataIndex:"name"},
        {header:"开发团队",dataIndex:"organization"},
        {header:"网址",dataIndex:"homepage"}],
        store:store,
        autoExpandColumn:2
    });
});

   

这个地方法应该注意,在HTML页面中有id为hello的标签,如:

否则将会报错:dom为空或不是对象。这个问题让我整了好久。

 

执行上面的代码,可以得到一个简单的表格,如下图所示:

    上面的代码中,第一行“var data=…”用来定义表格中要显示的数据,这是一个[][]二维数组;第二行“var store=…”用来创建一个数据存储,这是GridPanel需要使用配置属性,数据存储器Store负责把各种各样的数据(如二维数组、JSon对象数组、xml文本)等转换成ExtJS的数据记录集Record,关于数据存储器Store我们将在下一章中作专门介绍。第三行“var grid = new Ext.grid.GridPanel(…)”负责创建一个表格,表格包含的列由columns配置属性来描述,columns是一数组,每一行数据元素描述表格的一列信息,表格的列信息包含列头显示文本(header)、列对应的记录集字段(dataIndex)、列是否可排序(sorable)、列的渲染函数(renderer)、宽度(width)、格式化信息(format)等,在上面的列子中只用到了header及dataIndex。
    下面我们看简单看看表格的排序及隐藏列特性,简单修改一下上面的代码,内容如下:

 Ext.onReady(function(){ 
    var data=[ [1, 'EasyJWeb', 'EasyJF',''],
            [2, 'jfox', 'huihoo',''],
            [3, 'jdon', 'jdon',''],
            [4, 'springside', 'springside',''] ];
    var store=new Ext.data.SimpleStore({data:data,fields:["id","name","organization","homepage"]});
    var colM=new Ext.grid.ColumnModel([{header:"项目名称",dataIndex:"name",sortable:true},
                                    {header:"开发团队",dataIndex:"organization",sortable:true},
                                    {header:"网址",dataIndex:"homepage"}]);
        var grid = new Ext.grid.GridPanel({
            renderTo:"hello",
            title:"中国Java开源产品及团队",
            height:200,
            width:600,
            cm:colM,
            store:store,
            autoExpandColumn:2
    });
});

    直接使用new Ext.grid.ColumnModel来创建表格的列信定义信息,在“项目名称“及“开发团队”列中我们添加了sortable为true的属性,表示该列可以排序,执行上面的代码,我们可以得到一个支持按“项目名称“或“开发团队”的表格,如下图所示。

(按项目名称排序)

(可排序的列表头后面小按钮可以弹出操作菜单)

(可以指定隐藏哪些列)

    另外,每一列的数据渲染方式还可以自己定义,比如上面的表格中,我们希望用户在表格中点击网址则直接打开这些开源团队的网站,也就是需要给网址这一列添加上超级连接。下面的代码实现这个功能:

 function showUrl(value)
{
    return ""+value+"";
}
Ext.onReady(function(){
    var data=[ [1, 'EasyJWeb', 'EasyJF',''],
            [2, 'jfox', 'huihoo',''],
            [3, 'jdon', 'jdon',''],
            [4, 'springside', 'springside',''] ];
    var store=new Ext.data.SimpleStore({data:data,fields:["id","name","organization","homepage"]});
    var colM=new Ext.grid.ColumnModel([{header:"项目名称",dataIndex:"name",sortable:true},
                                {header:"开发团队",dataIndex:"organization",sortable:true},
                                {header:"网址",dataIndex:"homepage",renderer:showUrl}]);
    var grid = new Ext.grid.GridPanel({
        renderTo:"hello",
        title:"中国Java开源产品及团队",
        height:200,
        width:600,
        cm:colM,
        store:store,
        autoExpandColumn:2
    });
});

    上面的代码跟前面的示例差别不大,只是在定义“网址”列的时候多了一个renderer属性,即{header:"网址",dataIndex:"homepage",renderer:showUrl}。showUrl是一个自定义的函数,内容就是根据传入的value参数返回一个包含标签的html片段。运行上面的代码显示结果如下图所示:

    自定义的列渲染函数可以实现在单元格中显示自己所需要的各种信息,只是的浏览器能处理的html都可以。
    2、除了二级数组以外,表格还能显示其它格式的数据吗?答案是肯定的,下面假如我们的表格数据data定义成了下面的形式(JsonStore):

     var data=[{id:1,
        name:'EasyJWeb',
        organization:'EasyJF',
        homepage:''},
        {id:2,
        name:'jfox',
        organization:'huihoo',
        homepage:''},
        {id:3,
        name:'jdon',
        organization:'jdon',
        homepage:''},
        {id:4,
        name:'springside',
        organization: 'springside',
        homepage:''}
    ];

    也就是说数据变成了一维数组,数组中的每一个元素是一个对象,这些对象包含name、organization、homepage、id等属性。要让表格显示上面的数据,其实非常简单,只需要把store改成用Ext.data.JsonStore即可,代码如下:

     var store=new Ext.data.JsonStore({data:data,fields:["id","name","organization","homepage"]});
    var colM=new Ext.grid.ColumnModel([{header:"项目名称",dataIndex:"name",sortable:true},
                        {header:"开发团队",dataIndex:"organization",sortable:true},
                        {header:"网址",dataIndex:"homepage",renderer:showUrl}]);
    var grid = new Ext.grid.GridPanel({
        renderTo:"hello",
        title:"中国Java开源产品及团队",
        height:200,
        width:600,
        cm:colM,
        store:store,
        autoExpandColumn:2
    });

    上面的代码得到的结果与前面的一样。

    3、当然,表格同样能显示xml格式的数据,假如上面的数据存放成dataXml.xml文件中,内容如下:

 

 
  1
  EasyJWeb
  EasyJF
  
 

 
  2
  jfox
  huihoo
  
 

 
  3
  jdon
  jdon
  
 

 
  4
  springside
  springside
  
 

 

    为了把这个xml数据用ExtJS的表格Grid进行显示,我们只需要把store部分的内容调整成如下的内容即可:

     var store=new Ext.data.Store({
    url:"dataXml.xml",
    reader:new Ext.data.XmlReader({
        record:"row"},
        ["id","name","organization","homepage"])
    });

    其它的部分不用改变,完整的代码如下:

 
function showUrl(value)
{
    return ""+value+"";
}
Ext.onReady(function(){
    var store=new Ext.data.Store({
    url:"dataXml.xml",
    reader:new Ext.data.XmlReader({
        record:"row"},
        ["id","name","organization","homepage"])
    });
    var colM=new Ext.grid.ColumnModel([{header:"项目名称",dataIndex:"name",sortable:true},
                                {header:"开发团队",dataIndex:"organization",sortable:true},
                                {header:"网址",dataIndex:"homepage",renderer:showUrl}]);
    var grid = new Ext.grid.GridPanel({
        renderTo:"hello",
        title:"中国Java开源产品及团队",
        height:200,
        width:600,
        cm:colM,
        store:store,
        autoExpandColumn:2
        });
        store.load();
});

    store.laod()是用来加载数据,执行上面的代码产生的表格与前面的完全一样。

 

最后要注意的是:解析XML是可以的,但是必须将项目部署在WEB服务器中,才能显示出解析出来的数据,如果只打的是静态页面,则只能看到页面表格框架,并不能得到数据。

这个不知道为什么必须部署在Web服务器中,不知道是不是必须,只是部署以后就正常读数据了。有高手知者,请留言说一下。TIA。


 

阅读(5670) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-09-19 12:58:34

已经找到原因了: 可以看这里:http://blog.chinaunix.net/u/22371/showart_2043667.html 因为Sote组件接受一个参数url,如果设置url,则ExtJS会创建一个与服务器交互的Ext.data.HttpProxy对象,该对象通过指定的Connection或Ext.Ajax.request来向服务端发送请求,从而可以读取到服务器端的数据。

chinaunix网友2009-09-18 10:34:36

解析XML的xml文件的路徑是不是放錯了或是你寫的url路徑不對啊。