`

Flex DataGrid CheckBox 实现多选

    博客分类:
  • Flex
 
阅读更多

涉及到4个相关的类,先列举如下:

1、CenterCheckBox.as:通过重写CheckBox基类来实现复选框的居中显示;

2、CheckBoxColumn.as:继承自DataGridColumn的一个新类,为了实现需要,增添了两个属性;

3、CheckBoxHeaderRenderer.as:继承自CenterCheckBox 类,用于DataGrid表头的复选框,实现全选功能;

4、CheckBoxItemRenderer.as:继承自CenterCheckBox 类,用于DataGrid表中的数据行

一、CenterCheckBox.as

package components
{
    import flash.display.DisplayObject;
    import flash.text.TextField;
   
    import mx.controls.CheckBox;
   
    public class CenterCheckBox extends CheckBox
    {
       
        //使复选框剧中显示
        override protected function updateDisplayList(width:Number, height:Number):void
        {
            super.updateDisplayList(width,height);
            var n:int = numChildren;
            for( var i:int = 0;i<n;i++)
            {
                var c:DisplayObject = getChildAt(i);
                if(!(c is TextField))
                {
                    c.x = Math.round((width - c.width) / 2);
                    c.y = Math.round((height - c.height) / 2);
                }
            }
        }
    }
}

二、CheckBoxColumn.as

package components
{
    import mx.controls.dataGridClasses.DataGridColumn;
   
    public class CheckBoxColumn extends DataGridColumn
    {
        public var columnSelected:Boolean = false;//保存该列是否全选在属性(用户先点击全选后,再手动的取消几行数据的选中状态时,这里的状态不会改变)
       
        public var selectedItems:Array = new Array();//用于保存用户选中在数据
       
        public function CheckBoxColumn(columnName:String=null)
        {
            super(columnName); 
        }
    }
}

三、CheckBoxHeaderRenderer.as

package components
{
    import flash.events.Event;
   
    import mx.collections.ArrayCollection;
    import mx.controls.DataGrid;

    public class CheckBoxHeaderRenderer extends CenterCheckBox
    {
        private var _data:CheckBoxColumn;//定义CheckBox列对象
        public function CheckBoxHeaderRenderer()
        {
            super();
            this.addEventListener(Event.CHANGE,onChange);
            this.toolTip = "全选";
        }
       
        override public function get data():Object
        {
            return _data;
        }
       
        override public function set data(value:Object):void
        {
            _data = value as CheckBoxColumn;
            this.selected = _data.columnSelected;
        }
       
        private function onChange(event:Event):void
        {
            var dg:DataGrid = DataGrid(listData.owner);//获取 DataGrid对象
            var column:CheckBoxColumn = dg.columns[listData.columnIndex];//获取整列的显示对 象
            var dgDataArr:ArrayCollection = dg.dataProvider as ArrayCollection;
            column.columnSelected = this.selected;//更改列的全选状态
            column.selectedItems = new Array();//重新初始化用于保存选中列的对象
            if(this.selected)
            {
                //如果为全部选中的化就将数据源赋值给column.selectItems,不是就不管他,上一步已经初始化为空
                column.selectedItems = (dg.dataProvider as ArrayCollection).toArray();
            }
            if(dgDataArr.length>0)
            {
                if(dgDataArr[0]!="")
                {
                    for(var i:int = 0; i < dgDataArr.length ; i++)
                    {
                        Object(dgDataArr[i]).dgSelected = this.selected;//更改没一行的选中状态
                    } 
                } 
                dgDataArr.refresh();//刷新 数据源,达到强制更新页面显示效果的功能,防止在使用时没有在VO类中使用绑定而出现点击全选页面没有更改状态的错误      
            }
        }
    }
}

四、CheckBoxItemRenderer.as

 

package components
{
    import flash.events.Event;
   
    import mx.controls.DataGrid;

    public class CheckBoxItemRenderer extends CenterCheckBox
    {
        private var currentData:Object;//保存当前一行值在引用
        public function CheckBoxItemRenderer()
        {
            super();
            this.addEventListener(Event.CHANGE,onClickCheckBox);
            this.toolTip = "选择";
        }
       
        override public function set data(value:Object):void
        {
            this.selected = value.dgSelected;
            this.currentData = value;//保存整行在引用
        }
        //点击check box时,根据状况向selectedItems array中添加当前行的引用,或者从array中移除
        private function onClickCheckBox(e:Event):void
        {
            var dg:DataGrid = DataGrid(listData.owner);//获取DataGrid对象
            var column:CheckBoxColumn = dg.columns[listData.columnIndex];//获取整列的显示对 象
            var selectItems:Array = column.selectedItems;
            this.currentData.dgSelected = this.selected;
           
            if(this.selected)
            {
                selectItems.push(this.currentData);
            }
            else
            {
                for(var i:int = 0; i<selectItems.length;i++)
                {
                    if(selectItems[i] == this.currentData)
                    {
                        selectItems.splice(i,1);
                    }
                }
            }
        }
    }
}

 

五、mxml的使用

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               xmlns:comp="components.*" minWidth="955" minHeight="600" creationComplete="init()">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import components.CheckBoxHeaderRenderer;
            import components.CheckBoxItemRenderer;
            import components.SequenceItemRenderer;
            import mx.controls.Alert;
            private var _indexRenderer:Class = SequenceItemRenderer;
           
            private function init():void{ 
                var array:Array = []; 
                for(var i:int = 1; i <= 10; i++){ 
                    array.push({name:"name"+i.toString()}); 
                } 
                grid.dataProvider = array; 
            } 
            private function commit():void
            {
                Alert.show(checkbox.selectedItems.length+"");
            }
        ]]>
    </fx:Script>
    <mx:DataGrid id="grid"> 
        <mx:columns> 
            <comp:CheckBoxColumn id="checkbox" dataField="isSelected" width="25"   
                                 draggable="false" resizable="false" sortable="false"
                                  headerRenderer="{new ClassFactory(components.CheckBoxHeaderRenderer)}"
                                  itemRenderer="{new ClassFactory(components.CheckBoxItemRenderer)}"/>
            <mx:DataGridColumn headerText="no" itemRenderer="{new ClassFactory(_indexRenderer)}"/> 
            <mx:DataGridColumn headerText="name" dataField="name"/> 
        </mx:columns> 
    </mx:DataGrid> 
    <s:Button label="提交" click="commit()"/>
</s:Application>

分享到:
评论
6 楼 comdevlihun 2014-02-12  
里面有个大大的Bug,当全选之后,单击一行数据使其成为未选中状态,但是列头的状态还是选中状态……
5 楼 niweiwei 2013-10-29  
link_jack 写道
我感觉CheckBoxColumn这个类的重写没必要,一方面重新开辟内存存储选中数据,浪费了资源。另一方面封装的角度来讲,针对于datagrid 来说  要获取选择数据却要从datagrid一个列中获取,破环了封装性,同时程序也显示的混乱,既然同时也在数据源中添加了字段记录选择状态,为什么不直接在数据源中获取呢?

这个是以前写的关于flex的东西,我也好久没有看flex了,如果兄弟你觉得你的方案好,可以拿出来分享,大家学习下
4 楼 link_jack 2013-06-05  
我感觉CheckBoxColumn这个类的重写没必要,一方面重新开辟内存存储选中数据,浪费了资源。另一方面封装的角度来讲,针对于datagrid 来说  要获取选择数据却要从datagrid一个列中获取,破环了封装性,同时程序也显示的混乱,既然同时也在数据源中添加了字段记录选择状态,为什么不直接在数据源中获取呢?
3 楼 tengji900 2011-11-18  
SequenceItemRenderer
是不是你没上传啊
2 楼 niweiwei 2011-09-15  
估计是你的CheckBoxColumn这个类没有定义吧
1 楼 tengji900 2011-09-01  
private var _indexRenderer:Class = SequenceItemRenderer;
异常 本人给删除了


<comp:CheckBoxColumn id="checkbox" dataField="isSelected" width="25"   
                                 draggable="false" resizable="false" sortable="false"
                                  headerRenderer="{new ClassFactory(components.CheckBoxHeaderRenderer)}"
                                  itemRenderer="{new ClassFactory(components.CheckBoxItemRenderer)}"/>


MyEclipse报如下异常

此行的多个标记:
-CheckBoxColumn
-1046: 找不到类型,或者它不是编译时常数: CheckBoxColumn。

求解

相关推荐

    Flex Datagrid checkbox实现

    总的来说,实现Flex Datagrid的复选框功能是一个基础但实用的操作,它可以帮助用户在大量数据中进行多选操作,从而提高交互性。随着对Flex的深入学习,可以进一步探索Datagrid的各种高级特性和自定义功能,以满足更...

    Flex DataGrid CheckBox 一个简单的全选

    总的来说,这个示例旨在教会开发者如何在Flex的DataGrid中实现全选功能,并且有效地管理CheckBox的选中状态。通过对DataGrid的自定义,我们可以灵活地扩展和优化这个功能,以满足不同业务需求。同时,了解和掌握这些...

    flex datagrid checkbox实现源码

    以上就是关于“flex datagrid checkbox实现源码”的主要知识点,理解并掌握这些内容将有助于在实际项目中实现灵活、稳定且高效的多选功能。通过对源代码的学习和研究,可以深入理解Flex DataGrid的内部工作机制,...

    Flex带CheckBox的多选 列表和表格

    总之,通过在Flex中使用`CheckBox`结合`List`或`DataGrid`,我们可以实现具有多选功能的交互式列表和表格,为用户提供更加便捷的操作体验。理解并熟练掌握这些组件和原理,对于开发富互联网应用程序至关重要。

    flex datagrid 嵌套checkbox实现全选

    本示例关注的是在DataGrid中嵌套复选框(Checkbox),并实现全选功能。这在需要用户批量选择或操作数据的场景中非常常见。以下是对这个主题的详细讲解: 1. **Flex DataGrid组件**: Flex DataGrid是Adobe Flex...

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

    总的来说,实现Flex DataGrid标题栏添加复选框并使其与数据行的复选框联动,涉及到自定义HeaderRenderer和CellRenderer,以及对数据源和事件处理的深入理解。这需要开发者具备良好的Flex编程基础和组件定制能力。...

    Flex dataGrid 全选、反选

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

    flex的dataGrid添加复选框(checkBox)

    在Flex编程中,DataGrid控件是用于展示数据集的一种常用组件,它可以显示表格形式的数据。在实际应用中,我们经常需要在DataGrid的每一行中添加复选框(checkBox),以便用户可以选择一行或多行数据进行操作。这个...

    flexdatagrid实现列中下拉列表与行勾选功能

    本篇文章将深入探讨如何在`Flex DataGrid`中实现列中下拉列表(ComboBox)以及行的勾选(CheckBox)功能,这在诸如数据筛选、多选操作等场景中非常常见。 首先,我们要了解`Flex DataGrid`的基本结构。`DataGrid`由...

    flex-带checkbox的datagrid

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

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

    本文将详细探讨如何在Flex的DataGrid中实现CheckBox的全选和反选功能,以及如何防止选择状态错乱的问题。 首先,我们需要创建一个自定义的DataGrid列类,这个类将扩展mx.controls.gridClasses.GridColumn,并且包含...

    在Flex的DataGrid中使用CheckBox

    本文将详细介绍如何在 Flex 的 DataGrid 中使用 CheckBox,并通过一个具体的示例来展示其实现过程。 #### 二、基础知识简介 1. **Flex 和 MXML:** - Flex 是一款开源框架,用于构建跨平台的桌面和移动设备应用...

    flex实现 ComboBox中下拉checkbox

    然而,有时我们需要在ComboBox中嵌入多选功能,这时可以通过添加Checkbox来实现。本文将深入探讨如何在Flex中的ComboBox实现下拉列表中包含Checkbox的功能,并结合移动面板和可调整大小的面板实例,为你提供一个完整...

    怎样在flex的datagrid中运用checkbox

    在实际应用中,我们经常需要在DataGrid的列中添加复选框(Checkbox),以便用户能够进行多选操作,例如全选和单选。本文将深入探讨如何在Flex的DataGrid中使用复选框,并实现全选和单选功能。 首先,我们需要在...

    flex中Datagride嵌套checkbox

    总之,Flex的DataGrid组件为我们提供了强大的数据展示功能,通过自定义列和事件处理,我们可以轻松地在其中嵌入复选框,实现数据的多选操作。这种技巧在许多数据交互丰富的应用程序中都十分常见。

    Flex中DataGrid和其它控件使用

    4. **CheckBox**:通过使用CheckBoxField,可以在DataGrid中添加复选框,以便进行多选操作。 5. **HeaderRenderer**和**ItemRenderer**:这两个组件允许我们自定义DataGrid的列头和单元格的外观和行为,以满足特定...

    Flex--AdvanceDataGrid(列头筛选功能,含ComboBox列、Button列、Checkbox列等)

    在"Flex--AdvanceDataGrid(列头筛选功能,含ComboBox列、Button列、Checkbox列等)"这个项目中,我们将深入探讨如何实现ADG的列头筛选,以及如何集成不同类型的列,如ComboBox列、Button列和Checkbox列。 首先,让...

    DataGrid的itemRenderer and HeaderRenderer

    在本话题中,我们将深入探讨如何使用`checkbox`和`combobox`作为`DataGrid`的`itemRenderer`和`headerRenderer`,以及实现全选、多选等功能。 首先,`itemRenderer`是`DataGrid`中用于自定义每一行数据项显示方式的...

    Flex--AdvanceDataGrid(列头筛选功能,含ComboBox列、Button列、Checkbox列等)修正版

    Checkbox列常用于多选情况,用户可以勾选多个选项来定义筛选条件。修复版本解决了Checkbox列无法选择的问题,这意味着用户现在可以正常地通过复选框进行多条件筛选,这对于处理有多种状态或分类的数据尤其有用。 ...

    CheckboxInDataGridSample

    "CheckboxInDataGridSample"是一个示例项目,它演示了如何在Flex中的DataGrid组件中集成Checkbox控件,并实现全选功能。这个项目对于理解Flex编程、数据网格布局以及事件处理等方面具有很高的学习价值。 首先,`...

Global site tag (gtag.js) - Google Analytics