백그라운드 스레드에서 ListViewItems 배열을 만들고 UI 목록에 ListView를 채 웁니다. 문제는 배열이 너무 크면 목록 뷰가 업데이트되는 동안 ui가 차단된다는 것입니다.차단하지 않고 많은 정보를 listview에 채우는 방법?
UI에 작은 영향을주는 listview를 채우는 방법이 있습니까?
백그라운드 스레드에서 ListViewItems 배열을 만들고 UI 목록에 ListView를 채 웁니다. 문제는 배열이 너무 크면 목록 뷰가 업데이트되는 동안 ui가 차단된다는 것입니다.차단하지 않고 많은 정보를 listview에 채우는 방법?
UI에 작은 영향을주는 listview를 채우는 방법이 있습니까?
많은 데이터가있는 경우 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
이벤트를 사용으로 보일 것입니다.
또한 사용할 수 있습니다 위해 BeginUpdate와 endUpdate 메소드 방법
listView1.BeginUpdate();
//Add Values
listView1.EndUpdate();
내 의견은 아주 오랫동안 가지고, 그래서 나는이 별도의 포스트하기로 결정했다.
먼저 +1을 Fredrik Mörk에게 사용하려면 VirtualMode
을 사용하는 것이 좋습니다. 그러나 일부 기능이 손실됩니다. 열 자동 크기 조정 및 정렬이 더 쉽게 처리됩니다.
문제가 발생하면 작업자 스레드에서 채우기가 소리를 유혹 할 수 있습니다. 그러나 목록 컨트롤 (즉, 항상 항상 메인 스레드)을 소유하고있는 스레드에서 채우기가 계속 발생합니다. .NET에서는 (Begin)Invoke
을 사용하도록 설정하여 표시합니다. 또한 컨텍스트 스위치를 사용하면 하나씩 채우는 경우 모든 항목을 채우는 데 필요한 총 시간이 눈에 띄게 증가하므로 청크를 채우고 싶을 수 있습니다 (한 번에 50 개의 항목을 말하거나 20 개까지 채울 수 있습니다). 밀리 초). 컨텐츠가 변경 될 때 필요한 추가 동기화를 추가하면별로 좋지 않은 결과를 얻을 수있는 매우 복잡한 솔루션이 생깁니다.
Winforms 또는 WPF? –