Проблема с сеткой данных и встроенным элементом - PullRequest
0 голосов
/ 24 мая 2011

У меня есть сетка данных с двумя встроенными средствами визуализации элементов. Поставщик данных для моей DG является вложенным объектом (объекты внутри объектов внутри объектов, т.е. 3-уровневые).

Main Object - 1st Level
                      |
          2nd Level Object 1
                            |
                        3rd level object '1' => ('name'=>somename,'id'=>someid)
                        3rd level object '2'
                           .
                           .
                           .
                           .
                        3rd level object 'n'
         2nd Level Object 2
                            |
                        3rd level object '1' => ('name'=>somename,'id'=>someid)
                        3rd level object '2'
                           .
                           .
                           .
                           .
                        3rd level object 'n'

Я использую 2 средства визуализации элементов (по одному для каждого столбца таблицы данных), которые циклически перебрасываются на объекты 2-го уровня 1 и 2 соответственно (объект 2-го уровня представляет собой динамический массив объектов, в котором количество объектов в них постоянно меняется).

В средстве визуализации элементов я зацикливаюсь на объекте 2-го уровня, используя foreach, и затем отображаю данные. Данные представляют собой кнопку ссылки, которая при нажатии вызывает функцию удаленного объекта для удаления данных из базы данных

Теперь по событию результата вызова функции удаленного объекта, я вызываю функцию для повторного заполнения DG, чтобы отображались обновленные данные.

Когда я нажимаю на кнопку ссылки в первой строке, бэкэнд работает отлично (данные удаляются из базы данных, а обновленные данные отправляются обратно), но по какой-то причине удаленные данные внезапно появляются во 2-й строке .

Когда я удаляю его из второй строки, он появляется в 3-й строке (в бэкэнде ничего не происходит, поскольку данные уже удалены) ... и так далее, пока он не появится в последней строке, а затем DG выглядит точно как это выглядело после первого удаления.

Это только начало. Второе средство визуализации элементов также отображает кнопку ссылки, которая при нажатии отображает эти данные в предыдущем столбце (тот, где эти данные могут быть удалены). Когда я нажимаю на 1-ую строку, данные добавляются в предыдущий столбец второй строки ... и т. Д. *

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

Пожалуйста, помогите мне в этом ...

Вот мой код БД:

<mx:DataGrid id="privilegesDG" width="100%" variableRowHeight="true" minHeight="500">
<mx:columns>
<mx:DataGridColumn headerText="Roles Assigned">
    <mx:itemRenderer>
    <fx:Component>
        <mx:VBox creationComplete="box1_creationCompleteHandler()">
        <fx:Script>
        <![CDATA[
            import com.pm.modules.events.UpdateDBEvent; 

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

            override public function set data(value:Object):void{
                super.data = value; 
                super.invalidateDisplayList();
            }   

            protected function box1_creationCompleteHandler():void
            {
            for each(var temp:Object in data.roles){
                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.id = temp.rid.toString();
                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,event.target.id,0,true));
                                    }
                                ]]>
                            </fx:Script>
                        </mx:VBox>
                    </fx:Component>
                </mx:itemRenderer>
            </mx:DataGridColumn>
            <mx:DataGridColumn headerText="Roles Not Assigned">
                <mx:itemRenderer>
                    <fx:Component>
                        <mx:VBox creationComplete="box1_creationCompleteHandler()">
                            <fx:Script>
                            <![CDATA[
                                import com.pm.modules.events.UpdateDBEvent;

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

                                override public function set data(value:Object):void{
                                    super.data = value; 
                                    super.invalidateDisplayList();
                                } 

                                protected function box1_creationCompleteHandler():void
                                {
                                    for each(var temp:Object in data.notroles){                                         
                                        var lb:LinkButton = new LinkButton();
                                        lb.label = temp.rname;
                                        lb.id = temp.rid.toString();
                                        lb.addEventListener(MouseEvent.CLICK,handleClick);

                                        this.addElement(lb);
                                    }
                                }

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

updateDBEvent отвечает за вызов удаленной функции, которая обновляет БД.

1 Ответ

0 голосов
/ 24 мая 2011

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

invalidateDisplayList()

, а звоните

invalidateList() 
...