2011-04-18 33 views
0

我的應用程序有一個帶有自定義項目渲染器的樹,該樹根據葉上的數據類型使用不同的組件作爲編輯器。在一種情況下,我嘗試使用數據網格,以便用戶可以選擇滿足其需求的行(需要顯示幾列),即。在概念上與ComboBox相似。Flex 3:Datagrid作爲項目編輯器過早獲取'itemEditEnd'

要做到這一點,我有一個函數被分配爲'itemEditBegin'(樹)的處理程序,我在其中動態創建數據網格,然後使用彈出窗口管理器將其顯示爲(模態)彈出窗口。到現在爲止還挺好。但是,如果你點擊任何地方(例如,向下滾動datagrid中的按鈕)彈出消失,因爲itemEditEnd事件被觸發 - 爲什麼?!

在另一種情況下,我有一個DateField設置作爲編輯器,用戶可以點擊圖標來調出DateChooser,滾動瀏覽月份等。我查看了這個代碼,它使用一個彈出窗口,看起來和我的代碼完全一樣!

這裏是「itemEditBegin」代碼:

​​

其中「這個」是由樹渲染器行所使用的組件。這是樹組件的'itemEditEnd'處理程序,只要點擊數據網格內的任何內容(例如,一行,向下滾動按鈕,列分隔符等),該處理程序就會被調用。

任何想法的人?

謝謝,

邁克。

回答

1

最終我找到了一個解決方案,可以解決這個問題。簡單地在行中添加:

dataGrid.owner = this; 

解決了過早的itemEditEnd事件問題。然而,現在我遇到了相反的問題,在我點擊樹的另一行之前itemEditEnd事件不會被觸發!

我在datagrid上有一個'item clicked'監聽器,當其中一個值被點擊時會銷燬datagrid,但是這樣做並不會導致底層樹行的itemEditEnd事件觸發。我在文檔中看到失去焦點的組件導致它,所以我派出了我自己的'FocusEvent.FOCUS_OUT'事件 - 沒有什麼好處。

如果我手動將焦點更改爲底層樹,itemEditEnd事件會觸發並且一切都很好,但是必須將樹的引用傳遞給樹渲染器的行對象似乎有點笨拙!

任何人有更好的點子嗎?

感謝,

邁克

2

我想我必須看到代碼,或者在實際工作中才能完全理解。這聽起來像是當您將DataGrid用作itemEditor時,各個DataGrid列可以編輯。那是對的嗎?

當您關注DataGrid中的itemEditor時,它將觸發itemEditEnd事件。你的樹必須以某種方式對此作出反應。嘗試停止DataGrid類中的事件傳播。從概念上講是這樣的:

<mx:DataGrid> 
<mx:Script> 
    public function oItemEditEnd(event:DataGridEvent):void{ 
    event.stopPropogation(); 
    } 
</mx:Script> 
<mx:columns> 
    <mx:DataGridColumn itemEditEnd="onItemEditEnd(event)"> 
    <mx:DataGridColumn itemEditEnd="onItemEditEnd(event)"> 
</mx:columns> 
</mx:DataGrid> 

如果你這樣做,你將不得不做一些事情弄清楚當用戶完成編輯和手動關閉的itemEditor。

有關stopPropogation().的更多信息。還請查看stopImmediatePropogation()。我不確定你需要哪一個,因爲它取決於代碼的結構。

+0

嗨,感謝您的回答。實際上這些列是不可編輯的 - 我在原始問題中添加了一些代碼。一旦DataGrid中的任何內容被點擊,樹的itemEditEnd就會觸發。順便說一句,如果datagrid永遠觸發'itemEditeEnd',樹會對它做出反應嗎?乾杯,邁克 – Nic 2011-04-18 14:12:36