| File: System\Windows\Forms\Design\ListViewGroupCollectionEditor.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #nullable disable using System.ComponentModel; using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; namespace System.Windows.Forms.Design; /// <summary> /// Provides an editor for a ListView groups collection. /// </summary> internal class ListViewGroupCollectionEditor : CollectionEditor { private object _editValue; public ListViewGroupCollectionEditor(Type type) : base(type) { } /// <summary> /// Creates a ListViewGroup instance. /// </summary> protected override object CreateInstance(Type itemType) { ListViewGroup group = (ListViewGroup)base.CreateInstance(itemType); // Create an unique name for the list view group. group.Name = CreateListViewGroupName((ListViewGroupCollection)_editValue); return group; } private string CreateListViewGroupName(ListViewGroupCollection collection) { ReadOnlySpan<char> listViewGroupName = nameof(ListViewGroup); if (Context.TryGetService(out INameCreationService nameService) && Context.TryGetService(out IContainer container)) { listViewGroupName = nameService.CreateName(container, typeof(ListViewGroup)); } // Strip the digits from the end. while (char.IsDigit(listViewGroupName[^1])) { listViewGroupName = listViewGroupName[0..^1]; } int i = 1; string result = $"{listViewGroupName}{i}"; while (collection[result] is not null) { i++; result = $"{listViewGroupName}{i}"; } return result; } public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { _editValue = value; object result; // This will block while the ListViewGroupCollectionDialog is running. result = base.EditValue(context, provider, value); // The user is done with the ListViewGroupCollectionDialog, don't need the edit value any longer. _editValue = null; return result; } }