2009-06-27 2 views
2

백그라운드 스레드에서 ListViewItems 배열을 만들고 UI 목록에 ListView를 채 웁니다. 문제는 배열이 너무 크면 목록 뷰가 업데이트되는 동안 ui가 차단된다는 것입니다.차단하지 않고 많은 정보를 listview에 채우는 방법?

UI에 작은 영향을주는 listview를 채우는 방법이 있습니까?

+0

Winforms 또는 WPF? –

답변

8

많은 데이터가있는 경우 ListView 컨트롤의 VirtualMode 속성을 true으로 설정하여 가상 모드에서 사용할 수 있습니다. 즉, ListView는 기존의 방식으로 채워지지 않지만 항목이 표시 될 때 정보를 작은 청크로 목록보기에 전달하는 이벤트 처리기를 연결합니다.

아주 간단한 예 :

private List<string> _listViewData = new List<string>(); 
private void toolStripButton1_Click(object sender, EventArgs e) 
{ 
    _listViewData = GetData(); // fetch the data that will show in the list view 
    listView1.VirtualListSize = _listViewData.Count; // set the list size 
} 
// event handler for the RetrieveVirtualItem event 
private void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) 
{ 
    if (e.ItemIndex >= 0 && e.ItemIndex < _listViewData.Count) 
    { 
     e.Item = new ListViewItem(_listViewData[e.ItemIndex]); 
    } 
} 

는 또한 CacheVirtualItems 이벤트를 사용으로 보일 것입니다.

0

또한 사용할 수 있습니다 위해 BeginUpdate와 endUpdate 메소드 방법

listView1.BeginUpdate(); 
    //Add Values 
    listView1.EndUpdate(); 
0

내 의견은 아주 오랫동안 가지고, 그래서 나는이 별도의 포스트하기로 결정했다.

먼저 +1을 Fredrik Mörk에게 사용하려면 VirtualMode을 사용하는 것이 좋습니다. 그러나 일부 기능이 손실됩니다. 열 자동 크기 조정 및 정렬이 더 쉽게 처리됩니다.

문제가 발생하면 작업자 스레드에서 채우기가 소리를 유혹 할 수 있습니다. 그러나 목록 컨트롤 (즉, 항상 항상 메인 스레드)을 소유하고있는 스레드에서 채우기가 계속 발생합니다. .NET에서는 (Begin)Invoke을 사용하도록 설정하여 표시합니다. 또한 컨텍스트 스위치를 사용하면 하나씩 채우는 경우 모든 항목을 채우는 데 필요한 총 시간이 눈에 띄게 증가하므로 청크를 채우고 싶을 수 있습니다 (한 번에 50 개의 항목을 말하거나 20 개까지 채울 수 있습니다). 밀리 초). 컨텐츠가 변경 될 때 필요한 추가 동기화를 추가하면별로 좋지 않은 결과를 얻을 수있는 매우 복잡한 솔루션이 생깁니다.

관련 문제