`

FLEX中带复选框的DataGrid

    博客分类:
  • FLEX
阅读更多

1.主文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- http://www.myflexhero.com/share/flex3-mx/flex-mx-core-components/flex-mx-ui-controls/flex-mx-tree-and-datagrid-controls/604  -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
				xmlns:local="com.future.component.*"
				height="500" verticalGap="0" viewSourceURL="srcview/index.html">
	<mx:Script>
		<![CDATA[
			import mx.controls.Alert;
			private var arr:Array = [
										{label:"未下发工单",value:"1"},
										{label:"已处理工单",value:"2"},
										{label:"已关闭工单",value:"3"},
										];
			
			private function selectInfo():void{
				for each(var obj:Object in dg.selectedItems){
					Alert.show(obj.value);
				}
			}
 
		]]>
	</mx:Script>
	<local:CheckBoxDataGrid id="dg" dataProvider="{arr}" horizontalScrollPolicy="on" allowMultipleSelection="true">
		<local:columns>
			<mx:DataGridColumn width="20" sortable="false" itemRenderer="com.future.component.CheckBoxRenderer" headerRenderer="com.future.component.CheckBoxHeaderRenderer"/> 
			<mx:DataGridColumn dataField="label" headerText="类型" />
		</local:columns>
	</local:CheckBoxDataGrid>
	<mx:Button label="显示信息" click="{selectInfo()}"/>
</mx:Application>

 2.CheckBoxDataGrid.as

package com.future.component
{
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);
	}
 
}
}

 3.CheckBoxHeaderRenderer.as

package com.future.component
{
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){
			    selected = true;
                partiallySelected = false;
            }
            else if (ListBase(owner).selectedItems.length == 0){
                selected = false;
                partiallySelected = false;
            } else{
                selected = false;
                partiallySelected = 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){
            // uncheck everything
            ListBase(owner).selectedIndex = -1;
        }else{
            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();
    }
}
}

 4.CheckBoxRenderer.as

package com.future.component
{
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();
		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;
				}
			}
		}
	}
 
}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics