0

我在 AdvancedDataGrid 中有一个复选框作为 GroupItemrenderer。我在树中选择了某些子节点并关闭了它的父节点,稍后当我重新打开同一个父节点时,选定的子节点不是我选择的那些。如何在复选框中保留正确的选择。 ??

也无法从组件默认设置复选框(GroupItemRenderer)的值,也无法访问数据属性中复选框的值。

package 
{
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;

import mx.collections.ICollectionView;
import mx.collections.IHierarchicalCollectionView;
import mx.collections.IHierarchicalData;
import mx.collections.IViewCursor;
import mx.controls.AdvancedDataGrid;
import mx.controls.Alert;
import mx.controls.CheckBox;
import mx.controls.Image;
import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
import mx.controls.advancedDataGridClasses.AdvancedDataGridGroupItemRenderer;
import mx.controls.advancedDataGridClasses.AdvancedDataGridListData;
import mx.core.FlexGlobals;
import mx.core.mx_internal;

use namespace mx_internal; 



public class CheckADGRenderer extends AdvancedDataGridGroupItemRenderer
{
    protected var myImage:Image;
    public var status:String = "false";

    // set image properties
    private var imageWidth:Number   = 6;
    private var imageHeight:Number  = 6;
    private var inner:String    = "inner.png";
    protected var myCheckBox:CheckBox;
    static private var STATE_SCHRODINGER:String = "schrodinger";
    static private var STATE_CHECKED:String = "checked";
    static private var STATE_UNCHECKED:String = "unchecked";

    public function CheckADGRenderer () 
    {
        super();
        mouseEnabled = false;
    }
    private function toggleParents(item:Object,adg:AdvancedDataGrid,state:String):void
    {
        if (item == null)
        {
            return;
        }
        else
        {
            item.@state = false;
            toggleParents(adg.getParentItem(item), adg, getState (adg, adg.getParentItem(item)));
        }
    }

    private function toggleChildren (item:Object, adg:AdvancedDataGrid, state:String):void
    {

        if (item == null)
        {
            return;
        }
        else
        {
            //item.@state = state;
            var adgCollection:IHierarchicalCollectionView = adg.dataProvider as IHierarchicalCollectionView;
            var adgHD:IHierarchicalData = adgCollection.source; 
            if (adgHD.hasChildren(item))
            {
                var children:ICollectionView = adgCollection.getChildren (item);
                var cursor:IViewCursor = children.createCursor();
                while (!cursor.afterLast)
                {
                    toggleChildren(cursor.current, adg, state);
                    cursor.moveNext();
                }
            }
        }
    }

    private function getState(adg:AdvancedDataGrid, parent:Object):String
    {
        var noChecks:int = 0;
        var noCats:int = 0;
        var noUnChecks:int = 0;
        if (parent != null)
        {
            var adgCollection:IHierarchicalCollectionView = adg.dataProvider as IHierarchicalCollectionView;
            var cursor:IViewCursor = adgCollection.getChildren(parent).createCursor();
        }
        if ((noChecks > 0 && noUnChecks > 0) || (noCats > 0))
        {
            return STATE_SCHRODINGER;
        }
        else if (noChecks > 0)
        {
            return STATE_CHECKED;
        }
        else
        {
            return STATE_UNCHECKED;
        }
    }
    private function imageToggleHandler(event:MouseEvent):void
    {
        myCheckBox.selected = !myCheckBox.selected;
        checkBoxToggleHandler(event);
    }
    var selectArr:Array = new Array();
    private function checkBoxToggleHandler(event:MouseEvent):void
    {

        if (data)
        {
            var myListData:AdvancedDataGridListData = AdvancedDataGridListData(this.listData);
            var selectedNode:Object = myListData.item;

            var adg:AdvancedDataGrid = AdvancedDataGrid(myListData.owner);

            var toggle:Boolean = myCheckBox.selected;
            if (toggle)
            {
                toggleChildren(data, adg, STATE_CHECKED);
            }
            else
            {
                toggleChildren(data, adg, STATE_UNCHECKED);
            }
            var parent:Object = adg.getParentItem (data);
            toggleParents (parent, adg, getState (adg, parent));
            //Alert.show(selectArr.toString()+"\t\t"+selectArr.length+"\t\t"+selectArr[0].length+"\t\t"+adg.selectedIndices.length);
        }
    }

    override protected function createChildren():void
    {
        super.createChildren();
        myCheckBox = new CheckBox();
        myCheckBox.setStyle( "verticalAlign", "middle" );
        myCheckBox.addEventListener( MouseEvent.CLICK, checkBoxToggleHandler );
        addChild(myCheckBox);

    }   

    private function setCheckState (checkBox:CheckBox, value:Object, state:Boolean):void
    {
        if (state == STATE_CHECKED)
        {
            checkBox.selected = state;
        }
        else if (state == STATE_UNCHECKED)
        {
            checkBox.selected = false;
        }
        else if (state == STATE_SCHRODINGER)
        {
            checkBox.selected = false;
        }
        checkBox.selected = state;
    }      
    override public function set data(value:Object):void
    {
        super.data = value;

        var myListData:AdvancedDataGridListData = AdvancedDataGridListData(this.listData);
        //var adg:AdvancedDataGrid = AdvancedDataGrid(myListData.owner);

        var selectedNode:Object = myListData.item;

        myCheckBox.selected =  AdvancedDataGridListData(super.listData).item.show;
        //var adg:AdvancedDataGrid = AdvancedDataGrid(myListData.owner);

        //setCheckState (myCheckBox, value, Boolean(value.state));

    }

   override protected function commitProperties():void
   {
       super.commitProperties();
       var dg:AdvancedDataGrid = AdvancedDataGrid(listData.owner);

       var column:AdvancedDataGridColumn =
           dg.columns[listData.columnIndex];       
       label.wordWrap = dg.columnWordWrap(column);
   }

    /**
     *  @private
     */
    override protected function measure():void
    {
        super.measure();

        var w:Number = data ? AdvancedDataGridListData(listData).indent : 0;

        if (disclosureIcon)
            w += disclosureIcon.width;

        if (icon)
            w += icon.measuredWidth;

        if (myCheckBox)
            w += myCheckBox.measuredWidth;

        // guarantee that label width isn't zero because it messes up ability to measure
        if (label.width < 4 || label.height < 4)
        {
            label.width = 4;
            label.height = 16;
        }

        if (isNaN(explicitWidth))
        {
            w += label.getExplicitOrMeasuredWidth();    
            measuredWidth = w;
        }
        else
        {
            label.width = Math.max(explicitWidth - w, 4);
        }

        measuredHeight = label.getExplicitOrMeasuredHeight();
        if (icon && icon.measuredHeight > measuredHeight)
            measuredHeight = icon.measuredHeight;
        if (myCheckBox && myCheckBox.measuredHeight > measuredHeight)
            measuredHeight = myCheckBox.measuredHeight;
    }


   override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
   {
        super.updateDisplayList(unscaledWidth, unscaledHeight);
        if(super.data)
        {
            if (super.icon != null)
            {
                myCheckBox.x = super.icon.x;
                myCheckBox.y = (unscaledHeight - myCheckBox.height) / 2;
                super.icon.x = myCheckBox.x + myCheckBox.width + 17;
                if (icon.x + icon.width > unscaledWidth)
                    icon.setActualSize(0, unscaledHeight);
                super.label.x = super.icon.x + super.icon.width + 3;
                super.label.setActualSize(Math.max(unscaledWidth - super.label.x, 4), unscaledHeight);
            }
            else
            {
                myCheckBox.x = super.label.x;
                myCheckBox.y = (unscaledHeight - myCheckBox.height) / 2;
                super.label.x = myCheckBox.x + myCheckBox.width + 17;
                super.label.setActualSize(Math.max(unscaledWidth - super.label.x, 4), unscaledHeight);
            }
            if (myCheckBox.x + myCheckBox.width > unscaledWidth)
                myCheckBox.visible = false;
        }

        trace(label.width);
    }
}
}

我使用二维数组作为 ADG 的数据提供者。我的帖子: 如何在 Flex 中动态地将属性添加到现有数组中,与上述帖子相关联。

4

1 回答 1

1

我怀疑您还没有编写任何代码来根据数据设置复选框的默认状态。

通常,您的 itemRenderer 的 Checkbox 状态应作为数据的一部分存储。初始化 itemRenderer 时,根据数据元素中的属性将复选框设置为选中或不选中。单击复选框时;更改数据元素中的相同属性。

这种方法会将您的 itemRenderer 的显示状态与您的数据同步。

如果您想要更具体的答案,则必须共享一些代码,以便我们可以看到您在做什么。

于 2013-07-26T11:00:31.857 回答