?http://fogiguiuu.iteye.com/blog/591106
?
重写了DataGrid,主要是为了得到DataGrid的listItems属性,listItems保存了当前现显示的每一行的信息,还用了个ArrayCollection保存被选中了行的信息。
MyDataGrid.as
- package?flex.components.checkdatagrid ??
- { ??
-
????import?mx.collections.ArrayCollection; ??
-
????import?mx.controls.Alert; ??
-
????import?mx.controls.DataGrid; ??
- ???? ??
-
????public?class?MyDataGrid?extends?DataGrid ??
- ????{ ??
-
????????protected?var?arrColl:ArrayCollection?=?null;????
- ???????? ??
-
????????public?function?MyDataGrid() ??
- ????????{ ??
-
????????????super(); ??
-
????????????arrColl?=?new?ArrayCollection(); ??
- ????????} ??
- ???????? ??
-
??????????????????
-
????????public?function?get?listRendererArray():Array{?? ??
-
????????????return?listItems; ??
- ????????} ??
- ???????? ??
-
??????????
-
????????public?function?addToSelected(item:Object):void{ ??
- ???????????? ??
-
????????????if(arrColl.getItemIndex(item)<0) ??
- ????????????{ ??
- ????????????????arrColl.addItem(item); ??
- ????????????} ??
- ????????} ??
- ???????? ??
-
??????????
-
????????public?function?delFromSelected(item:Object):void{ ??
- ???????????? ??
-
????????????if(arrColl.getItemIndex(item)>-1) ??
- ????????????{ ??
- ????????????????arrColl.removeItemAt(arrColl.getItemIndex(item)); ??
- ????????????} ??
- ????????} ??
- ???????? ??
-
??????????
-
????????public?function?isInSelected(item:Object):Boolean{ ??
- ???????????? ??
-
????????????if(arrColl.getItemIndex(item)<0) ??
- ????????????{ ??
-
????????????????return?false; ??
- ????????????} ??
-
????????????else??
- ????????????{ ??
-
????????????????return?true; ??
- ????????????} ??
- ????????} ??
- ???????? ??
-
????????public?function?getSelected():ArrayCollection{ ??
-
????????????return?arrColl; ??
- ????????} ??
- ????} ??
- }??
package flex.components.checkdatagrid
{
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.controls.DataGrid;
public class MyDataGrid extends DataGrid
{
protected var arrColl:ArrayCollection = null; ?//保存被选中的信息
public function MyDataGrid()
{
super();
arrColl = new ArrayCollection();
}
//方法名不该取这个的
public function get listRendererArray():Array{
return listItems;
}
//add
public function addToSelected(item:Object):void{
if(arrColl.getItemIndex(item)<0)
{
arrColl.addItem(item);
}
}
//del
public function delFromSelected(item:Object):void{
if(arrColl.getItemIndex(item)>-1)
{
arrColl.removeItemAt(arrColl.getItemIndex(item));
}
}
//isIn
public function isInSelected(item:Object):Boolean{
if(arrColl.getItemIndex(item)<0)
{
return false;
}
else
{
return true;
}
}
public function getSelected():ArrayCollection{
return arrColl;
}
}
}
?
CheckHeadBoxIR.as? 实现全选用的checkbox
- package?flex.components.checkdatagrid ??
- { ??
-
????import?flash.display.DisplayObject; ??
-
????import?flash.events.Event; ??
-
????import?flash.text.TextField; ??
- ???? ??
-
????import?mx.controls.CheckBox; ??
-
????import?mx.controls.DataGrid; ??
-
????import?mx.events.DataGridEvent; ??
- ??
-
????public?class?CheckHeadBoxIR?extends?CheckBox ??
- ????{ ??
-
????????public?function?CheckHeadBoxIR(){ ??
-
????????????super(); ??
-
????????????this.addEventListener(Event.CHANGE,?cgHandler); ??
- ????????} ??
- ???????? ??
-
????????override?public?function?set?data(value:Object)?:?void{ ??
-
??????????????
-
????????????this.selected?=?false; ??
- ????????????DataGrid(listData.owner).addEventListener(DataGridEvent.HEADER_RELEASE,?sortEventHandler); ??
- ????????} ??
- ???????? ??
-
????????private?function?sortEventHandler(event:DataGridEvent):void{ ??
- ???????????? ??
-
????????????if(event.itemRenderer?==?this) ??
- ????????????{ ??
- ????????????????event.preventDefault(); ??
- ????????????} ??
- ????????} ??
- ???????? ??
-
??????????
-
????????override?protected?function?updateDisplayList(w:Number,?h:Number)?:?void{ ??
-
????????????super.updateDisplayList(w,?h); ??
- ???????????? ??
-
????????????for(var?i:Number=0;?i<numChildren;?i++) ??
- ????????????{ ??
- ????????????????var?c:DisplayObject?=?getChildAt(i); ??
-
????????????????if(!(c?is?TextField)) ??
- ????????????????{ ??
-
????????????????????c.x?=?Math.round((w-c.width)/2); ??
-
????????????????????c.y?=?Math.round((h-c.height)/2); ??
- ????????????????} ??
- ????????????} ??
- ????????} ??
- ???????? ??
-
????????protected?function?cgHandler(event:Event):void{ ??
- ???????????? ??
-
???????????? ??
- ????????????var?listItems:Array?=??MyDataGrid(listData.owner).listRendererArray; ??
- ???????????? ??
-
????????????if(listItems.length>0) ??
- ????????????{ ??
-
????????????????for(var?i:Number=0;?i<listItems.length;?i++) ??
- ????????????????{ ??
-
????????????????????if(listItems[i].length>0) ??
- ????????????????????{ ??
-
????????????????????????if(listItems[i][0].selected?!=?this.selected) ??
- ????????????????????????{ ??
-
????????????????????????????listItems[i][0].selected?=?this.selected; ??
-
????????????????????????????listItems[i][0].dispatchEvent(new?Event(Event.CHANGE)); ??
- ????????????????????????} ??
- ????????????????????} ??
- ????????????????} ??
- ????????????} ??
-
??????????????
- ????????} ??
- ????} ??
- }??
package flex.components.checkdatagrid
{
import flash.display.DisplayObject;
import flash.events.Event;
import flash.text.TextField;
import mx.controls.CheckBox;
import mx.controls.DataGrid;
import mx.events.DataGridEvent;
public class CheckHeadBoxIR extends CheckBox
{
public function CheckHeadBoxIR(){
super();
this.addEventListener(Event.CHANGE,cgHandler);
}
override public function set data(value:Object) : void{
//super.data = value; ? ?//一定不要有这句
this.selected = false;
DataGrid(listData.owner).addEventListener(DataGridEvent.HEADER_RELEASE,sortEventHandler);
}
private function sortEventHandler(event:DataGridEvent):void{
if(event.itemRenderer == this)
{
event.preventDefault();
}
}
//居中显示
override protected function updateDisplayList(w:Number,h:Number) : void{
super.updateDisplayList(w,h);
for(var i:Number=0; i<numChildren; i++)
{
var c:DisplayObject = getChildAt(i);
if(!(c is TextField))
{
c.x = Math.round((w-c.width)/2);
c.y = Math.round((h-c.height)/2);
}
}
}
protected function cgHandler(event:Event):void{
//得到DataGrid里的listItems
var listItems:Array = MyDataGrid(listData.owner).listRendererArray;
if(listItems.length>0)
{
for(var i:Number=0; i<listItems.length; i++)
{
if(listItems[i].length>0)
{
if(listItems[i][0].selected != this.selected)
{
listItems[i][0].selected = this.selected;
listItems[i][0].dispatchEvent(new Event(Event.CHANGE));
}
}
}
}
/*var ii:Object = dataGrid.indexToItemRenderer(2).data;*/
}
}
}
?
CheckBoxIR.as
- package?flex.components.checkdatagrid ??
- { ??
- ???? ??
-
????import?flash.display.DisplayObject; ??
-
????import?flash.events.Event; ??
-
????import?flash.text.TextField; ??
- ???? ??
-
????import?mx.collections.ArrayCollection; ??
-
????import?mx.controls.Alert; ??
-
????import?mx.controls.CheckBox; ??
- ???? ??
-
????public?class?CheckBoxIR?extends?CheckBox{ ??
- ???????? ??
-
????????public?function?CheckBoxIR(){ ??
-
????????????super(); ??
-
????????????this.addEventListener(Event.CHANGE,?cgHandler); ??
- ????????} ??
- ???????? ??
-
????????override?public?function?set?data(value:Object)?:?void{ ??
-
????????????super.data?=?value; ??
- ??
- ???????????? ??
-
????????????if(MyDataGrid(listData.owner).isInSelected(data.id)) ??
- ????????????{ ??
-
????????????????this.selected?=?true; ??
- ????????????} ??
-
????????????else??
- ????????????{ ??
-
????????????????this.selected?=?false; ??
- ????????????} ??
- ???????????? ??
-
??????????
- ????????} ??
- ???????? ??
- ???????? ??
-
??????????
-
????????override?protected?function?updateDisplayList(w:Number,?h); ??
- ???????????? ??
-
????????????for(var?i:Number=0;?i<numChildren;?i++) ??
- ????????????{ ??
- ????????????????var?c:DisplayObject?=?getChildAt(i); ??
-
????????????????if(!(c?is?TextField)) ??
- ????????????????{ ??
-
????????????????????c.x?=?Math.round((w-c.width)/2); ??
-
????????????????????c.y?=?Math.round((h-c.height)/2); ??
- ????????????????} ??
- ????????????} ??
- ????????} ??
- ???????? ??
-
????????protected?function?cgHandler(event:Event):void{ ??
- ???? ??
- ????????????var?dg:MyDataGrid?=?MyDataGrid(listData.owner); ??
- ???????????? ??
-
????????????if(this.selected?==?true) ??
- ????????????{ ??
- ????????????????dg.addToSelected(data.id); ??
- ????????????} ??
-
????????????else??
- ????????????{ ??
- ????????????????dg.delFromSelected(data.id); ??
- ????????????} ??
- ????????} ??
- ??
- ????} ??
- }??
package flex.components.checkdatagrid
{
import flash.display.DisplayObject;
import flash.events.Event;
import flash.text.TextField;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.controls.CheckBox;
public class CheckBoxIR extends CheckBox{
public function CheckBoxIR(){
super();
this.addEventListener(Event.CHANGE,cgHandler);
}
override public function set data(value:Object) : void{
super.data = value;
if(MyDataGrid(listData.owner).isInSelected(data.id))
{
this.selected = true;
}
else
{
this.selected = false;
}
// Alert.show("int set data--"+data.@id);
}
//居中显示
override protected function updateDisplayList(w:Number,h);
for(var i:Number=0; i<numChildren; i++)
{
var c:DisplayObject = getChildAt(i);
if(!(c is TextField))
{
c.x = Math.round((w-c.width)/2);
c.y = Math.round((h-c.height)/2);
}
}
}
protected function cgHandler(event:Event):void{
var dg:MyDataGrid = MyDataGrid(listData.owner);
if(this.selected == true)
{
dg.addToSelected(data.id);
}
else
{
dg.delFromSelected(data.id);
}
}
}
}
?
应用
- <checkdatagrid:MyDataGrid?width="100%"?borderStyle="outset"?height="366"? ??
-
???????????????????????????????????id="orderInfo"?dataProvider="{data}"?> ??
- ????????????<checkdatagrid:columns> ??
-
????????????????<mx:DataGridColumn?headerRenderer=flex.components.checkdatagrid.CheckHeadBoxIR"?itemRenderer="flex.components.checkdatagrid.CheckBoxIR"?width="30"/> ??
- ????????????</checkdatagrid:columns> ??
- ????????</checkdatagrid:MyDataGrid>??
<checkdatagrid:MyDataGrid width="100%" borderStyle="outset" height="366"
id="orderInfo" dataProvider="{data}" >
<checkdatagrid:columns>
<mx:DataGridColumn headerRenderer=flex.components.checkdatagrid.CheckHeadBoxIR" itemRenderer="flex.components.checkdatagrid.CheckBoxIR" width="30"/>
</checkdatagrid:columns>
</checkdatagrid:MyDataGrid>
?