flex的datagrid中动态绑定按钮

    技术2022-05-19  21

    显示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;             /**              *                 * @param id 成绩ID              * @param paperid 试卷ID              **/             public function viewThisExam(event:MouseEvent):void{                                 Alert.show("成绩ID="+data.id+" 试卷ID="+data.paperId);             }             /**              *                * @param id 成绩ID              * @param paperid 试卷ID              **/             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; /**  *  DataGrid that uses checkboxes for multiple selection  */ 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; /**  *  The Renderer.  */ 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();         }     }     /* eat keyboard events, the underlying list will handle them */     override protected function keyDownHandler(event:KeyboardEvent):void     {     }     /* eat keyboard events, the underlying list will handle them */     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;         }     }     /* center the checkbox if we're in a datagrid */     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; /**  *  The Renderer.  */ 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);     }     /* eat keyboard events, the underlying list will handle them */     override protected function keyDownHandler(event:KeyboardEvent):void     {     }     /* eat keyboard events, the underlying list will handle them */     override protected function keyUpHandler(event:KeyboardEvent):void     {     }     /* eat mouse events, the underlying list will handle them */     override protected function clickHandler(event:MouseEvent):void     {     }     /* center the checkbox if we're in a datagrid */     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; /**  *  List that uses checkboxes for multiple selection  */ 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         }         /**          * 初始化分页,设置总记录数、每页显示记录数、当前页、计算总页数、设置首页、设置尾页          * @param totalRecordSize 总记录数          * @param pageSize 每页显示记录数          * @param currentPage 当前页页码          *          **/         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;         }         /**          * 清空orgData中的数据,此数据用于在界面展示          **/         public function clearOrgData():void{             this.orgData.removeAll();         }         /**          *    绑定数据到orgData中          **/         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);                              }             /**              * 页码按钮按下,first,pre,next,last              */             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" />


    最新回复(0)