У меня есть сетка данных с двумя встроенными средствами визуализации элементов. Поставщик данных для моей 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 отвечает за вызов удаленной функции, которая обновляет БД.