2009-07-31 52 views
0

由於性能不佳的原因,DataGrid將緩存複選框並將其重用於不同的行。如果你有50行,它不會創建50個複選框。它會創建儘可能多的複選框,另外還有一些用於填充的複選框,然後在滾動時重複使用它們。這就是爲什麼你需要明確管理他們的狀態。 如何改善?如何固定複選框的值?我使用複選框像下面,但不列入複選框記住值如何在使用itemrenderer和datagrid時改進datagrid性能?

<mx:DataGrid id="calamount"dataProvider="{xml_coupon.lastResult.Teamcoupon.match_details}" variableRowHeight="true"> 
<mx:columns> 
    <mx:DataGridColumn headerText="1" rendererIsEditor="true" editorDataField="selected"> 
    <mx:itemRenderer> 
    <mx:Component> 
    <mx:HBox verticalAlign="middle" paddingLeft="2"> 
    <mx:CheckBox id="checkbox1" selected="{outerDocument.checkedAll}" click="{data.check1=checkbox1.selected;outerDocument.calcValues()}"/> 
    </mx:HBox> 
    </mx:Component> 
    </mx:itemRenderer> 
    </mx:DataGridColumn> 
</mx:columns> 

回答

1

我不知道我完全理解你的問題,但如果你正在尋找各種方法來改善您的自定義項目渲染器的性能我會從他的博客上閱讀Alex Harui的優秀博文開始。具體而言,對性能的部分:

性能

當設計自定義項呈示,你應該保持性能的初衷。雖然採用Canvas,HBox或VBox可以簡單快捷地將幾個組件放在裏面並且有一個渲染器,但請記住,容器真的很大且很慢,並且如果要在DataGrid中顯示大量容器,你可能會遇到性能問題。我們通常不會看到它們,因爲我們是在真正快速的機器上開發的,但是您必須考慮最終用戶的硬件類型。所以,如果屏幕上會出現超過6個,我不鼓勵在自定義項目渲染器中使用mx.containers中的任何容器。除非在渲染器中放置超過三個或四個小部件,否則以UIComponent開始並僅編寫一些邏輯來將組件佈置在正確的位置上會更快。來自mx.containers的容器還考慮了延遲實例化邏輯,滾動條,裁剪以及一些您可能不需要在渲染器中使用的其他內容。

這就是爲什麼您會看到所有示例都使用ActionScript而不是MXML。是的,這意味着你不能使用FlexBuilder來編寫渲染器,是的,其中一些例子可以在MXML中完成,但MXML很容易做到生成額外的代碼,而這些代碼可能不需要。您會注意到,出於同樣的原因,在這些示例中我不使用數據綁定。它實際上有點浪費(雖然非常方便),對不會改變或僅改變一次或兩次的內容使用綁定。相反,我在初始化事件上設置了數據提供者(如果我使用了HTTPService,將會在結果事件上這樣做)。 (1)

0

你的意思是說你的複選框沒有記住這些值嗎?你必須確保你的項目渲染器數據驅動。

<mx:CheckBox selected="{data.someBooleanProperty}"/> 

這樣當你滾動時,它會確保它們被正確選中/取消選中。

+0

我嘗試 但stil複選框不記住值?如果我在DataGrid中滾動滾動條,然後複選框選中也檢查 – 2009-08-01 09:43:54

0

您正在將複選框selected屬性綁定到錯誤的東西。它應該綁定到data.check1(很好的暗示名稱),由您的click事件處理程序中的代碼來判斷。順便說一下,這應該是「更改」事件,因爲當您按下ENTER或空格鍵並且它具有焦點時,您可以更改複選框的值,並且在這種情況下您不會獲得單擊事件。