2011-05-24 49 views
0

我有一個有兩個內聯項目渲染器的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負責調用,更新數據庫的遠程功能。

+0

感謝..我有 – Lin 2011-05-24 10:08:07

+0

你能與itemremderers一起發表您的DataGrid的代碼? – 2011-05-24 15:08:20

+0

我已經更新了我的原始文章與DG代碼.. – Lin 2011-05-25 07:24:04

回答

0

不確定這是否有幫助,需要查看您的代碼才能確定地說出來。但是如果你想在DataGrid重畫,不叫

invalidateDisplayList() 

代替,叫

invalidateList() 
+0

謝謝,但我也試過:( – Lin 2011-05-25 07:24:26