2010-04-06 85 views
3

我有一個DataGrid,我將DataProvider設置爲我的數據。當我的數據發生變化時,DataGrid會丟失選定的行,滾動條跳回頂部。我如何保持選擇和滾動位置?如何在數據更改時維護DataGrid中的選擇?

+0

您是否希望保持所選位置,即使所選項目改變了?或者你是否想維護選定的項目,即使它處於新的位置? – invertedSpear 2010-04-06 15:46:56

回答

8

如果你只是想保持倉位:

在任何

功能改變數據,第一個捕捉到選定的指數

var myidx:int = new int(myDG.selectedIndex); 

和滾動位置

var myVertPos:int = new int(myDG.verticalScrollPosition); 

運行代碼改變數據,然後向上進行倒退:

myDG.selectedIndex = myidx; 
myDG.verticalScrollPosition = myVertPos; 

哦,你可能會想做一個檢查,以確保所選擇的索引不會超過DG中現在項目的長度,並選擇最後一個。根據我的經驗,設置大於最大值的垂直滾動位置只會導致滾動到最大值。

+0

如果新的dataProvider將selectedItem放入不同的索引中,這可能會如何工作? – Robusto 2010-04-06 16:25:28

+0

它不..這就是爲什麼我試圖問OP的意圖(維護項目,或維護索引)我想你可能可以通過使用'var myItem:Object = myDG'來維護該項目。 selectedItem;'和'myDG.selectedItem = myItem;'但我不知道如何在沒有大量測試的情況下解決這個問題。然後,您需要以某種方式找到滾動位置......維護該項目要複雜得多:-) – invertedSpear 2010-04-06 17:40:43

+0

由於我列表中的項目數量沒有變化,因此這似乎工作得很好,只是關聯的數據。謝謝。 – 2010-04-06 18:15:43

2

有一種方法。您需要擴展DataGrid類並添加一個String屬性uniqueIdField。

將uniqueIdField的值設置爲數據集中唯一對象的屬性。

然後覆蓋設置的dataProvider方法如下: 這將工作,如果列沒有排序。修復* 我現在遇到這樣的問題,即當列對正確的行高亮進行排序,但滾動條不會變爲該值(因爲它影響排序的屬性之一已更改)。 *

下面的代碼將滾動條設置到正確的位置。

覆蓋公共功能設置的dataProvider(值:對象):無效 { VAR VSCROLL:= 0; //檢查是否我們重新選擇先前選擇的項目 //如果(uniqueIdField.length> 0 & &將selectedItem!= NULL)保存當前現在的位置是 { uniqueIdData = this.selectedItem [uniqueIdField]; vScroll = this.verticalScrollPosition; }

super.dataProvider = value;

 if(uniqueIdField.length > 0 
     && uniqueIdData != null 
     && selectedItems.length <= 1) 

{
變種currentObj:對象; var found:Boolean = false;

if(dataProvider is ArrayCollection) 
{ 

//find object in dataprovider 
for(var i:int=0; i < dataProvider.length; i++) 
{ 
    currentObj = dataProvider.getItemAt(i); 
    if(currentObj[uniqueIdField] == uniqueIdData) 
    { 
    this.selectedItem = currentObj; 
    found = true; 
    vScroll = this.selectedIndex; 
    break; 

    } 
} 

if(!found) 
{ 
    this.selectedItem = null; 
    uniqueIdData = null; 
} 


} 

//通知該項目已經被選擇,發現或空 this.verticalScrollPosition = VSCROLL; dispatchEvent(new ListEvent(ListEvent。更改));

}

相關問題