| File: System\Windows\Forms\AutoCompleteStringCollection.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; /// <summary> /// Represents a collection of strings. /// </summary> public class AutoCompleteStringCollection : IList { private CollectionChangeEventHandler? _onCollectionChanged; private readonly List<string> _data = []; public AutoCompleteStringCollection() { } /// <summary> /// Represents the entry at the specified index of the <see cref="AutoCompleteStringCollection"/>. /// </summary> public string this[int index] { get { return _data[index]; } set { OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, _data[index])); _data[index] = value; OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, value)); } } /// <summary> /// Gets the number of strings in the /// <see cref="AutoCompleteStringCollection"/> . /// </summary> public int Count => _data.Count; bool IList.IsReadOnly => ((IList)_data).IsReadOnly; bool IList.IsFixedSize => ((IList)_data).IsFixedSize; public event CollectionChangeEventHandler? CollectionChanged { add => _onCollectionChanged += value; remove => _onCollectionChanged -= value; } protected void OnCollectionChanged(CollectionChangeEventArgs e) => _onCollectionChanged?.Invoke(this, e); /// <summary> /// Adds a string with the specified value to the /// <see cref="AutoCompleteStringCollection"/> . /// </summary> /// <returns> /// The position into which the new element was inserted, or -1 to indicate that /// the item was not inserted into the collection. /// </returns> public int Add(string value) { if (value is null) { return -1; } int index = ((IList)_data).Add(value); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, value)); return index; } /// <summary> /// Copies the elements of a string array to the end of the <see cref="AutoCompleteStringCollection"/>. /// </summary> public void AddRange(params string[] value) { ArgumentNullException.ThrowIfNull(value); List<string> nonNullItems = []; foreach (string item in value) { if (item is not null) { nonNullItems.Add(item); } } if (nonNullItems.Count <= 0) { return; } _data.AddRange(nonNullItems); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Refresh, null)); } /// <summary> /// Removes all the strings from the /// <see cref="AutoCompleteStringCollection"/> . /// </summary> public void Clear() { _data.Clear(); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Refresh, null)); } /// <summary> /// Gets a value indicating whether the /// <see cref="AutoCompleteStringCollection"/> contains a string with the specified /// value. /// </summary> public bool Contains(string value) => _data.Contains(value); /// <summary> /// Copies the <see cref="AutoCompleteStringCollection"/> values to a one-dimensional <see cref="Array"/> instance at the /// specified index. /// </summary> public void CopyTo(string[] array, int index) => _data.CopyTo(array, index); /// <summary> /// Returns the index of the first occurrence of a string in /// the <see cref="AutoCompleteStringCollection"/> . /// </summary> public int IndexOf(string value) => _data.IndexOf(value); /// <summary> /// Inserts a string into the <see cref="AutoCompleteStringCollection"/> at the specified /// index. /// </summary> public void Insert(int index, string value) { ArgumentOutOfRangeException.ThrowIfNegative(index); ArgumentOutOfRangeException.ThrowIfGreaterThan(index, _data.Count); if (value is not null) { _data.Insert(index, value); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, value)); } } /// <summary> /// Gets a value indicating whether the <see cref="AutoCompleteStringCollection"/> is read-only. /// </summary> public bool IsReadOnly => ((IList)_data).IsReadOnly; /// <summary> /// Gets a value indicating whether access to the <see cref="AutoCompleteStringCollection"/> /// is synchronized (thread-safe). /// </summary> public bool IsSynchronized => ((IList)_data).IsSynchronized; /// <summary> /// Removes a specific string from the <see cref="AutoCompleteStringCollection"/> . /// </summary> public void Remove(string value) { _data.Remove(value); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, value)); } /// <summary> /// Removes the string at the specified index of the <see cref="AutoCompleteStringCollection"/>. /// </summary> public void RemoveAt(int index) { string value = _data[index]; _data.RemoveAt(index); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, value)); } /// <summary> /// Gets an object that can be used to synchronize access to the <see cref="AutoCompleteStringCollection"/>. /// </summary> public object SyncRoot => ((IList)_data).SyncRoot; object? IList.this[int index] { get => this[index]; set => this[index] = (string)value!; } int IList.Add(object? value) => Add((string)value!); bool IList.Contains(object? value) => Contains((string)value!); int IList.IndexOf(object? value) => IndexOf((string)value!); void IList.Insert(int index, object? value) => Insert(index, (string)value!); void IList.Remove(object? value) => Remove((string)value!); void ICollection.CopyTo(Array array, int index) => ((ICollection)_data).CopyTo(array, index); public IEnumerator GetEnumerator() => _data.GetEnumerator(); internal string[] ToArray() => [.. _data]; }