最近做一个列表,需要用到全选列。于是先google一把,呵呵!这种基础的扩展网上还不少,不过很多都是你转我的,我转他的。而且有的功能还不健全。
比如有一类的扩展是通过覆盖validateProperties方法在实现的,这类的问题就是这些在点击全选的时候,列字段全选择了,但是在鼠标划过这些行的时候行上的选择框又自动的返回未选择的样子。
还有一些是内联的写在标签里的,这种方式不易扩展。还有一点最重要,网上的几乎所有的扩展都不支持当行全选后头部的全选框自动勾选的功能。
呵呵,最后只有自己再写一个。

我这边的要求很简单:
1、实现选择框列表,点击头部全选能全选
2、点击行选择框选中行,如果行全部选择,则头部选择框选择
3、能指定列的字段
4、在选择或则选中行时同时改变DataGrid的dataProvider中响应的数据值

其实这个只是扩展了一下下ItemRenderer,headerRenderer ,然后继承DataGridColumn写一个自己的GridColumn。
扩展的类有三个,分别是:
1、CheckBoxColumn:这个类继承了DataGridColumn
2、CheckBoxHeader:继承了CheckBox
3、CheckBoxRenderer:继承了CheckBox
如图:


代码如下:
CheckBoxColumn类
 

 
  1. package org.extendx.grid   
  2. {   
  3.     import mx.controls.dataGridClasses.DataGridColumn;   
  4.   
  5.     public class CheckBoxColumn extends DataGridColumn   
  6.     {   
  7.         public var header:CheckBoxHeader=null;   
  8.         public var columnRenderers:Array=[];   
  9.            
  10.         public var checkField:String="selected";//默认选择框的字段   
  11.            
  12.         public function CheckBoxColumn(columnName:String=null)   
  13.         {   
  14.             super(columnName);   
  15.                
  16.         }   
  17.         public function setColumnRenderers(o:CheckBoxRenderer){   
  18.             this.columnRenderers.push(o);   
  19.         }   
  20.            
  21.     }   
  22. }  

CheckBoxHeader类
 

  1. package org.extendx.grid   
  2. {   
  3.     import flash.events.MouseEvent;   
  4.        
  5.     import mx.collections.ArrayCollection;   
  6.     import mx.controls.Alert;   
  7.     import mx.controls.CheckBox;   
  8.     import mx.controls.DataGrid;   
  9.     import mx.controls.dataGridClasses.DataGridColumn;   
  10.     import mx.events.DynamicEvent;   
  11.        
  12.     public class CheckBoxHeader extends CheckBox   
  13.     {   
  14.         private var _data:DataGridColumn;   
  15.         private var isRegisted:Boolean=false;   
  16.         public var checkField:String="selected";//默认选择框的字段   
  17.            
  18.         public function CheckBoxHeader()   
  19.         {   
  20.             super();   
  21.             this.setStyle("paddingLeft",5);   
  22.             this.addEventListener(MouseEvent.CLICK,this.onHeaderClick);   
  23.   
  24.                
  25.         }   
  26.         override public function set data(value:Object):void {   
  27.             _data=value as DataGridColumn;   
  28.             this.label=value.headerText   
  29.             if(!this.isRegisted){   
  30.                 var cc:CheckBoxColumn=this.data as CheckBoxColumn;   
  31.                 cc.header=this;   
  32.                 this.checkField=cc.checkField;   
  33.                 this.isRegisted=true;   
  34.             }   
  35.         }          
  36.         override public function get data():Object   
  37.         {   
  38.             return _data;   
  39.         }   
  40.         override public function  set selected(value:Boolean):void{   
  41.             super.selected=value;      
  42.             if(listData){   
  43.                 var dg:DataGrid = DataGrid(listData.owner);   
  44.                 var de:DynamicEvent=new DynamicEvent("selectedAllChange");   
  45.                 de.selected=this.selected   
  46.                 dg.dispatchEvent(de);   
  47.             }   
  48.         }          
  49.         private function onHeaderClick(e:MouseEvent){   
  50.             var dg:DataGrid = DataGrid(listData.owner);   
  51.             var s:ArrayCollection=ArrayCollection(dg.dataProvider);   
  52.             var array=[];   
  53.             for(var i=0;i<s.length;i++){   
  54.                 s[i][this.checkField]=this.selected;                   
  55.             }              
  56.             dg.invalidateList();               
  57.         }   
  58.     }   
  59. }  

CheckBoxRenderer 类
 

  1. package org.extendx.grid   
  2. {   
  3.     import flash.events.MouseEvent;   
  4.        
  5.     import mx.collections.ArrayCollection;   
  6.     import mx.controls.Alert;   
  7.     import mx.controls.CheckBox;   
  8.     import mx.controls.DataGrid;   
  9.     import mx.controls.Label;   
  10.     import mx.controls.TextInput;   
  11.        
  12.     public class CheckBoxRenderer extends CheckBox   
  13.     {   
  14.         private var isRegisted:Boolean=false;   
  15.         public var checkField:String="selected";//默认选择框的字段   
  16.            
  17.         private var ml:Label=null  
  18.         public function CheckBoxRenderer()   
  19.         {   
  20.             super();   
  21.             this.setStyle("paddingLeft",5);   
  22.             this.setStyle("fontStyle","italic");//fontStyle: normal | italic | oblique;]   
  23.             this.setStyle("fontSize",13);//fontStyle: normal | italic | oblique;]   
  24.             this.addEventListener(MouseEvent.CLICK,this.onReClick);   
  25.   
  26.         }   
  27.         override public function set data(value:Object):void {   
  28.             super.data=value;   
  29.             this.label=value.displayName;//这个地方写死了显示字段,需要改的朋友可以改改试试   
  30.             if(!isRegisted){   
  31.                 isRegisted=true  
  32.                 var dg:DataGrid = DataGrid(listData.owner)   
  33.                 var cc:CheckBoxColumn=dg.columns[listData.columnIndex];   
  34.                 this.checkField=cc.checkField;   
  35.             }   
  36.             this.selected=value[this.checkField];   
  37.         }   
  38.         override public function  set selected(value:Boolean):void{   
  39.             super.selected=value;                  
  40.         }   
  41.   
  42.         private function onReClick(e){             
  43.             this.data[this.checkField]=this.selected;   
  44.             var dg:DataGrid = DataGrid(listData.owner)   
  45.             var cc:CheckBoxColumn=dg.columns[listData.columnIndex];   
  46.             cc.header.selected=isAll();   
  47.         }   
  48.         private function isAll(){   
  49.             var dg:DataGrid = DataGrid(listData.owner)   
  50.             var s:ArrayCollection=ArrayCollection(dg.dataProvider);   
  51.                
  52.             for(var i=0;i<s.length;i++){   
  53.                 if(!s[i][this.checkField]){   
  54.                     return false  
  55.                 }                  
  56.             }          
  57.             return true  
  58.         }   
  59.     }   
  60. }  

调用代码:

  1.             this.dg=new DataGrid();   
  2.            
  3.             var dgcc:CheckBoxColumn=new CheckBoxColumn();   
  4.             dgcc.headerText="";   
  5.             dgcc.width=25;   
  6.             dgcc.dataField="displayName"  
  7.             dgcc.checkField="selected"//设置选择框对应字段   
  8.             dgcc.itemRenderer=new ClassFactory(CheckBoxRenderer);//此处还可以放到CheckBoxColumn内部   
  9.             dgcc.headerRenderer=new ClassFactory(CheckBoxHeader);//此处还可以放到CheckBoxColumn内部   
  10.   
  11.         var dgcc2:DataGridColumn=new DataGridColumn();   
  12.             dgcc2.headerText="";   
  13.             //dgcc2.width=40;   
  14.             dgcc2.dataField="displayName";   
  15.   
  16. this.dg.columns=[dgcc,dgcc2]  

效果图: