2013-07-24 49 views
0

下面的代碼工作:滾動AdvancedDataGrid保持項鑑於

項目渲染:

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { 
    super.updateDisplayList(unscaledWidth, unscaledHeight); 
    if(editMode) 
     dispatchEvent(new Event("editLayoutChange")); 
} 

Datagrid的(對於 「editLayoutChange」 事件處理函數 - 「視口」 是在AdvancedDataGrid):

public function editLayoutChange(event : Event) : void { 
    var viewportTopLeft : Point = viewport.localToGlobal(new Point(0,0)); 
    var viewportBottom : Number = viewportTopLeft.y + viewport.height; 
    var rendererTopLeft : Point = Container(event.target).localToGlobal(new Point(0,0)); 
    var rendererBottom : Number = rendererTopLeft.y + Container(event.target).getLayoutBoundsHeight(); 

    var offset : Number = rendererBottom - viewportBottom; 

    if(offset > 0) { 
     // Typical item height is 21px 
     var itemHeight : Number = 21; 
     matrix.verticalScrollPosition += Math.ceil(offset/itemHeight); 
    } 
} 

但我不確定重寫updateDisplayList是最乾淨的實現,因爲它發射了很多。我嘗試調度「editLayoutChange」事件以響應項目渲染器上的「調整大小」事件,但我看到的確很不穩定。有沒有更好的選擇派發此事件比updateDisplayList?

編輯 - 我正在偵聽updateDisplayList,因爲渲染器在進入編輯模式時將更改大小(增大),並且可以在編輯期間動態擴展。

回答

0

通常的方法來做這種事情是從commitProperties派遣 -

在您的渲染:

private var _editModeEntered:Boolean = false; 

private var _editMode:Boolean; 
public function set editMode(value:Boolean):void { 
    _editMode = true; 
    _editModeEntered = true; 
    invalidateProperties(); 
} 
// probably want a getter for editMode too 

override protected function commitProperties():void { 
    super.commitProperties(); 
    if (_enteredEditMode) { 
     dispatchEvent(new Event("editLayoutChange")); 
     _enteredEditMode = false; 
    } 
} 

這將確保只有當你已經改變editMode顯式的事件被調度。

+0

的問題是,在目前「編輯模式」的轉變,渲染尚未調整,所以這是不可能進行佈局opertions還。此外,在編輯模式激活後,渲染器的大小可能會稍後更改。 – NTyler

0

您可以使用高級數據網格公共API scrollToIndex(index)滾動到該行