File: System\Windows\Forms\Controls\ListView\ListViewGroupItemCollection.cs
Web Access
Project: src\src\System.Windows.Forms\src\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);
        }
    }
}