Флажок рендеринга в сетке данных - PullRequest
0 голосов
/ 18 декабря 2009
<mx:DataGrid id="dg" dataProvider="{cNumbersList}">
    <mx:columns>
        <mx:DataGridColumn dataField="contactName" headerText="Name" width="50"/>
        <mx:DataGridColumn dataField="contactNo" headerText="ContactNo" width="40"/>
        <mx:DataGridColumn  headerText="Select Contact Number" width="20">
            <mx:itemRenderer>
                <mx:Component>enter code here
                    <mx:CheckBox selected="false" />            
                </mx:Component>                        
            </mx:itemRenderer>                     
        </mx:DataGridColumn>                       
    </mx:columns>
</mx:DataGrid>  

Как собрать все отмеченные элементы в еще один новый массив? PLZ, помогите мне кому-нибудь

Ответы [ 2 ]

1 голос
/ 18 декабря 2009

Мы хотели, чтобы в сетке данных был установлен флажок, разрешающий множественный выбор. Мы расширили объект DataGrid:

package obj
{
import mx.controls.DataGrid;
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import mx.controls.CheckBox;
import mx.controls.listClasses.IListItemRenderer;

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
    {
        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:

package obj
{
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

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

Тогда на вашей флеш-странице:

<obj:CheckboxDataGrid id="notificationsCheckboxGrid"
dataProvider="{_myModel._grid}"
allowMultipleSelection="true"
showHeaders="false"                            
change="emailAddressesSelected()">
<qmsAdmin:columns>                                     
    <mx:DataGridColumn width="20" sortable="false" itemRenderer="CheckBoxRenderer"/>
    <mx:DataGridColumn width="150" dataField="email"/>
    <mx:DataGridColumn dataField="notificationType"/>
</qmsAdmin:columns>     
</obj:CheckboxDataGrid>

Обратите внимание на метод изменения "emailAddressesSelected ()". Вызывает этот метод:

private function emailAddressesSelected():void
{
_emailAddressIndexesSelected = notificationsCheckboxGrid.selectedIndices;
}

_emailAddressIndexesSelected - это просто объект Array в классе, определенном как:

private var _emailAddressIndexesSelected:Array;
0 голосов
/ 18 декабря 2009

Вы можете поместить дополнительное поле в свой класс контактов - «выбранный» или «отмеченный» - и использовать itemRenderer, чтобы установить это значение при изменении флажка. Затем вы можете просто перебрать данные вашего провайдера данных и посмотреть, какие из них проверены.

Вы можете сделать это:

<mx:Component>
   <mx:CheckBox id="contactCheckBox" selected="{data.contactSelected}" change="data.contactSelected = contactCheckBox.selected"/>            
</mx:Component>     

Рендереры получают контакт в качестве его данных. Я не проверял это, но в принципе это должно работать. Дайте мне знать, если возникнут проблемы с кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...