Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/14/19 13:40:49 (5 years ago)
Author:
abeham
Message:

#3010: Added batch methods for checking multiple items at once for CheckedItemList and CheckedItemCollection

Location:
trunk/HeuristicLab.Core.Views/3.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/HeuristicLab.Core.Views/3.3/CheckedItemCollectionView.cs

    r16565 r17009  
    3434  [Content(typeof(ReadOnlyCheckedItemCollection<>), true)]
    3535  public partial class CheckedItemCollectionView<T> : ItemCollectionView<T> where T : class, IItem {
     36    private bool suppressCheckedEvents;
     37
    3638    public new ICheckedItemCollection<T> Content {
    3739      get { return (ICheckedItemCollection<T>)base.Content; }
     
    8486        doubleClick = false;
    8587      } else {
     88        bool check = e.NewValue == CheckState.Checked;
    8689        var checkedItem = (T)itemsListView.Items[e.Index].Tag;
    87         bool check = e.NewValue == CheckState.Checked;
    88         if (Content.ItemChecked(checkedItem) != check) {
    89           if (!ReadOnly && !Locked) Content.SetItemCheckedState(checkedItem, check);
    90           else e.NewValue = e.CurrentValue;
    91         }
     90        if (Content.ItemChecked(checkedItem) == check) return;
     91
     92        suppressCheckedEvents = true;
     93        try {
     94          if (itemsListView.SelectedIndices.Count > 1
     95            && itemsListView.SelectedIndices.Contains(e.Index)) {
     96            if (!ReadOnly && !Locked) Content.SetItemCheckedState(itemsListView.SelectedItems.Cast<ListViewItem>().Select(x => (T)x.Tag), check);
     97            else e.NewValue = e.CurrentValue;
     98          } else {
     99            if (!ReadOnly && !Locked) Content.SetItemCheckedState(checkedItem, check);
     100            else e.NewValue = e.CurrentValue;
     101          }
     102        } finally { suppressCheckedEvents = false; }
    92103      }
    93104    }
    94     protected void itemsListView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
     105    protected void itemsListView_MouseDown(object sender, MouseEventArgs e) {
    95106      if (e.Clicks > 1)
    96107        doubleClick = true;
     
    103114        Invoke(new CollectionItemsChangedEventHandler<T>(Content_CheckedItemsChanged), sender, e);
    104115      else {
    105         UpdateCheckedItemState(e.Items);
     116        if (!suppressCheckedEvents) UpdateCheckedItemState(e.Items);
    106117        SetNumberOfCheckItems();
    107118      }
     
    130141
    131142    private void UpdateCheckedItemState(IEnumerable<T> items) {
    132       foreach (T item in items) {
    133         foreach (ListViewItem listViewItem in GetListViewItemsForItem(item)) {
    134           var isChecked = Content.ItemChecked(item);
    135           if (listViewItem.Checked != isChecked)
    136             listViewItem.Checked = isChecked;
     143      itemsListView.BeginUpdate();
     144      try {
     145        foreach (T item in items) {
     146          foreach (ListViewItem listViewItem in GetListViewItemsForItem(item)) {
     147            var isChecked = Content.ItemChecked(item);
     148            if (listViewItem.Checked != isChecked)
     149              listViewItem.Checked = isChecked;
     150          }
    137151        }
    138       }
     152      } finally { itemsListView.EndUpdate(); itemsListView.Refresh(); }
    139153    }
    140154  }
  • trunk/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs

    r16565 r17009  
    3737  [Content(typeof(ReadOnlyCheckedItemList<>), true)]
    3838  public partial class CheckedItemListView<T> : ItemListView<T> where T : class, IItem {
     39    private bool suppressCheckedEvents;
     40
    3941    public new ICheckedItemList<T> Content {
    4042      get { return (ICheckedItemList<T>)base.Content; }
     
    8688        doubleClick = false;
    8789      } else {
    88         var checkedItem = (T)itemsListView.Items[e.Index].Tag;
    8990        bool check = e.NewValue == CheckState.Checked;
    90         if (Content.ItemChecked(checkedItem) != check) {
    91           if (!ReadOnly && !Locked) Content.SetItemCheckedState(checkedItem, check);
    92           else e.NewValue = e.CurrentValue;
    93         }
     91        if (Content.ItemChecked(e.Index) == check) return;
     92
     93        suppressCheckedEvents = true;
     94        try {
     95          if (itemsListView.SelectedIndices.Count > 1
     96            && itemsListView.SelectedIndices.Contains(e.Index)) {
     97            if (!ReadOnly && !Locked) Content.SetItemCheckedState(itemsListView.SelectedIndices.Cast<int>(), check);
     98            else e.NewValue = e.CurrentValue;
     99          } else {
     100            var checkedItem = (T)itemsListView.Items[e.Index].Tag;
     101            if (!ReadOnly && !Locked) Content.SetItemCheckedState(checkedItem, check);
     102            else e.NewValue = e.CurrentValue;
     103          }
     104        } finally { suppressCheckedEvents = false; }
    94105      }
    95106    }
     
    139150        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CheckedItemsChanged), sender, e);
    140151      else {
    141         UpdateCheckedItemState(e.Items);
     152        if (!suppressCheckedEvents) UpdateCheckedItemState(e.Items);
    142153        SetNumberOfCheckItems();
    143154      }
     
    175186
    176187    private void UpdateCheckedItemState(IEnumerable<IndexedItem<T>> items) {
    177       foreach (var item in items) {
    178         var isChecked = Content.ItemChecked(item.Value);
    179         if (itemsListView.Items[item.Index].Checked != isChecked)
    180           itemsListView.Items[item.Index].Checked = isChecked;
    181       }
     188      itemsListView.BeginUpdate();
     189      try {
     190        foreach (var item in items) {
     191          var isChecked = Content.ItemChecked(item.Value);
     192          if (itemsListView.Items[item.Index].Checked != isChecked)
     193            itemsListView.Items[item.Index].Checked = isChecked;
     194        }
     195      } finally { itemsListView.EndUpdate(); itemsListView.Refresh(); }
    182196    }
    183197  }
Note: See TracChangeset for help on using the changeset viewer.