《Ext详解与实践》节选:自定义单元格的显示格式

有时候,需要在Grid中显示一个链接,或根据数字的大小显示不同的颜色,又或者使用固定格式显示记录编号等,这就需要自定义单元格的显示格式。在Ext的Grid可以很容易的实现自定义单元格的显示格式。在定义Grid的ColumnModel的时候,在需要自定义显示格式的列中加入参数renderer,该参数指向一个函数,在显示时会以函数返回的数据作为显示数据,例如最简单的就是定义日期的显示格式:

 
 
  1. {header: "创建时间", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('Y-m-d'), dataIndex: 'createtime'

参数renderer指向的是一个函数,在函数中传入该单元格的值,函数执行后返回要显示的数据。

下面通过例子来演示一下常用的自定义格式:
 
 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
  2.  
  3. <html debug='true'> 
  4.  
  5. <head> 
  6.  
  7.   <title>自定义单元格的显示格式</title> 
  8.  
  9.          <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
  10.  
  11.          <link rel="stylesheet" type="text/css" href="../lib/ext/resources/css/ext-all.css" /> 
  12.  
  13.         <script type="text/javascript" src="../lib/ext/ext-base.js"></script> 
  14.  
  15.   <script type="text/javascript" src="../lib/ext/ext-all.js"></script> 
  16.  
  17.   <script type="text/javascript" src="../lib/ext/locale/ext-lang-zh_CN.js"></script> 
  18.  
  19.   <style> 
  20.  
  21.         </style> 
  22.  
  23. </head> 
  24.  
  25. <body> 
  26.  
  27.          <h1 style="margin:20px 0px 0px 20px;">第4章 自定义单元格的显示格式</h1> 
  28.  
  29.          <br /> 
  30.  
  31.          <div style="padding-left:20px;"> 
  32.  
  33. <p> 
  34.  
  35.     <div id="panel1"></div><br> 
  36.  
  37.     <div >事件:</div> 
  38.  
  39.     <textarea id='op' rows="10" style="width:800px;"></textarea> 
  40.  
  41. </p> 
  42.  
  43. <br /> 
  44.  
  45. </div> 
  46.  
  47. <script> 
  48.  
  49.          var app={};  
  50.  
  51.            
  52.  
  53.          Ext.onReady(function(){  
  54.  
  55.    
  56.  
  57.     Ext.state.Manager.setProvider(new Ext.state.CookieProvider());  
  58.  
  59.    
  60.  
  61.     Ext.QuickTips.init();  
  62.  
  63.                    Ext.Msg.minWidth=300;  
  64.  
  65.    
  66.  
  67.     var myData = [  
  68.  
  69.         [1,{text:'Ext',url:'http://extjs.com'},-10.00,'2008-01-01 12:01:01','br.gif','Atlantic Spadefish.jpg',{text:'一',tips:'提示1'}],  
  70.  
  71.         [2,{text:'Google',url:'http://www.google.cn'},1.00,'2008-02-16 12:01:02','fr.gif','Bat Ray.jpg',{text:'二',tips:'提示2'}],  
  72.  
  73.         [3,{text:'新浪',url:'http://www.sina.com.cn'},0,'2008-03-15 12:01:03','cu.gif','Blue Angelfish.jpg',{text:'三',tips:'提示3'}],  
  74.  
  75.         [4,{text:'雅虎',url:'http://www.yahoo.com.cn'},10.01,'2008-04-14 12:01:04','es.gif','Bluehead Wrasse.jpg',{text:'四',tips:'提示4'}],  
  76.  
  77.         [5,{text:'CSDN',url:'http://www.csdn.net'},200.90,'2008-05-13 12:01:05','cn.gif','Cabezon.jpg',{text:'五',tips:'提示5'}],  
  78.  
  79.         [6,{text:'微软',url:'http://www.microsoft.com'},-200.01,'2008-06-12 12:01:06','us.gif','California Moray.jpg',{text:'六',tips:'提示6'}]  
  80.  
  81.     ];  
  82.  
  83.    
  84.  
  85.     var store = new Ext.data.SimpleStore({  
  86.  
  87.              fields: [  
  88.  
  89.        {name: 'id',type:'int'},  
  90.  
  91.        {name: 'linker'},  
  92.  
  93.        {name: 'number', type: 'float'},  
  94.  
  95.        {name: 'datetime', type: 'date', dateFormat: 'Y-m-d H:i:s'},  
  96.  
  97.        {name: 'icon'},  
  98.  
  99.        {name: 'qtips'},  
  100.  
  101.        {name: 'tips'}  
  102.  
  103.              ]  
  104.  
  105.     });  
  106.  
  107.     store.loadData(myData);  
  108.  
  109.    
  110.  
  111.    
  112.  
  113.                    function leftPad(val){  
  114.  
  115.                             return String.leftPad(val,5,"0");  
  116.  
  117.                    }  
  118.  
  119.                      
  120.  
  121.                    function linker(val){  
  122.  
  123.                             if(typeof val=='object'){  
  124.  
  125.                                      return '<a style="display:table;width:100%;" title="'+val.url+'" target="_blank" href="'+val.url+'">'+val.text+'</a>'  
  126.  
  127.                             }  
  128.  
  129.                             return val;  
  130.  
  131.                    }  
  132.  
  133.    
  134.  
  135.     function num(val){  
  136.  
  137.         if(val > 0){  
  138.  
  139.             return '<span style="color:green;">' + val + '</span>';  
  140.  
  141.         }else if(val < 0){  
  142.  
  143.             return '<span style="color:red;">' + val + '</span>';  
  144.  
  145.         }  
  146.  
  147.         return val;  
  148.  
  149.     }  
  150.  
  151.       
  152.  
  153.     function icon(val){  
  154.  
  155.     return '<img src="./images/gif/'+val+'">'  
  156.  
  157.     }  
  158.  
  159.       
  160.  
  161.     function qtips(val){  
  162.  
  163.     return '<span style="display:table;width:100%;" qtip=/'<img src="images/'+val+'">/'>'+val+'</span>'  
  164.  
  165.     }  
  166.  
  167.       
  168.  
  169.     function tips(val){  
  170.  
  171.     if(typeof val=='object'){  
  172.  
  173.                return '<span style="display:table;width:100%;" title="'+val.tips+'">'+val.text+'</span>'  
  174.  
  175.     }  
  176.  
  177.     return val  
  178.  
  179.     }  
  180.  
  181.    
  182.  
  183.     var grid = new Ext.grid.GridPanel({  
  184.  
  185.       height:350,  
  186.  
  187.       width:800,  
  188.  
  189.       store: store,  
  190.  
  191.       title:'自定义单元格的显示格式',  
  192.  
  193.       frame:true,  
  194.  
  195.       columns: [  
  196.  
  197.              {header:'编号',width:80, sortable: true,renderer:leftPad, dataIndex:'id'},  
  198.  
  199.         {header: "链接", width:75, sortable: true, renderer: linker, dataIndex: 'linker'},  
  200.  
  201.         {header: "数字", width:75, sortable: true,renderer: num, dataIndex: 'number'},  
  202.  
  203.         {header: "时间", width:85, sortable: true, renderer: Ext.util.Format.dateRenderer('Y-m-d'), dataIndex: 'datetime'},  
  204.  
  205.         {header: "图标", width:75, sortable: true,renderer: icon, dataIndex: 'icon'},  
  206.  
  207.         {header: "图片提示", width:75, sortable: true,renderer: qtips, dataIndex: 'qtips'},  
  208.  
  209.         {header: "文字提示", width:75, sortable: true,renderer: tips, dataIndex: 'tips'}  
  210.  
  211.       ],  
  212.  
  213.       stripeRows: true,  
  214.  
  215.       autoExpandColumn: 5,  
  216.  
  217.       listeners:{  
  218.  
  219.              rowclick:function(trid,rowIndex,e){  
  220.  
  221.                       Ext.get('op').dom.value+='------------------------/n'+  
  222.  
  223.                                Ext.encode(store.getAt(rowIndex).data)+'/n';  
  224.  
  225.              }  
  226.  
  227.     }  
  228.  
  229.         
  230.  
  231.     });  
  232.  
  233.    
  234.  
  235.     grid.render('panel1');  
  236.  
  237.    
  238.  
  239.    
  240.  
  241.                    Ext.get('op').dom.value="";  
  242.  
  243.          })  
  244.  
  245. </script> 
  246.  
  247. </body> 
  248.  
  249. </html> 

例子的运行结果如下图

例子中,第1列演示了以固定长度为5位,不足5位以0补齐的格式的数字:

 
 
  1. function leftPad(val){  
  2.          return String.leftPad(val,5,"0");  
  3.                   } 

该函数使用Ext字符串leftPad方法补0,然后将转换后的值返回。

第2列演示了如何在单元格中显示链接:
 
 
  1. function linker(val){  
  2.                            if(typeof val=='object'){  
  3.                                     return '<a style="display:table;width:100%;" title="'+val.url+'" target="_blank" href="'+val.url+'">'+val.text+'</a>'  
  4.                            }  
  5.                            return val;  
  6.                   } 

第2列的数据使用了JSON格式的数据,如“{text:'Ext',url:'http://extjs.com'}”,标签text内的值是单元格显示的数据,而标签url的值是链接地址。在函数中先判断原始值是否为对象,如果是则使用text和url组合一个HTML标记并返回。在HTML标记中定义了两个样式,其目的是让HTML标记显示时能填满单元格,这样当鼠标移动到该单元格空白处时,也能显示提示信息。提示信息由HTML标记的title属性实现。

第3列则演示了根据数值的大小使用不同颜色作为显示文字的颜色,该单元格中负数显示为红色,0为黑色,正数为绿色:
 
 
  1. function num(val){  
  2.  
  3.         if(val > 0){  
  4.  
  5.             return '<span style="color:green;">' + val + '</span>';  
  6.  
  7.         }else if(val < 0){  
  8.  
  9.             return '<span style="color:red;">' + val + '</span>';  
  10.  
  11.         }  
  12.  
  13.         return val;  
  14.  
  15.     }  

函数中控制颜色的显示是通过HTML标记SPAN的样式实现的。

第4列很简单,使用了Ext的日期格式函数控制日期的显示格式。在这里要特别注意的是日期的值格式与store字段中定义的格式一定要相同,不然Grid会显示为空白值。例如例子中的日期值为“2008-01-01 12:01:01 ”,则定义日期的格式必须为“Y-m-d H:i:s”。
第5列演示了如何在单元格中显示小图片:
 
 
  1. function icon(val){  
  2.  
  3.     return '<img src="./images/gif/'+val+'">'  
  4.  
  5.     }  

函数将包含图片文件名的原始值转换为HTML标记IMG,就可实现在单元格内显示图片了。

第6列演示了通过Ext的QuickTip显示图片提示:
 
 
  1. function qtips(val){  
  2.  
  3.     return '<span style="display:table;width:100%;" qtip=/'<img src="images/'+val+'">/'>'+val+'</span>'  
  4.  
  5.     }  

要在HTML标记中使用QuickTip显示提示,只要在标记中加入一个属性qtip就行了。在函数中可以看到将一个IMG标记作为了qtip的显示内容。不过,别忘了在OnReady函数中对QuickTip进行初始化。标记SPAN也定义了两个样式,其作用与第2列的一样。该列的提示显示结果请看如下图。

第7列使用了HTML标记的title属性来显示提示,与第2列的方法是一样的,只是该列使用了SPAN标记。

本节只是简单的演示了几种自定义显示格式的单元格,只要灵活使用HTML标记,还可以实现更多的自定义格式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值