2017-04-03 1 views
-1

devexpress 컨트롤을 사용하고 있습니다. 아래 코드는 selectionChanged 이벤트에서 사용됩니다. 이 for 루프는 데이터가 큰 경우 성능이 저하됩니다. 이 방법을 최적화 할 수있는 방법이 있습니까?대용량 데이터의 루프 속도가 느린 경우

  for (int i = 0; i < gridView.RowCount; i++) 
     { 
      int currentHandle = gridView.GetVisibleRowHandle(i); 
      var row = gridView.GetRow(currentHandle) as xxxx; 

      if (gridView.IsRowSelected(currentHandle) && !listSelectedItems.Contains(row)) 
      { 
       listSelectedItems.Add(row); 
      } 
      else if (!gridView.IsRowSelected(currentHandle) && listSelectedItems.Contains(row)) 
      { 
       listSelectedItems.Remove(row); 
      } 
     } 

     gridControl2.Datasource = listSelectedItems; 
     //sometimes refresh datasource is also slow and I tried using beginupdate and endupdate but they never helped 
     gridControl2.RefreshDatasource(); 
+1

어쩌면 부울에 listSelectedItems.Contains()''의 반환을 지정, 당신은 두 번 전체 컬렉션을 통해 – maccettura

+0

갈 것이다 의미 같은 기능에 두 번 확인하는' Remove()'호출이 많이 호출되면 호출이 비쌀 수 있습니다. 선택된 아이템 콜렉션을 순서대로 정렬 할 필요가 없다면, 당신은'HashSet'을 사용할 수 있습니다. – adv12

답변

1

BindingList을 사용하십시오. BindingList으로 매번 gridControl2을 새로 고칠 필요가 없습니다. SelectionChanged 이벤트에서

gridControl2.DataSource = _selected; 

private BindingList<SomeClass> _selected; 

SelectionChangedEventArgs 객체와 SelectionChangedEventArgs.Action 부재를 사용한다. GridView.GetSelectedRows() 메서드를 사용하면 선택한 모든 행을 볼 수 있습니다. 여기
은 예입니다

private void gridView1_SelectionChanged(object sender, DevExpress.Data.SelectionChangedEventArgs e) 
{ 
    switch (e.Action) 
    { 
     case CollectionChangeAction.Add: 
      var addedRow = (SomeClass)gridView1.GetRow(e.ControllerRow); 

      if (!_selected.Contains(addedRow)) //You need this check only when gridView1.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CellSelect 
       _selected.Add(addedRow); 
      break; 
     case CollectionChangeAction.Remove: 
      _selected.Remove((SomeClass)gridView1.GetRow(e.ControllerRow)); 
      break; 
     case CollectionChangeAction.Refresh: 

      gridView2.BeginDataUpdate(); 

      _selected.Clear(); 

      var rows = gridView1.GetSelectedRows().Select(row => (SomeClass)gridView1.GetRow(row)); 
      foreach (var row in rows) 
       _selected.Add(row); 

      gridView2.EndDataUpdate(); 

      break; 
    } 
} 
관련 문제