天天看點

flex的datagrid中動态綁定按鈕

顯示DataGrid的界面xml

-------------------------------------------

[Bindable]

var array:ArrayCollection=new ArrayCollection({paperId:"12321321",paperName:"測試試卷",source:"三年一班自測卷",userScore:"80","2011-11-11 13:25"});

<paging:CheckBoxDataGrid width="880" height="300" id="finishedExam" dataProvider="{array}" horizontalScrollPolicy="off"

                                             allowMultipleSelection="false" verticalScrollPolicy="off">

                        <paging:columns>

                            <mx:DataGridColumn dataField="id" headerText="請勾選" width="20"

                                               sortable="false" itemRenderer="fx.util.CheckBoxRenderer" headerRenderer="fx.util.CheckBoxHeaderRenderer" >

                            </mx:DataGridColumn>

                            <mx:DataGridColumn headerText="試卷名稱" dataField="paperName" width="220"/>

                            <mx:DataGridColumn headerText="來源" dataField="source" width="180"/>

                            <mx:DataGridColumn headerText="得分" dataField="userScore" width="50"/>

                            <mx:DataGridColumn headerText="做卷時間" dataField="finalTime" width="150"/>

                            <mx:DataGridColumn headerText="操作" dataField="id" itemRenderer="fx.view.ExamOperationView">

                            </mx:DataGridColumn>

                        </paging:columns>

</paging:CheckBoxDataGrid>

說明:CheckBoxDataGrid源自網絡找到的資料,而<paging: 則由自己在容器中定義 xmlns:paging="fx.util.*",參看xmlns:fx="http://ns.adobe.com/mxml/2009"

xmlns:s="library://ns.adobe.com/flex/spark"

xmlns:mx="library://ns.adobe.com/flex/mx"

---------------------------------------------------

綁定按鈕的界面fx.view.ExamOperationView.mxml

----------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>

<mx:HBox xmlns:fx="http://ns.adobe.com/mxml/2009"

         xmlns:s="library://ns.adobe.com/flex/spark"

         xmlns:mx="library://ns.adobe.com/flex/mx"

         creationComplete="init()"

         width="228" height="22">

    <fx:Declarations>

        <!-- 将非可視元素(例如服務、值對象)放在此處 -->

    </fx:Declarations>

    <fx:Script>

        <![CDATA[

            import com.adobe.cairngorm.CairngormUtil;

            import mx.binding.utils.BindingUtils;

            import mx.controls.Alert;

            import mx.controls.Button;

            import mx.controls.Spacer;

            public function viewThisExam(event:MouseEvent):void{

                Alert.show("成績ID="+data.id+" 試卷ID="+data.paperId);

            }

            public function redoThisExam(event:MouseEvent):void{

                Alert.show("成績ID="+data.id+" 試卷ID="+data.paperId);

            }

            public function init():void{

                //1.建立對象

                var viewbtn:Button=new Button();

                var redobtn:Button=new Button();

                var delbtn:Button=new Button();

                var spacer:Spacer=new Spacer();

                //2.設定屬性

                viewbtn.id="view_"+data.id;

                viewbtn.label="檢視";

                redobtn.id="redo_"+data.id;

                redobtn.label="重做";

                delbtn.id="del_"+data.id;

                delbtn.label="删除";

                //3.綁定事件監聽

                viewbtn.addEventListener(MouseEvent.CLICK,viewThisExam);

                redobtn.addEventListener(MouseEvent.CLICK,redoThisExam);

                delbtn.addEventListener(MouseEvent.CLICK,function(event:MouseEvent):void{

                    var params:Object={resultid:data.id,button:delbtn};

                    CairngormUtil.event("DeleteCD",params);

                });

                //4.将對象添加到指定容器中,hbox為某mx:HBox的ID

                hbox.addChild(spacer);

                hbox.addChild(viewbtn);

                hbox.addChild(redobtn);

                hbox.addChild(delbtn);

            }

        ]]>

    </fx:Script>

    <mx:HBox id="hbox" width="100%" height="100%">

    </mx:HBox>

</mx:HBox>

------------------------------------------------

下面附上CheckBoxDataGrid.as、CheckBoxHeaderRenderer.as、CheckBoxRenderer.as、CheckBoxList.as四個檔案

這四個檔案源自網絡、具體位址已經遺忘

------------------------------------------------

CheckBoxDataGrid.as

---------------------------

package fx.util

{

import flash.display.Sprite;

import flash.events.KeyboardEvent;

import mx.controls.CheckBox;

import mx.controls.DataGrid;

import mx.controls.listClasses.IListItemRenderer;

public class CheckBoxDataGrid extends DataGrid

{

    override protected function selectItem(item:IListItemRenderer,

                                  shiftKey:Boolean, ctrlKey:Boolean,

                                  transition:Boolean = true):Boolean

    {

        // only run selection code if a checkbox was hit and always

        // pretend we're using ctrl selection

        if (item is CheckBox)

            return super.selectItem(item, false, true, transition);

        return false;

    }

    // turn off selection indicator

    override protected function drawSelectionIndicator(

                                indicator:Sprite, x:Number, y:Number,

                                width:Number, height:Number, color:uint,

                                itemRenderer:IListItemRenderer):void

    {

    }

    // whenever we draw the renderer, make sure we re-eval the checked state

    override protected function drawItem(item:IListItemRenderer,

                                selected:Boolean = false,

                                highlighted:Boolean = false,

                                caret:Boolean = false,

                                transition:Boolean = false):void

    {

        if (item is CheckBox)

            CheckBox(item).invalidateProperties();

        super.drawItem(item, selected, highlighted, caret, transition);

    }

    // fake all keyboard interaction as if it had the ctrl key down

    override protected function keyDownHandler(event:KeyboardEvent):void

    {

        // this is technically illegal, but works

        event.ctrlKey = true;

        event.shiftKey = false;

        super.keyDownHandler(event);

    }

}

}

-------------------------------------------------------

CheckBoxHeaderRenderer.as

--------------------------------------

package fx.util

{

import flash.display.DisplayObject;

import flash.events.Event;

import flash.events.KeyboardEvent;

import flash.events.MouseEvent;

import flash.text.TextField;

import mx.controls.CheckBox;

import mx.controls.dataGridClasses.DataGridListData;

import mx.controls.listClasses.ListBase;

public class CheckBoxHeaderRenderer extends CheckBox

{

    public function CheckBoxHeaderRenderer()

    {

        focusEnabled = false;

    }

    override public function set data(value:Object):void

    {

        invalidateProperties();

    }

    private var addedListener:Boolean = false;

    //用于辨別是否是部分選中

    private var partiallySelected:Boolean = false;

    override protected function commitProperties():void

    {

        super.commitProperties();

        if (owner is ListBase)

        {

            if (!addedListener)

            {

                addedListener = true;

                //設定事件監聽

                owner.addEventListener("valueCommit", owner_changeHandler, false, 0, true);

                owner.addEventListener("change", owner_changeHandler, false, 0, true);

            }

            if (ListBase(owner).dataProvider.length ==

                ListBase(owner).selectedItems.length)

            {//如果選中個數等于CheckBoxDataGrid資料的個數

                selected = true;//全部選中識為true

                partiallySelected = false;//部分選中辨別為false

            }

            else if (ListBase(owner).selectedItems.length == 0)

            {//如果選中個數為0

                selected = false;//全部選中識為false

                partiallySelected = false;//部分選中辨別為false

            }

            else

            {

                selected = false;//全部選中識為false

                partiallySelected = true;//部分選中辨別為true

            }

            invalidateDisplayList();

        }

    }

    override protected function keyDownHandler(event:KeyboardEvent):void

    {

    }

    override protected function keyUpHandler(event:KeyboardEvent):void

    {

    }

    override protected function clickHandler(event:MouseEvent):void

    {

        if (selected)

        {

            //選中後設定為不選中

            ListBase(owner).selectedIndex = -1;

        }

        else

        {   //設定其他每行的checkbox為選中

            var n:int = ListBase(owner).dataProvider.length;

            var arr:Array = [];

            for (var i:int = i; i < n; i++)

                arr.push(i);

            //設定選中的索引是全部行

            ListBase(owner).selectedIndices = arr;

        }

    }

    override protected function updateDisplayList(w:Number, h:Number):void

    {

        super.updateDisplayList(w, h);

        graphics.clear();

        if (listData is DataGridListData)

        {

            var n:int = numChildren;

            for (var i:int = 0; i < n; i++)

            {

                var c:DisplayObject = getChildAt(i);

                if (!(c is TextField))

                {

                    c.x = (w - c.width) / 2;

                    c.y = 0;

                    c.alpha = 1;

                    if (partiallySelected)

                    {

                        graphics.beginFill(0x000000);

                        graphics.drawRect(c.x, c.y, c.width, c.height);

                        graphics.endFill();

                        c.alpha = 0.7;

                    }

                }

            }

        }

    }

    private function owner_changeHandler(event:Event):void

    {

        invalidateProperties();

    }

}

}

----------------------------------------------------

CheckBoxRenderer.as

---------------------------------------

package fx.util

{

import flash.display.DisplayObject;

import flash.events.KeyboardEvent;

import flash.events.MouseEvent;

import flash.text.TextField;

import mx.controls.CheckBox;

import mx.controls.dataGridClasses.DataGridListData;

import mx.controls.listClasses.ListBase;

public class CheckBoxRenderer extends CheckBox

{

    public function CheckBoxRenderer()

    {

        focusEnabled = false;

    }

    override public function set data(value:Object):void

    {

        super.data = value;

        invalidateProperties();

    }

    override protected function commitProperties():void

    {

        super.commitProperties();

        //owner是指包含checkbox的CheckBoxDataGrid

        //判斷是否選中資料,如果owner是ListBase類型對象則借助ListBase的isItemSelected方法來判斷是否選中某行資料

        if (owner is ListBase)

            selected = ListBase(owner).isItemSelected(data);

    }

    override protected function keyDownHandler(event:KeyboardEvent):void

    {

    }

    override protected function keyUpHandler(event:KeyboardEvent):void

    {

    }

    override protected function clickHandler(event:MouseEvent):void

    {

    }

    override protected function updateDisplayList(w:Number, h:Number):void

    {

        super.updateDisplayList(w, h);

        if (listData is DataGridListData)

        {

            var n:int = numChildren;

            for (var i:int = 0; i < n; i++)

            {

                var c:DisplayObject = getChildAt(i);

                if (!(c is TextField))

                {

                    c.x = (w - c.width) / 2;

                    c.y = 0;

                }

            }

        }

    }

}

}

----------------------------------------------------------------

CheckBoxList.as

----------------------------------------

package fx.util

{

import flash.display.Sprite;

import flash.events.KeyboardEvent;

import mx.controls.List;

import mx.controls.listClasses.IListItemRenderer;

import mx.controls.CheckBox;

public class CheckBoxList extends List

{

    // fake all mouse interaction as if it had the ctrl key down

    override protected function selectItem(item:IListItemRenderer,

                                  shiftKey:Boolean, ctrlKey:Boolean,

                                  transition:Boolean = true):Boolean

    {

        return super.selectItem(item, false, true, transition);

    }

    // turn off selection indicator

    override protected function drawSelectionIndicator(

                                indicator:Sprite, x:Number, y:Number,

                                width:Number, height:Number, color:uint,

                                itemRenderer:IListItemRenderer):void

    {

    }

    // whenever we draw the renderer, make sure we re-eval the checked state

    override protected function drawItem(item:IListItemRenderer,

                                selected:Boolean = false,

                                highlighted:Boolean = false,

                                caret:Boolean = false,

                                transition:Boolean = false):void

    {

        CheckBox(item).invalidateProperties();

        super.drawItem(item, selected, highlighted, caret, transition);

    }

    // fake all keyboard interaction as if it had the ctrl key down

    override protected function keyDownHandler(event:KeyboardEvent):void

    {

        // this is technically illegal, but works

        event.ctrlKey = true;

        event.shiftKey = false;

        super.keyDownHandler(event);

    }

}

}

------------------------------------------------------------------------

PageBar.as

-------------------------

package fx.util

{

    import com.adobe.cairngorm.CairngormUtil;

    import mx.collections.ArrayCollection;

    import mx.controls.Button;

    import mx.controls.Label;

    import mx.controls.LinkBar;

    import mx.events.ItemClickEvent;

    //必須聲明成Bindable才能在其他mxml中Bindable

    [Bindable]

    public class PageBar

    {

        public var eventName:String="";

        public var totalRecordSize:int=0;

        public var pageSize:int=10;        

        public var currentPage:int=1;        

        public var totalPageSize:int=1;    

        public var firstPage:int=1;

        public var prePage:int=1;

        public var nextPage:int=1;

        public var lastPage:int=1;

        public var orgData:ArrayCollection=new ArrayCollection();

        public var pageNumShow:int=10;

        public var pageNumData:ArrayCollection=new ArrayCollection();

        public var params:Object={};

        public var curPageLabel:Label=new Label();

        public var totalPageLabel:Label=new Label();

        public var countRecordSizeLabel:Label=new Label();

        public var firstNavBtn:Button=new Button();

        public var preNavBtn:Button=new Button();

        public var pageNav:LinkBar=new LinkBar();

        public var nextNavBtn:Button=new Button();

        public var lastNavBtn:Button=new Button();

        public function PageBar()

        {

        }

        public function countTotalPageSize():void{

            //1.總記錄數小于每頁顯示記錄數時

            if(this.totalRecordSize<=this.pageSize && this.totalRecordSize>=0){

                this.totalPageSize=1

            }

            //2.總記錄數大于每頁顯示記錄數時   

            if(this.totalRecordSize>this.pageSize && this.pageSize>=0){

                //trace("this.totalRecordSize/this.pageSize="+this.totalRecordSize/this.pageSize);

                //2.1 總記錄數正好是每頁顯示記錄數的倍數時,總頁數=總記錄數/每頁顯示記錄數

                this.totalPageSize=this.totalRecordSize/this.pageSize;

                //trace("this.totalRecordSize%this.pageSize="+this.totalRecordSize%this.pageSize);

                //2.2 總記錄數不是每頁顯示記錄數的倍數時,總頁數=總記錄數/每頁顯示記錄數+1

                if(this.totalRecordSize%this.pageSize>0){

                    this.totalPageSize+=1;

                }

            }

        }

        public function setFirstPageAndLastPage():void{

            //1.總體分頁數第一頁和最後一頁

            this.firstPage=1;

            this.lastPage=this.totalPageSize;

            //2.還有一中設定是根據this.pageNumData來設定

            var size:int=this.pageNumData.length;

            //this.firstPage=this.pageNumData.getItemAt(0).label

            //this.lastPage=this.pageNumData.getItemAt(size-1).label

        }

        public function initPageBar(totalRecordSize:int,pageSize:int,currentPage:int,pageNumShow:int,eventName:String):void{

            this.pageSize=pageSize;

            this.totalRecordSize=totalRecordSize;

            this.pageNumShow=pageNumShow;

            this.eventName=eventName;

            countTotalPageSize();

            this.currentPage=currentPage;

            createNavBar(this.currentPage);

            setNavInfo();

        }

        public function createNavBar(currentPage:int):void{

            //得知總頁數、目前頁數、每頁顯示頁碼數後就可以設定上一頁和下一頁

            //上一頁

            this.prePage=this.currentPage-1>0?this.currentPage-1:1;

            //下一頁

            this.nextPage=this.currentPage+1<=this.totalPageSize?this.currentPage+1:this.totalPageSize;

            this.pageNumData.removeAll();

            if(this.totalPageSize<=this.pageNumShow){//1.總頁數小于設定的頁碼數pageNumShow時,顯示所有頁碼

                for(var i:int=0;i<this.totalPageSize;i++){

                    //確定小于總頁數,否則退出循環

                    this.pageNumData.addItem({label: 1+i ,data: 1+i});

                }

            }else{

                if(this.totalPageSize-this.currentPage+1<=this.pageNumShow){//2.剩餘頁碼數(this.totalPageSize-this.currentPage+1)小于設定頁碼數pageNumShow,補全頁碼

                    for(var i:int=this.totalPageSize-this.pageNumShow+1;i<=this.totalPageSize;i++){

                        //確定小于總頁數,否則退出循環

                        this.pageNumData.addItem({label: i ,data: i});

                    }

                }else{

                    for(var i:int=0;i<this.pageNumShow;i++){//3.目前頁碼+設定頁碼數小于totalPageSize時,正常滾動

                        //確定小于總頁數,否則退出循環

                        if(this.currentPage+i<=this.totalPageSize){

                            this.pageNumData.addItem({label: this.currentPage+i ,data: this.currentPage+i});

                        }

                    }

                }

            }

            setFirstPageAndLastPage();

        }

        public function setNavInfo():void{

            //設定界面上的分頁統計資料

            this.curPageLabel.text=this.currentPage.toString();

            this.totalPageLabel.text=this.totalPageSize.toString();

            this.countRecordSizeLabel.text=this.totalRecordSize.toString();

            this.pageNav.dataProvider=this.pageNumData;

        }

        public function clearOrgData():void{

            this.orgData.removeAll();

        }

        public function setOrgData(data:Object):void{

            this.orgData.addItem(data);

        }

        public function clearPageNumData():void{

            this.pageNumData.removeAll();

        }

        public function setPageNumData(data:Object):void{

            this.pageNumData.addItem(data);

        }

    }

}

-----------------------------------------------------------------------

PageBar.mxml

--------------------------------------

<mx:HBox xmlns:fx="http://ns.adobe.com/mxml/2009"

         xmlns:mx="library://ns.adobe.com/flex/mx"

         paddingLeft="10"

         backgroundColor="white">

    <fx:Style>

        LinkBar {

            borderStyle: none;

            backgroundAlpha: 0.06;

            separatorColor: #c4cccc;

            rollOverColor: #009999;

            selectionColor: #7fcdfe;

            textSelectedColor: #6600cc;

            disabledColor: #33ffff;

            dropShadowEnabled: false;

        }

    </fx:Style>

    <fx:Script>

        <![CDATA[

            import com.adobe.cairngorm.CairngormUtil;

            import flash.events.KeyboardEvent;

            import fx.model.ModelConfig;

            import fx.util.SimpleAlert;

            import mx.collections.ArrayCollection;

            import mx.controls.AdvancedDataGrid;

            import mx.controls.DataGrid;

            import mx.events.ItemClickEvent;

            import mx.utils.ObjectProxy;

            import mx.validators.NumberValidator;

            [Bindable]

            public var model:ModelConfig=ModelConfig.getOne();

            //這個地方才是最終要變動的:取famousExamPageBar還是finishedExamBar

            [Bindable]

//            public var pageBar:PageBar=model.famousExamPageBar;

            public var pageBar:PageBar=null;

            public var advancedDataGrid:AdvancedDataGrid=null;

//            //頁面初始化函數

//            public function getFamouExam(page:int):void{

//                pageBar.params.currentPage=page;

//                //參數處理

//                var params:Object=pageBar.params;

//                

//                //調用事件處理類

//                CairngormUtil.event("FamousExamCD",params);

//

//            }

//            

//            

//            public function refreshDataProvider():void{

//                //綁定新查詢的資料到AdvancedDataGrid

//                advancedDataGrid.dataProvider=pageBar.orgData;

//            }

//

//            

//            

            //頁面初始化函數

            public function getDatas(page:int):void{

                //重新設定目前頁

                pageBar.params.currentPage=page;

                //參數處理

                var params:Object=pageBar.params;

                //調用事件處理類

                CairngormUtil.event(pageBar.eventName,params);

            }

            private function navigateButtonClick(pageString:int):void{

                //1.重新設定首頁、上一頁、下一頁、尾頁

                //3.重新設定每頁顯示的頁碼條

                //2.重新填充頁面資料

                //pageBar.createNavBar(pageString);

                if(pageBar.totalPageSize == 1){

                    new SimpleAlert().show("目前頁已包含所有資料!");

                    return;

                }

                if(pageBar.currentPage == pageBar.firstPage && pageString == 1){

                    new SimpleAlert().show("已到達首頁!");

                    return;

                }

                if(pageBar.currentPage == pageBar.lastPage && pageString == pageBar.lastPage){

                    new SimpleAlert().show("已到達尾頁!");

                    return;

                }

                getDatas(pageString);

            }

            private function navigatePage(event:ItemClickEvent):void

            {

                //重發資料請求

                getDatas(event.item.data);

            }

        ]]>

    </fx:Script>

    <mx:Label text="第" width="100%"/>

    <mx:Label id="curPageLabel" text="{pageBar.currentPage}" width="100%"/>

    <mx:Label text="頁/共" width="100%"/>

    <mx:Label id="totalPageLabel" text="{pageBar.totalPageSize}" width="100%"/>

    <mx:Label text="頁 共" width="100%"/>

    <mx:Label id="countRecordSizeLabel" text="{pageBar.totalRecordSize}" width="100%"/>

    <mx:Label text="條記錄" width="100%"/>

    <mx:Button id="firstNavBtn" label="首頁" click="navigateButtonClick(pageBar.firstPage)"/>

    <mx:Button id="preNavBtn" label="上一頁" click="navigateButtonClick(pageBar.prePage)"/>

    <mx:LinkBar id="pageNav" itemClick="navigatePage(event)" dataProvider="{pageBar.pageNumData}"/>

    <!-- <mx:ToggleButtonBar id="pageNav2" itemClick="navigatePage(event)" dataProvider="{pageBar.pageNumData}" dropShadowVisible="false"/> -->

    <mx:Button id="nextNavBtn" label="下一頁" click="navigateButtonClick(pageBar.nextPage)"/>

    <mx:Button id="lastNavBtn" label="尾頁" click="navigateButtonClick(pageBar.lastPage)"/>

</mx:HBox>

-----------------------------------------------------------------------

<paging:CheckBoxDataGrid id="dg" dataProvider="{model.finishedExamPageBar.orgData.toArray()}" horizontalScrollPolicy="on"

                    allowMultipleSelection="true" change="foo.text = dg.selectedIndices.toString()" >

                    <paging:columns>

                    <mx:DataGridColumn dataField="paperId" headerText=" " width="20"

                    sortable="false" itemRenderer="fx.util.CheckBoxRenderer" headerRenderer="fx.util.CheckBoxHeaderRenderer" >

                    </mx:DataGridColumn>

                    <mx:DataGridColumn dataField="paperName" headerText="First Name" />

                    <mx:DataGridColumn dataField="source" headerText="Last Name" />

                    </paging:columns>

                    </paging:CheckBoxDataGrid>

                    <mx:Label id="foo" />