Пересчет DataGrid - PullRequest
       7

Пересчет DataGrid

2 голосов
/ 23 мая 2011

У меня есть сетка данных в пользовательском компоненте.Этот DG принимает вложенный объект в качестве провайдера данных, и моя сетка данных отображается следующим образом:

<mx:DataGrid id="privilegesDG" dataProvider="{privArray}" width="100%" variableRowHeight="true">
        <mx:columns>
            <mx:DataGridColumn dataField="Name" />
            <mx:DataGridColumn dataField="Alias" />
            <mx:DataGridColumn headerText="Roles Assigned" dataField="roles">
                <mx:itemRenderer>
                    <fx:Component>
                        <mx:VBox creationComplete="box1_creationCompleteHandler(event)">
                            <fx:Script>
                                <![CDATA[
                                    import com.pm.modules.events.UpdateDBEvent;

                                    import mx.containers.HBox;
                                    import mx.controls.Label;
                                    import mx.controls.LinkButton;
                                    import mx.events.FlexEvent;

                                    [Bindable]private var prID:int;
                                    protected function box1_creationCompleteHandler(event:FlexEvent):void
                                    {
                                        for each(var temp:Object in data.roles){
                                            prID = temp.rid;
                                            var hgrp:HBox = new HBox();
                                            hgrp.autoLayout = false;

                                            var lbl:Label = new Label();
                                            lbl.text = temp.rname;

                                            var lb:LinkButton = new LinkButton();
                                            lb.label = 'X';
                                            lb.focusEnabled = true;
                                            lb.addEventListener(MouseEvent.CLICK,handleClick);

                                            hgrp.addElement(lbl);
                                            hgrp.addElement(lb);

                                            this.addElement(hgrp);
                                        }
                                    }

                                    protected function handleClick(event:MouseEvent):void{
                                        dispatchEvent(new UpdateDBEvent(UpdateDBEvent.ON_DELETE_PRIVILEGE_ROLE_MAP,0,0,0,prID,0,true));
                                    }
                                ]]>
                            </fx:Script>
                        </mx:VBox>
                    </fx:Component>
                </mx:itemRenderer>
            </mx:DataGridColumn>
        </mx:columns>
    </mx:DataGrid>

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

Я искал в сети и обнаружил, что, может быть, я вызову функцию updateDisplayList для этого компонента?

Итак, я попробовал smthingкак это:

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
            super.updateDisplayList(unscaledWidth,unscaledHeight);
        }


        protected function handleResult(event:ResultEvent):void{
            if(event.result.toString() == 'false')
                Alert.show("Could not perform operation");
            else{
                RO.getPrivilegesAndRoles(); //re-populates DG
                invalidateDisplayList();
            }
        }

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

1 Ответ

2 голосов
/ 23 мая 2011

Событие creationComplete вашего средства визуализации элементов происходит только один раз при инициализации.Поскольку средства визуализации элементов перерабатывают, новые данные не будут заполняться в вашем устройстве визуализации элементов.

Вы можете решить это двумя способами:

  1. Создать средство визуализации элементов MXML.Поскольку его базовый класс VBox, это лучший вариант здесь.Таким образом, вы можете избавиться от привязки данных, чтобы автоматически вносить изменения в данные.Чтобы заполнить все роли, используйте компонент Repeater вместо цикла, используя {data.roles} в качестве поставщика данных.
  2. Второй вариант заключается в использовании ActionScript и UIComponent в качестве базового класса.В этом случае вы должны переопределить override public function set data(value:Object):void и вызвать invalidateDisplayList() оттуда, чтобы подписаться на событие data.roles collectionChange и также вызвать invalidateDisplayList() из обработчика изменений.Затем в updateDisplayList() вы должны зациклить ваши данные и создать / заполнить все элементы управления.Второй вариант может дать вам лучшую производительность, но он не подходит для новичков.

Поэтому я рекомендую вам использовать версию MXML с привязкой.

...