打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ext之grid全攻略

Grid的分页必须依靠服务端(Server Side)来划分好每一页的数据才可以完成。

Grid组件:  

Ext.data.Store   为Grid提供数据源,可以来自Record对象也可以是一个通过Ext.data.XmlReader读取的XML流,这些数据可能由HttpProxy、DataProxy、MemoryProxy或ScriptTagProxy提供

Ext.grid.GridPanelExt.grid.EditorGridPanel为网格布局、组装提供的容器对象,这个对象是一个网格的核心

Ext.grid.ColumnModel定义网格的列属性,俗语表头,表体会由Ext.data.Store提供,完成填充。如果你打算为每行提供一个行号,在创建Model时,加入newExt.grid.RowNumberer()配置即可


如果你计划为可编辑的表格提供新增行操作,建议定义出一个Ext.data.Record的Plant,并在创建Store时与之绑定,这样你就可以使用Store的insert方法,动态创建一个Plant了(一行新记录)。

可以说Ext的Grid已经对各种场景的操作进行了足够封装,基本能够满足复杂场合下的表格应用

    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文件:
<divid='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([
    newExt.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
    varfieldName = grid.getColumnModel().getDataIndex(columnIndex); //Getfield 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([
    newExt.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 "<spanstyle='color:red;font-weight:bold;'>红男</span>";
    } else{
       return "<spanstyle='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 = newExt.data.Store({
    url:'test.xml',   //XML数据
    reader: newExt.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"))

    dimjson
   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 = newExt.grid.CheckboxSelectionModel();
   
    var cm = newExt.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: newExt.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文章。在此表示致敬!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ext表格控件
Ext 鼠标悬停grid的一行显示该行信息
Ext学习之Grid JSON分页
Extjs 下拉grid
extjs grid renderer用法
grid
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服