| File: System\Windows\Forms\Dialogs\TaskDialog\TaskDialogRadioButtonCollection.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.ObjectModel; namespace System.Windows.Forms; /// <summary> /// Represents a collection of <see cref="TaskDialogRadioButton"/> objects. /// </summary> public class TaskDialogRadioButtonCollection : Collection<TaskDialogRadioButton> { // HashSet to detect duplicate items. private readonly HashSet<TaskDialogRadioButton> _itemSet = []; /// <summary> /// Initializes a new instance of the <see cref="TaskDialogRadioButtonCollection"/> class. /// </summary> public TaskDialogRadioButtonCollection() { } internal TaskDialogPage? BoundPage { get; set; } /// <summary> /// Creates and adds a <see cref="TaskDialogRadioButton"/> to the collection. /// </summary> /// <param name="text">The text of the radio button.</param> /// <returns>The created <see cref="TaskDialogRadioButton"/>.</returns> /// <exception cref="InvalidOperationException"> /// This collection is currently bound to a task dialog. /// </exception> public TaskDialogRadioButton Add(string? text) { TaskDialogRadioButton button = new() { Text = text }; Add(button); return button; } /// <inheritdoc/> /// <exception cref="ArgumentNullException"> /// <paramref name="item"/> is <see langword="null"/>. /// </exception> /// <exception cref="ArgumentException"> /// <paramref name="item"/> has already been added to the collection. /// </exception> /// <exception cref="InvalidOperationException"> /// <paramref name="item"/> is already a part of a different collection. /// - or - /// This collection is currently bound to a task dialog. /// </exception> protected override void SetItem(int index, TaskDialogRadioButton item) { ArgumentNullException.ThrowIfNull(item); // Disallow collection modification, so that we don't need to copy it // when binding the TaskDialogPage. BoundPage?.DenyIfBound(); DenyIfHasOtherCollection(item); TaskDialogRadioButton oldItem = this[index]; if (oldItem != item) { // First, add the new item (which will throw if it is a duplicate entry), // then remove the old one. if (!_itemSet.Add(item)) { throw new ArgumentException(SR.TaskDialogControlAlreadyAddedToCollection); } _itemSet.Remove(oldItem); oldItem.Collection = null; item.Collection = this; } base.SetItem(index, item); } /// <inheritdoc/> /// <exception cref="ArgumentNullException"> /// <paramref name="item"/> is <see langword="null"/>. /// </exception> /// <exception cref="ArgumentException"> /// <paramref name="item"/> has already been added to the collection. /// </exception> /// <exception cref="InvalidOperationException"> /// <paramref name="item"/> is already a part of a different collection. /// - or - /// This collection is currently bound to a task dialog. /// </exception> protected override void InsertItem(int index, TaskDialogRadioButton item) { ArgumentNullException.ThrowIfNull(item); // Disallow collection modification, so that we don't need to copy it // when binding the TaskDialogPage. BoundPage?.DenyIfBound(); DenyIfHasOtherCollection(item); if (!_itemSet.Add(item)) { throw new ArgumentException(SR.TaskDialogControlAlreadyAddedToCollection); } item.Collection = this; base.InsertItem(index, item); } /// <inheritdoc/> /// <exception cref="InvalidOperationException"> /// This collection is currently bound to a task dialog. /// </exception> protected override void RemoveItem(int index) { // Disallow collection modification, so that we don't need to copy it // when binding the TaskDialogPage. BoundPage?.DenyIfBound(); TaskDialogRadioButton oldItem = this[index]; oldItem.Collection = null; _itemSet.Remove(oldItem); base.RemoveItem(index); } /// <inheritdoc/> /// <exception cref="InvalidOperationException"> /// This collection is currently bound to a task dialog. /// </exception> protected override void ClearItems() { // Disallow collection modification, so that we don't need to copy it // when binding the TaskDialogPage. BoundPage?.DenyIfBound(); foreach (TaskDialogRadioButton button in this) { button.Collection = null; } _itemSet.Clear(); base.ClearItems(); } private void DenyIfHasOtherCollection(TaskDialogRadioButton item) { if (item.Collection is not null && item.Collection != this) { throw new InvalidOperationException(SR.TaskDialogControlIsPartOfOtherCollection); } } }