문제

8개의 사용자 데이터 열로 채워지는 목록 보기가 있습니다.사용자에게는 자동 새로 고침을 활성화할 수 있는 옵션이 있습니다. 그러면 ListView가 지워지고 데이터베이스의 최신 데이터로 다시 채워집니다.

문제는 항목을 지우고 다시 채울 때 표시 영역이 목록의 맨 위로 다시 이동한다는 것입니다.그래서 2000번 항목 중 1000번 항목을 보고 있으면 해당 항목으로 다시 돌아가기가 매우 불편합니다.

기본적으로 제가 묻는 것은 현재 스크롤 거리(x 및 y)를 어떻게 얻은 다음 복원합니까?

도움이 되었습니까?

해결책

나는 얼마 전에 같은 문제를 겪었고 모델을 목록과 비교하기 위해 알고리즘을 구현하게되었으므로 변경된 요소 만 추가/제거했습니다. 큰 변화가 없다면 이런 식으로 목록은 처음으로 점프하지 않았습니다. 그리고 내가 달성하고자하는 가장 중요한 것은 효율성이었습니다 (목록이 깜박이 지 않도록).

다른 팁

나는 단지 버그 가기 ListView.topitem 속성을 필사적으로 사용하려는 사람들에게 정보를 제공하고 싶었습니다.

  1. ListView.endUpdate를 호출 한 후 TopItem 속성을 설정해야합니다
  2. ListView 컨트롤의 항목에는 텍스트 속성이 string.empty 이외의 다른 것으로 설정되어 있거나 속성이 작동하지 않아야합니다.
  3. ListView.topitem 설정 Null Reference 예외는 간헐적으로 발생합니다. 이 코드 라인을 항상 시도하십시오 ... 캐치 블록 안에 보관하십시오.

물론 ListView의 스크롤 바가 0으로 점프하고 상단 항목의 위치로 돌아갑니다. 이 문제에 대한 해결 방법을 찾으면이 질문을 업데이트하십시오.

다음을 성공적으로 사용했습니다.

int topItemIndex = 0;
try
{
     topItemIndex = listView1.TopItem.Index;
}
catch (Exception ex)
{ }
listView1.BeginUpdate();
listView1.Items.Clear();
//CODE TO FILL LISTVIEW GOES HERE
listView1.EndUpdate();
try 
{ 
    listView1.TopItem = listView1.Items[topItemIndex];
}
catch (Exception ex)
{ }

ListView의 TopItemIndex 속성은 귀하가 찾고있는 것이지만 VS2010 릴리스에서 해결해야 할 확인 된 버그가 있습니다. 확실하지 않음 (확인하지 않음).

어쨌든,이 작업을 수행하기위한 내 해결 방법은 다음과 같습니다.

listViewOutput.TopItemIndex = outputList.Count - 1;
listViewOutput.TopItemIndex = myNewTopItemIndex;

어떤 이유로 든 직접 설정하는 것은 직접 업데이트되지 않지만 마지막 항목으로 설정 한 다음 내가 원하는 항목으로 설정하면 안정적으로 작동합니다.

ListView.topitem 속성을보십시오. 목록에 위치를 포함 해야하는 색인이 있습니다. 새 목록에서 해당 인덱스를 찾아서 해당 항목에 topitem을 설정하면 자동으로 스크롤을 수행해야합니다.

불행히도 ListView의 정확한 위치로 스크롤하려면 약간의 인터 로프를 사용해야합니다. 사용 getscrollinfo WINAPI 기능 기존 스크롤 위치를 얻기 위해 문자 보내 위치로 스크롤합니다.

CodeProject의 기사에 이름이 붙어 있습니다 ListView가있는 그룹으로 스크롤합니다 솔루션을 안내 할 수 있습니다.

스크롤 위치 유지에 대한 솔루션 :

양식 수준 변수 :

private static int scrollSpot = 0;

내부 ListView 새로 고침 (예 : 타이머, 버튼)을 보려면 현재 지점을 저장합니다.

scrollSpot = this.listView1.TopItem.Index;
refreshTheForm();

내부에서 저장된 지점을 보여주는 내부에서 (메서드의 끝에 넣음) :

if (scrollSpot <= 1)
{
     listView1.Items[scrollSpot].Selected = true;
}
else
{
     listView1.Items[scrollSpot - 2].Selected = true;
}
listView1.TopItem = listView1.SelectedItems[0]; 

나는 일종의 같은 문제를 겪고있었습니다.매 1/2초마다 채우는 listView가 있고 TopItem을 인덱스 > 표시 항목인 ListItem으로 설정하면 목록이 topItem과 뒤로 2개 지점 사이를 이동했습니다.

따라서 문제를 해결하기 위해 EndUpdate 호출 후에 TopIterm을 설정했습니다.

lvB.EndUpdate();
lvI.EndUpdate();
lvR.EndUpdate();

if (lstEntryInts.Items.Count > 0)
    lstEntryInts.TopItem = lstEntryInts.Items[iTopVisIdx];
if (lstEntryBools.Items.Count > 0)
    lstEntryBools.TopItem = lstEntryBools.Items[iTopVisIdx];
if (lstEntryReals.Items.Count > 0)
    lstEntryReals.TopItem = lstEntryReals.Items[iTopVisIdx];​

내 테스트에서는 선택한 항목을 저장하기 위해 int를 사용했지만 토피 템이 필요하지 않았습니다. 또한 topitem은 view.tile 또는 view.largeicon을 사용하는 경우 예외가 발생합니다.

이 코드는 스크롤 막대를 움직이지 않습니다.

listView1.BeginUpdate();
listView1.Items.Clear();

// loop through your add routine
listView1.Items.Add(lvi);

listView1.EndUpdate();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top