2010-04-06 3 views
3

DataGrid가 있고 DataProvider를 내 데이터로 설정했습니다. 데이터가 변경되면 DataGrid가 선택된 행을 잃고 스크롤 막대가 위로 이동합니다. 선택 및 스크롤 위치를 어떻게 유지합니까?데이터가 변경 될 때 DataGrid에서 선택을 유지하는 방법은 무엇입니까?

+0

선택한 항목이 변경된 경우에도 선택한 위치를 유지 하시겠습니까? 또는 선택한 항목을 새 위치에 유지하더라도 유지 관리 하시겠습니까? – invertedSpear

답변

8

당신은 위치를 유지하려면 : 첫째

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

코드를 실행 선택된 인덱스

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

및 스크롤 위치를 캡처,

어떤에서 함수가 데이터를 변경됩니다 그러면 데이터가 변경되고 위의 단계가 거꾸로됩니다.

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

아, 선택한 색인이 DG에있는 항목의 길이를 초과하지 않았는지 확인하고 마지막 색인이 있으면 선택하십시오. 내 경험에 의하면 최대보다 큰 수직 스크롤 위치를 설정하면 최대 값으로 스크롤됩니다.

+0

새 dataProvider가 selectedItem을 다른 인덱스에 넣는 경우 어떻게됩니까? – Robusto

+0

그것은 .. 그 이유는 내가 OP의 의도 (항목을 유지하거나 색인을 유지)를 요청하려고했기 때문에'var myItem : Object = myDG '와 같은 것을 사용하여 아이템을 유지할 수 있다고 생각합니다. selectedItem;과'myDG.selectedItem = myItem;'하지만 나는 많은 테스트를 거치지 않고 그것을 어떻게 작동 시킬지 확신 할 수 없다. 그런 다음 스크롤 위치를 어떻게 든 찾아야합니다. 항목을 유지 관리하는 것이 훨씬 더 복잡합니다 :-) – invertedSpear

+0

내 목록의 항목 수가 변경되지 않고 관련 데이터만으로 충분할 것 같습니다. 감사. –

2

방법이 있습니다. DataGrid 클래스를 확장하고 String 속성 uniqueIdField를 추가해야합니다.

uniqueIdField의 vaule을 고유 한 데이터 집합의 개체 속성으로 설정합니다.

다음과 같이 set dataProvider 메소드를 대체하십시오. 열이 정렬되지 않으면이 메소드가 작동합니다. FIXED * 이제는 열을 정렬 할 때 올바른 행을 표시하지만 스크롤바가 값에 영향을 미치지 않습니다 (정렬에 영향을주는 속성 중 하나가 변경됨). *

아래 코드는 스크롤바를 올바른 위치로 설정합니다. (: 개체 값) : 보이드 { VAR의 vScroll :

오버라이드 기능 dataProvider의 공개 설정 INT = 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) 

{
var에 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; 
} 


} 

// 항목이 선택된 발견되었음을 통지 또는 null this.verticalScrollPosition = vScroll; dispatchEvent (새 ListEvent (ListEvent.변화));

관련 문제