| File: System\Windows\Forms\Controls\ListView\ListView.CheckedIndexCollection.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms\System.Windows.Forms.csproj (System.Windows.Forms) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections; using System.ComponentModel; namespace System.Windows.Forms; public partial class ListView { [ListBindable(false)] public class CheckedIndexCollection : IList { private readonly ListView _owner; /* C#r: protected */ public CheckedIndexCollection(ListView owner) { _owner = owner.OrThrowIfNull(); } /// <summary> /// Number of currently selected items. /// </summary> [Browsable(false)] public int Count { get { if (!_owner.CheckBoxes) { return 0; } // Count the number of checked items int count = 0; foreach (ListViewItem item in _owner.Items) { if (item is not null && item.Checked) { count++; } } return count; } } private int[] IndicesArray { get { int[] indices = new int[Count]; int index = 0; for (int i = 0; i < _owner.Items.Count && index < indices.Length; ++i) { if (_owner.Items[i].Checked) { indices[index++] = i; } } return indices; } } /// <summary> /// Selected item in the list. /// </summary> public int this[int index] { get { ArgumentOutOfRangeException.ThrowIfNegative(index); // Loop through the main collection until we find the right index. int cnt = _owner.Items.Count; int nChecked = 0; for (int i = 0; i < cnt; i++) { ListViewItem item = _owner.Items[i]; if (item.Checked) { if (nChecked == index) { return i; } nChecked++; } } // Should never get to this point. throw new ArgumentOutOfRangeException(nameof(index), index, string.Format(SR.InvalidArgument, nameof(index), index)); } } object? IList.this[int index] { get { return this[index]; } set { throw new NotSupportedException(); } } object ICollection.SyncRoot { get { return this; } } bool ICollection.IsSynchronized { get { return false; } } bool IList.IsFixedSize { get { return true; } } public bool IsReadOnly { get { return true; } } public bool Contains(int checkedIndex) { if (_owner.Items[checkedIndex].Checked) { return true; } else { return false; } } bool IList.Contains(object? checkedIndex) { if (checkedIndex is int checkedIndexAsInt) { return Contains(checkedIndexAsInt); } else { return false; } } public int IndexOf(int checkedIndex) { int[] indices = IndicesArray; for (int index = 0; index < indices.Length; ++index) { if (indices[index] == checkedIndex) { return index; } } return -1; } int IList.IndexOf(object? checkedIndex) { if (checkedIndex is int checkedIndexAsInt) { return IndexOf(checkedIndexAsInt); } else { return -1; } } int IList.Add(object? value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } void IList.Insert(int index, object? value) { throw new NotSupportedException(); } void IList.Remove(object? value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } void ICollection.CopyTo(Array dest, int index) { if (Count > 0) { Array.Copy(IndicesArray, 0, dest, index, Count); } } public IEnumerator GetEnumerator() { int[] indices = IndicesArray; if (indices is not null) { return indices.GetEnumerator(); } else { return Array.Empty<int>().GetEnumerator(); } } } }