2011-08-05 70 views
2

這裏的情況:
我有一個填充的數據網格,我想移動一個窗體與datagrid的selectedItem內聯(相同的y位置)。我不能依賴mouseClick事件,因爲所選項目可能隨鍵盤事件而改變。 datagrid沒有itemRenderer,只是普通的舊數據字段。
以前有人做過這個嗎?試圖獲取數據網格的全局y座標selecteditem

下面是一些根據雅各布的答案感興趣的人的示例代碼。

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

你可以找到完整的代碼正是你想要在這裏http://flexdiary.blogspot.com/2009/11/flex-template-component.html

+0

我正在做一個小例子,並使用Spark List(或DataGrid)來做到這一點。因爲不再有ITEM_CLICK事件,所以暫時保留被點擊的ItemRenderer會困難得多。關於這個問題的任何想法? – RIAstar

+0

@RIAstar使用'valueCommit'事件。 –

+0

而IndexChangeEvent.CHANGE不再具有對ItemRenderer的引用(如ListEvent.CHANGE所用)。 – RIAstar