2011-05-23 10 views
2

カスタムコンポーネント内にデータグリッドがあります。このDGは、そのデータプロバイダとしてネストされたオブジェクトを受け取り、そしてので、私のデータグリッドは次のようにレンダリングされます:DataGridの再レンダリング

<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> 

だから私は、ネストされたデータを表示するインラインのitemRendererを持っています。今、更新操作が発生すると、このデータグリッドを再設定する関数が呼び出されます。しかし、ネストされたデータdsntが表示される列には何も表示されません。

私はネットを検索しましたが、maybはこのコンポーネントの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(); 
      } 
     } 

私は本当に私はその関数内に置くSHLD何を知りません。私はupdateDisplayListの中の再配置機能を呼び出すべきですか?私はそれを試みましたが、それは仕事をdsnt ...

答えて

2

アイテムレンダラーのcreationCompleteイベントは、初期化時に1回だけ発生します。アイテムレンダラーがリサイクルしている限り、新しいデータはアイテムレンダラーには埋め込まれません。

あなたはそれを2つの方法で解決することができます:

  1. は、MXMLアイテムレンダラーを作成します。基本クラスがVBoxの場合は、これが最善のオプションです。したがって、データのバインディングを取り除いてデータの変更を自動的に設定できます。すべての役割を設定するには、{data.roles}をデータプロバイダとして使用し、ループの代わりにRepeaterコンポーネントを使用します。
  2. 2番目のオプションは、ActionScriptを使用し、UIComponentを基本クラスとして使用することです。この場合、override public function set data(value:Object):voidを無効にしてdata.rolescollectionChangeイベントを購読し、変更ハンドラからinvalidateDisplayList()に電話する限り、そこからinvalidateDisplayList()に電話する必要があります。その後、updateDisplayList()でデータをループし、すべてのコントロールを作成/作成する必要があります。第2の選択肢はあなたに良いパフォーマンスを与えることができますが、それは初心者のための良い方法ではありません。

したがって、バインディングでMXMLバージョンを使用することをお勧めします。

+0

なぜなら、私はRepeaterを使用できない理由は、data.rolesは配列の配列であり、動的インデックスを持っているからです...つまり、ロールの数はさまざまです。data [roles] [0] => array()、data [役割] [1] =>配列().. 0またはn個の役割があります..私はこの配列にアクセスするためにforループを使用する必要があります..あなたの2番目のオプションを詳述できますか?私は初心者ですが、多分私はいくつかのコードサンプルを表示することができます..? – Lin

関連する問題