2011-08-05 11 views
2

状況は次のとおりです。
データグリッドがあり、データグリッドのselectedItemを使用してフォームをインライン(同じy位置)に移動したいとします。選択した項目がキーボードイベントで変更される可能性があるため、mouseClickイベントに依存することはできません。 DataGridにitemRendererはありません。単純な古いdataFieldです。
これまでに誰でもこれをしましたか?DataGridのグローバルy座標を取得しようとしました。

Jacobの答えに基づいて興味のあるすべての人々のためのいくつかの抜粋されたコード例です。

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       minWidth="955" minHeight="600"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.events.FlexEvent; 
      import mx.events.ListEvent; 
      import mx.formatters.DateFormatter; 

      [Bindable] public var ac_POitems:ArrayCollection = new ArrayCollection(); 
      [Bindable] public var selectedY:int; 

      protected function dg_POitems_creationCompleteHandler(event:FlexEvent):void 
      { 
       //TODO 
      } 

      protected function submit_clickHandler(event:MouseEvent):void 
      { 
       //TODO 
      } 

      protected function format_sqlite_date(item:Object, col:DataGridColumn):String 
      { 
       var df:DateFormatter = new DateFormatter(); 
       df.formatString = "MM/DD/YYYY"; 
       var value:Object = item[col.dataField]; 
       return df.format(value); 
      } 

      protected function dg_POitems_changeHandler(event:ListEvent):void 
      { 
       trace(event.itemRenderer.y); 
       selectedY = event.itemRenderer.y; 
      } 
     ]]> 
    </fx:Script> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 

    <mx:VBox width="100%" height="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"> 
     <mx:DataGrid id="dg_POitems" dataProvider="{ac_POitems}" creationComplete="dg_POitems_creationCompleteHandler(event)" 
        editable="true" height="100%" change="dg_POitems_changeHandler(event)"> 
      <mx:columns> 
       <mx:DataGridColumn headerText="Consumer" dataField="consumer" editable="false"/> 
       <mx:DataGridColumn headerText="Description" dataField="description" width="300" editable="false"/> 
       <mx:DataGridColumn headerText="Amount" dataField="item_cost" editable="false" width="55"/> 
       <mx:DataGridColumn headerText="Service Date" dataField="service_date" labelFunction="format_sqlite_date"/> 
       <mx:DataGridColumn headerText="Invoice Date" dataField="invoice_date" labelFunction="format_sqlite_date"/> 
       <mx:DataGridColumn headerText="Paid Date" dataField="payment_received" labelFunction="format_sqlite_date"/> 
      </mx:columns> 
     </mx:DataGrid> 
    </mx:VBox> 
    <mx:Form id="form_POItemDateEditor" label="{dg_POitems.selectedItem.consumer}" x="{dg_POitems.x + dg_POitems.width + 10}" 
      y="{selectedY + 10}" visible="{dg_POitems.selectedItem}" borderColor="#ffffff"> 
     <s:Label text="edit {dg_POitems.selectedItem.consumer}" width="100%" textAlign="center" verticalAlign="middle" fontWeight="bold" textDecoration="underline"/> 
     <mx:FormItem label="Service Date"> 
      <mx:DateField id="service_date"/> 
     </mx:FormItem> 
     <mx:FormItem label="Invoie Date"> 
      <mx:DateField id="invoice_date"/> 
     </mx:FormItem> 
     <mx:FormItem label="Paid Date"> 
      <mx:DateField id="payment_received"/> 
     </mx:FormItem> 
     <mx:FormItem> 
      <s:Button id="submit" label="Submit" click="submit_clickHandler(event)"/> 
     </mx:FormItem> 
    </mx:Form> 
</s:Application> 
+0

をしたい、まさにそれを受け入れるための答えをチェックすることを忘れてはいけないための完全なコードを見つけることができます。あなたの評判にも良いことです。 –

答えて

1

これは、あなたが始めるのに役立つはずです。

<fx:Script> 
    <![CDATA[ 
     import mx.events.ListEvent; 
     protected function datagrid1_changeHandler(event:ListEvent):void 
     { 
      trace(event.itemRenderer.y); 

     } 

    ]]> 
</fx:Script> 

<mx:DataGrid dataProvider="{steps}" change="datagrid1_changeHandler(event)" > 
    .... 

編集spark:ListvalueCommitイベントのリスナーを表示

protected function valueCommitHandler(event:FlexEvent):void 
    { 
     trace(event.currentTarget.layout.getElementBounds(list.selectedIndex)); 
    } 
+0

Jacob ...ありがとう!私はあなたの提案に基づいて、いくつかのサンプルコードを投稿します。 – smattmyers

1

DisplayObject'slocalToGlobal機能を見てください。 ItemRendererの 'y'位置(親コンテナ、おそらくList)をグローバル(yステージ)の位置に変換することができます。

globalToLocalは逆の動作を行います。

ここからいくつかの計算を追加する必要がありますが、それらはアプリケーションの表示階層の外観に依存するため、それ以上は具体的ではありません。

1
+0

私は小さなサンプルを調理し、それを行うためにSpark List(またはDataGrid)を使用していました。 ITEM_CLICKイベントがなくなったため、クリックされたItemRendererを保持するのはもっと難しくなります。その問題に関するアイデアは? – RIAstar

+0

@RIAstarは、 'valueCommit'イベントを使用します。 –

+0

そして、IndexChangeEvent.CHANGEには、ItemRendererへの参照がありません(ListEvent.CHANGEが持っていた)。 – RIAstar

関連する問題