`

《Ext实战》节选:自定义单元格的显示格式

阅读更多

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

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

 


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

下面通过例子来演示一下常用的自定义格式:

Java代码 复制代码
  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>   
  250.     
  251.   
  252.    



例子的运行结果如下图。
例子中,第1列演示了以固定长度为5位,不足5位以0补齐的格式的数字:

                   function leftPad(val){

                            return String.leftPad(val,5,"0");

                   }




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

第2列演示了如何在单元格中显示链接:

                   function linker(val){

                            if(typeof val=='object'){

                                     return '<a style="display:table;width:100%;" title="'+val.url+'" target="_blank" href="'+val.url+'">'+val.text+'</a>'

                            }

                            return val;

                   }




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

第3列则演示了根据数值的大小使用不同颜色作为显示文字的颜色,该单元格中负数显示为红色,0为黑色,正数为绿色:

    function num(val){

        if(val > 0){

            return '<span style="color:green;">' + val + '</span>';

        }else if(val < 0){

            return '<span style="color:red;">' + val + '</span>';

        }

        return val;

    }




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

第4列很简单,使用了Ext的日期格式函数控制日期的显示格式。在这里要特别注意的是日期的值格式与store字段中定义的格式一定要相同,不然Grid会显示为空白值。例如例子中的日期值为“2008-01-01 12:01:01”,则定义日期的格式必须为“Y-m-d H:i:s”。

第5列演示了如何在单元格中显示小图片:

    function icon(val){

    return '<img src="./images/gif/'+val+'">'

    }




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

第6列演示了通过Ext的QuickTip显示图片提示:

    function qtips(val){

    return '<span style="display:table;width:100%;" qtip=\'<img src="images/'+val+'">\'>'+val+'</span>'

    }




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





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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics