2017-04-03 28 views
-1

我正在使用devexpress控件。下面的代碼用於selectionChanged事件。數據量巨大時,for循環會導致性能下降。有什麼方法可以優化這個嗎?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()'爲BOOL的回報,你在同樣的功能,這意味着它會經過整個集合兩次 – maccettura

+0

兩次檢查它的' Remove()'調用可能會很昂貴,如果它被調用了很多。如果你不需要選擇的項目集合,你可以使用'HashSet'。 – adv12

回答

1

對於gridControl2使用BindingList。有了BindingList,您無需每次刷新您的gridControl2

private BindingList<SomeClass> _selected; 

gridControl2.DataSource = _selected; 

SelectionChanged事件中使用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; 
    } 
}