`

Flex DataGrid中使用CheckBox[转]

    博客分类:
  • Flex
 
阅读更多

本文使用DataGrid的headerRendereritemRenderer ,设计一个的DataGrid+Checkbox 的组件,且包括了表头多选 支持。

 

[主程序源码(application.mxml source code)]

<?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="*"
				height="500" verticalGap="0" viewSourceURL="srcview/index.html">
	<mx:Script>
		<![CDATA[
			private var arr:Array = [
				{ firstName: "Alex", lastName: "Harui", age: 48 },
				{ firstName: "Gordon", lastName: "Smith", age: 54 },
				{ firstName: "Deepa", lastName: "Subramanian", age: 22 },
				{ firstName: "Matt", lastName: "Chotin", age: 28 },
				{ firstName: "Ely", lastName: "Greenfield", age: 32 },
				{ firstName: "Kevin", lastName: "Lynch", age: 15},
				{ firstName: "Shantanu", lastName: "Narayan", age: 50 },
				{ firstName: "Joan", lastName: "Lafferty", age: 23 },
				{ firstName: "Ryan", lastName: "Frishberg", age: 19 },
				{ firstName: "Jason", lastName: "Szeto", age: 30 },
				{ firstName: "Mark", lastName: "Anders", age: 40 },
				{ firstName: "Peter", lastName: "Flynn", age: 24 },
				{ firstName: "Heidi", lastName: "Williams", age: 18 }
 
			];
 
		]]>
	</mx:Script>
	<local:CheckBoxDataGrid id="dg" initialize="dg.dataProvider=arr" horizontalScrollPolicy="on"
							allowMultipleSelection="true" change="foo.text = dg.selectedIndices.toString()" >
		<local:columns>
			<mx:DataGridColumn dataField="firstName" headerText=" " width="20" 
							   sortable="false" itemRenderer="CheckBoxRenderer" headerRenderer="CheckBoxHeaderRenderer" > 
			</mx:DataGridColumn>
			<mx:DataGridColumn dataField="firstName" headerText="First Name" />
			<mx:DataGridColumn dataField="lastName" headerText="Last Name" />
		</local:columns>
	</local:CheckBoxDataGrid>
	<mx:Label id="foo" />
 
</mx:Application> 

 

[CheckBoxDataGrid.as源码]

package 
{
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);
	}
 
}
 
} 

 

[CheckBoxRenderer.as源码]

package 
{
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;
				}
			}
		}
	}
 
}
 
} 

 

[CheckBoxHeaderRenderer.as源码]

package 
{
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();
    }
 
}
 
} 
 

 

本文转自:http://www.myflexhero.com/share/flex3-mx/flex-mx-core-components/flex-mx-ui-controls/flex-mx-tree-and-datagrid-controls/604

 

 

 

分享到:
评论

相关推荐

    Flex的DataGrid中使用CheckBox

    Flex的DataGrid中使用CheckBox. 大家共同研究

    Flex Datagrid checkbox实现

    在标题“Flex Datagrid checkbox实现”中,讨论的核心是Datagrid中集成复选框(checkbox)的功能。 在Flex Datagrid中实现复选框功能,主要是通过添加一个自定义的列renderer来完成。Renderer是Datagrid中的一个小...

    在Flex的DataGrid中使用CheckBox

    ### 在Flex的DataGrid中使用CheckBox #### 一、引言 在Flex应用程序开发中,DataGrid 是一种常用的UI组件,用于展示数据列表,并提供了一系列的功能,如排序、过滤等。有时,为了增加用户交互性或实现特定功能,...

    Flex DataGrid CheckBox 一个简单的全选

    在Flex的DataGrid中,我们可以为每一行添加CheckBox,这样用户就可以通过点击CheckBox来选择或取消选择特定的行。这在需要多选操作的场景中非常实用,比如用户需要批量处理某些数据。 二、设置CheckBox的默认状态 ...

    flex datagrid 嵌套checkbox实现全选

    在Flex开发中,数据网格(DataGrid)是用于展示数据集合的强大组件,它允许用户以表格形式查看和操作数据。本示例关注的是在DataGrid中嵌套复选框(Checkbox),并实现全选功能。这在需要用户批量选择或操作数据的...

    flex datagrid 标题栏添加 checkbox 和 数据行 checkbox 连动

    在Flex开发中,数据网格(DataGrid)是一种常用的组件,用于展示结构化的数据。当我们需要在数据网格中实现复选框功能,以便用户可以多选数据行时,通常会遇到两个主要需求:一是如何在标题栏添加复选框,二是如何使...

    flex Datagrid checkbox全选

    对于行中的checkbox,你可以在数据源中定义对应的字段,Flex会自动使用默认的`CheckBoxItemRenderer`。 总结起来,实现Flex Datagrid checkbox全选功能主要涉及自定义数据列、表头渲染器和行渲染器,通过事件监听和...

    flex在DataGrid中实现checkbox全选或取消

    在IT行业中,尤其是在Web开发领域,Flex是一种广泛使用的ActionScript框架,它允许开发者构建富互联网应用程序(RIA)。本文将深入探讨如何在Flex中的DataGrid组件中实现复选框的全选与取消全选功能,这对于数据操作...

    Flex_全选或取消DataGrid中的checkbox

    根据给定的信息,本文将详细解释如何在Flex中实现DataGrid中的checkbox全选或取消功能。这涉及到Flex的checkbox管理、事件监听与处理、以及如何使用Cairngorm框架进行模型层更新等内容。 ### 一、理解Flex DataGrid...

    怎样在flex的datagrid中运用checkbox

    本文将深入探讨如何在Flex的DataGrid中使用复选框,并实现全选和单选功能。 首先,我们需要在DataGrid的列定义中添加一个CheckBox组件。在MXML中,你可以通过以下方式创建一个包含复选框的列: ```xml 选择"&gt; ...

    Flex4 带checkbox的DataGrid

    其中包含一个三种状态的checkbox,DataGrid代码中引用了 带多选框的DataGrid(AdvancedDataGrid) 表头有全选CheckBox,三种状态:全选、部分选择、无选择 如果改变目录结构,需要在CustomCheckBox.mxml中更改inner....

    flex datagrid checkbox实现源码

    "flex datagrid checkbox实现源码"这个主题就是关于如何在Flex DataGrid中集成并正确管理复选框功能的。 1. **Flex DataGrid基础** Flex DataGrid是Adobe Flex框架中的一种组件,用于显示和编辑大量结构化的数据。...

    flex datagrid插入多列Checkbox应用实例

    在Flex开发中,数据网格(DataGrid)是用于展示大量结构化数据的组件,它可以提供丰富的功能,如排序、分页、编辑等。在实际应用中,我们有时需要在DataGrid的每一行中插入多个复选框(Checkbox),以便用户能够进行...

    flex中Datagride嵌套checkbox

    在Flex开发中,数据网格(DataGrid)是一种常用的组件,用于展示和操作大量结构化数据。在实际应用中,我们经常需要在DataGrid的列中嵌套复选框(Checkbox),以便用户可以进行多选操作或者对数据进行勾选状态的设置...

    Flex dataGrid 全选、反选

    本文将详细讨论如何在Flex DataGrid中实现全选和反选功能,并结合`checkBox`来优化这一过程。 首先,我们要理解DataGrid的结构。DataGrid由多个列组成,每一列可能包含不同类型的控件,如文本、图像或复选框。在...

    Flex DataGrid checkBox

    总结,Flex中的DataGrid与CheckBox的结合使用,提供了一种直观且用户友好的方式来处理表格数据。通过创建自定义列和渲染器,我们可以轻松地实现选中状态的管理,同时支持全选/全不选等高级功能。注意在实现这些功能...

    flex datagrid checkbox 全选/反选

    要在DataGrid中使用自定义的渲染器,我们需要在DataGrid的配置中指定`headerRenderer`和`itemRenderer`属性。 ```as &lt;mx:DataGrid id="myDataGrid"&gt; 选项" headerRenderer="utils.itemrender.CheckBoxRender" ...

    Flex中DataGrid内嵌CheckBox的全选反选和防止选择状态错乱实现方法

    接下来,我们需要在MXML文件(例如dazhiTestDemo.mxml)中使用这个自定义列类。在DataGrid的columns属性中,我们可以创建一个CustomGridColumn实例,并将其dataField设置为一个特定的标识字段,这样我们可以通过这个...

    DataGrid和AdvancedDataGrid CheckBox全选功能

    在本文中,我们将深入探讨两种在Flex或Adobe AIR应用程序中常用的组件——`DataGrid`和`AdvancedDataGrid`,特别是关于它们的CheckBox全选功能。`DataGrid`和`AdvancedDataGrid`是Flex中用于展示数据集合的强大工具...

    flex-带checkbox的datagrid

    标题"flex-带checkbox的datagrid"指的是在Flex Datagrid组件中集成复选框(checkbox)的功能。这种功能常用于多选操作,例如用户可以选择一组数据项进行批量删除、编辑或其他操作。下面将详细介绍如何在Flex中实现带...

Global site tag (gtag.js) - Google Analytics