| File: System\Windows\Forms\Controls\ListView\ListViewGroupItemCollection.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; namespace System.Windows.Forms; internal class ListViewGroupItemCollection : ListView.ListViewItemCollection.IInnerList { private readonly ListViewGroup _group; private List<ListViewItem>? _items; public ListViewGroupItemCollection(ListViewGroup group) { _group = group; } public int Count => Items.Count; private List<ListViewItem> Items => _items ??= []; public bool OwnerIsVirtualListView => _group.ListView is not null && _group.ListView.VirtualMode; public bool OwnerIsDesignMode => _group.ListView?.Site is not null && _group.ListView.Site.DesignMode; public ListViewItem this[int index] { get => Items[index]; set { if (value != Items[index]) { MoveToGroup(Items[index], null); Items[index] = value; MoveToGroup(Items[index], _group); } } } public ListViewItem Add(ListViewItem value) { CheckListViewItem(value); MoveToGroup(value, _group); Items.Add(value); return value; } public void AddRange(params ListViewItem[] items) { for (int i = 0; i < items.Length; i++) { CheckListViewItem(items[i]); } Items.AddRange(items); for (int i = 0; i < items.Length; i++) { MoveToGroup(items[i], _group); } } private void CheckListViewItem(ListViewItem item) { if (item.ListView is not null && item.ListView != _group.ListView) { throw new ArgumentException(string.Format(SR.OnlyOneControl, item.Text), nameof(item)); } } public void Clear() { for (int i = 0; i < Count; i++) { MoveToGroup(this[i], null); } Items.Clear(); } public bool Contains(ListViewItem item) => Items.Contains(item); public void CopyTo(Array dest, int index) => ((ICollection)Items).CopyTo(dest, index); public IEnumerator GetEnumerator() => Items.GetEnumerator(); public int IndexOf(ListViewItem item) => Items.IndexOf(item); public ListViewItem Insert(int index, ListViewItem item) { CheckListViewItem(item); MoveToGroup(item, _group); Items.Insert(index, item); return item; } private static void MoveToGroup(ListViewItem item, ListViewGroup? newGroup) { ListViewGroup? oldGroup = item.Group; if (oldGroup != newGroup) { item._group = newGroup; oldGroup?.Items.Remove(item); UpdateNativeListViewItem(item); } } public void Remove(ListViewItem item) { Items.Remove(item); if (item._group == _group) { item._group = null; UpdateNativeListViewItem(item); } } public void RemoveAt(int index) => Remove(this[index]); private static void UpdateNativeListViewItem(ListViewItem item) { if (item.ListView is not null && item.ListView.IsHandleCreated && !item.ListView.InsertingItemsNatively) { item.UpdateStateToListView(item.Index); } } }