我有一個有兩個內聯項目渲染器的datgrid。 DG的數據提供者是一個嵌套對象(對象內的對象,即三層)。Datagrid和內聯項目渲染器問題
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個呈示(每個數據網格列),它們分別環救援人員到場的第二級object1和2(第2級的對象是對象的一個動態數組,在該物體的保持內改變數)。
在項目渲染器中,我使用foreach循環第二級對象,然後顯示數據。該數據是一個鏈接按鈕,當點擊該鏈接按鈕時,調用遠程對象功能從數據庫中刪除數據。
現在對遠程對象函數調用的結果事件,我調用重新填充DG的函數,以便顯示更新的數據。
當我點擊第一行的linkbutton時,後端工作得很好(數據從數據庫中刪除,刷新的數據被髮回),但由於某種原因,刪除的數據突然出現在第二行行。
當我從第二行刪除它時,它出現在第三行(後端沒有任何反應,因爲數據已被刪除)。等等,直到出現在最後一行然後DG看起來就像它在第一次刪除之後所看到的一樣。
這只是開始。第二項渲染器還會顯示一個鏈接按鈕,當點擊該鏈接按鈕時,會在前一列(可以刪除該數據的那一列)中顯示該數據。當我點擊第一行,數據被添加到第二行的前一列..等等。
基本上,我的DG的行爲真的很奇怪。我重寫了項目渲染器中的設置數據函數以重新設置數據並調用其invalidateDisplayList。每次刷新後我還會調用Datagrid的invalidateDisplayList函數。行爲保持不變。
請幫我在這...
這裏是我的DB代碼:
<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負責調用,更新數據庫的遠程功能。
感謝..我有 – Lin 2011-05-24 10:08:07
你能與itemremderers一起發表您的DataGrid的代碼? – 2011-05-24 15:08:20
我已經更新了我的原始文章與DG代碼.. – Lin 2011-05-25 07:24:04