From cd4f01e6c4e40b1ac20efca8fdad6937ba2d5770 Mon Sep 17 00:00:00 2001 From: Lachlan Ennis <2433737+elachlan@users.noreply.github.com> Date: Thu, 10 Nov 2022 08:55:32 +1000 Subject: [PATCH 1/5] Refactor DataGridViewColumnCollection to replace ArrayList --- ...iewColumnCollection.ColumnOrderComparer.cs | 16 +-- .../Forms/DataGridViewColumnCollection.cs | 134 +++++++----------- 2 files changed, 53 insertions(+), 97 deletions(-) diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.ColumnOrderComparer.cs b/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.ColumnOrderComparer.cs index 66b0017024f..01d9caff53a 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.ColumnOrderComparer.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.ColumnOrderComparer.cs @@ -1,34 +1,24 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. - -#nullable disable - -using System.Collections; using System.Diagnostics; namespace System.Windows.Forms { public partial class DataGridViewColumnCollection { - private class ColumnOrderComparer : IComparer + private class ColumnOrderComparer : IComparer { public ColumnOrderComparer() { } - public int Compare(object x, object y) + public int Compare(DataGridViewColumn? x, DataGridViewColumn? y) { Debug.Assert(x is not null); Debug.Assert(y is not null); - DataGridViewColumn dataGridViewColumn1 = x as DataGridViewColumn; - DataGridViewColumn dataGridViewColumn2 = y as DataGridViewColumn; - - Debug.Assert(dataGridViewColumn1 is not null); - Debug.Assert(dataGridViewColumn2 is not null); - - return dataGridViewColumn1.DisplayIndex - dataGridViewColumn2.DisplayIndex; + return x.DisplayIndex - y.DisplayIndex; } } } diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs b/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs index 1d6a2311344..a0214d18442 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs @@ -20,8 +20,8 @@ namespace System.Windows.Forms public partial class DataGridViewColumnCollection : BaseCollection, IList { private CollectionChangeEventHandler _onCollectionChanged; - private readonly ArrayList _items = new ArrayList(); - private ArrayList _itemsSorted; + private readonly List _items = new List(); + private List _itemsSorted; private int _lastAccessedSortedIndex = -1; private int _columnCountsVisible, _columnCountsVisibleSelected; private int _columnsWidthVisible, _columnsWidthVisibleFrozen; @@ -29,15 +29,9 @@ public partial class DataGridViewColumnCollection : BaseCollection, IList /* IList interface implementation */ - bool IList.IsFixedSize - { - get { return false; } - } + bool IList.IsFixedSize => false; - bool IList.IsReadOnly - { - get { return false; } - } + bool IList.IsReadOnly => false; object IList.this[int index] { @@ -62,7 +56,7 @@ bool IList.Contains(object value) int IList.IndexOf(object value) { - return _items.IndexOf(value); + return _items.IndexOf((DataGridViewColumn)value); } void IList.Insert(int index, object value) @@ -82,33 +76,15 @@ void IList.RemoveAt(int index) /* ICollection interface implementation */ - int ICollection.Count - { - get - { - return _items.Count; - } - } + int ICollection.Count => _items.Count; - bool ICollection.IsSynchronized - { - get - { - return false; - } - } + bool ICollection.IsSynchronized => false; - object ICollection.SyncRoot - { - get - { - return this; - } - } + object ICollection.SyncRoot => this; void ICollection.CopyTo(Array array, int index) { - _items.CopyTo(array, index); + _items.CopyTo((DataGridViewColumn[])array, index); } /* IEnumerable interface implementation */ @@ -125,21 +101,9 @@ public DataGridViewColumnCollection(DataGridView dataGridView) this.DataGridView = dataGridView; } - internal static IComparer ColumnCollectionOrderComparer - { - get - { - return System.Windows.Forms.DataGridViewColumnCollection.s_columnOrderComparer; - } - } + internal static IComparer ColumnCollectionOrderComparer => System.Windows.Forms.DataGridViewColumnCollection.s_columnOrderComparer; - protected override ArrayList List - { - get - { - return _items; - } - } + protected override ArrayList List => new ArrayList(_items); protected DataGridView DataGridView { get; } @@ -150,7 +114,7 @@ public DataGridViewColumn this[int index] { get { - return (DataGridViewColumn)_items[index]; + return _items[index]; } } @@ -166,7 +130,7 @@ public DataGridViewColumn this[string columnName] int itemCount = _items.Count; for (int i = 0; i < itemCount; ++i) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_items[i]; + DataGridViewColumn dataGridViewColumn = _items[i]; // NOTE: case-insensitive if (string.Equals(dataGridViewColumn.Name, columnName, StringComparison.OrdinalIgnoreCase)) { @@ -231,7 +195,8 @@ public virtual int Add(DataGridViewColumn dataGridViewColumn) DataGridView.OnAddingColumn(dataGridViewColumn); // will throw an exception if the addition is illegal InvalidateCachedColumnsOrder(); - int index = _items.Add(dataGridViewColumn); + _items.Add(dataGridViewColumn); + int index = _items.IndexOf(dataGridViewColumn); dataGridViewColumn.Index = index; dataGridViewColumn.DataGridView = DataGridView; UpdateColumnCaches(dataGridViewColumn, true); @@ -261,8 +226,8 @@ public virtual void AddRange(params DataGridViewColumn[] dataGridViewColumns) // Order the columns by ascending DisplayIndex so that their display indexes are not altered by the operation. // The columns with DisplayIndex == -1 are left untouched relative to each other and put at the end of the array. - ArrayList initialColumns = new ArrayList(dataGridViewColumns.Length); - ArrayList sortedColumns = new ArrayList(dataGridViewColumns.Length); + List initialColumns = new List(dataGridViewColumns.Length); + List sortedColumns = new List(dataGridViewColumns.Length); // All columns with DisplayIndex != -1 are put into the initialColumns array foreach (DataGridViewColumn dataGridViewColumn in dataGridViewColumns) @@ -283,7 +248,7 @@ public virtual void AddRange(params DataGridViewColumn[] dataGridViewColumns) smallestIndex = -1; for (index = 0; index < initialColumns.Count; index++) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)initialColumns[index]; + DataGridViewColumn dataGridViewColumn = initialColumns[index]; if (dataGridViewColumn.DisplayIndex < smallestDisplayIndex) { smallestDisplayIndex = dataGridViewColumn.DisplayIndex; @@ -319,7 +284,8 @@ public virtual void AddRange(params DataGridViewColumn[] dataGridViewColumns) foreach (DataGridViewColumn dataGridViewColumn in dataGridViewColumns) { InvalidateCachedColumnsOrder(); - index = _items.Add(dataGridViewColumn); + _items.Add(dataGridViewColumn); + index = _items.IndexOf(dataGridViewColumn); dataGridViewColumn.Index = index; dataGridViewColumn.DataGridView = DataGridView; UpdateColumnCaches(dataGridViewColumn, true); @@ -409,7 +375,7 @@ public virtual bool Contains(string columnName) int itemCount = _items.Count; for (int i = 0; i < itemCount; ++i) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_items[i]; + DataGridViewColumn dataGridViewColumn = _items[i]; // NOTE: case-insensitive if (0 == string.Compare(dataGridViewColumn.Name, columnName, true, CultureInfo.InvariantCulture)) { @@ -427,8 +393,8 @@ public void CopyTo(DataGridViewColumn[] array, int index) internal bool DisplayInOrder(int columnIndex1, int columnIndex2) { - int displayIndex1 = ((DataGridViewColumn)_items[columnIndex1]).DisplayIndex; - int displayIndex2 = ((DataGridViewColumn)_items[columnIndex2]).DisplayIndex; + int displayIndex1 = _items[columnIndex1].DisplayIndex; + int displayIndex2 = _items[columnIndex2].DisplayIndex; return displayIndex1 < displayIndex2; } @@ -439,7 +405,7 @@ internal DataGridViewColumn GetColumnAtDisplayIndex(int displayIndex) return null; } - DataGridViewColumn dataGridViewColumn = ((DataGridViewColumn)_items[displayIndex]); + DataGridViewColumn dataGridViewColumn = _items[displayIndex]; if (dataGridViewColumn.DisplayIndex == displayIndex) { // Performance gain if display indexes coincide with indexes. @@ -448,7 +414,7 @@ internal DataGridViewColumn GetColumnAtDisplayIndex(int displayIndex) for (int columnIndex = 0; columnIndex < _items.Count; columnIndex++) { - dataGridViewColumn = ((DataGridViewColumn)_items[columnIndex]); + dataGridViewColumn = _items[columnIndex]; if (dataGridViewColumn.DisplayIndex == displayIndex) { return dataGridViewColumn; @@ -510,7 +476,7 @@ public int GetColumnCount(DataGridViewElementStates includeFilter) { for (int columnIndex = 0; columnIndex < _items.Count; columnIndex++) { - if (((DataGridViewColumn)_items[columnIndex]).StateIncludes(includeFilter)) + if (_items[columnIndex].StateIncludes(includeFilter)) { columnCount++; } @@ -531,8 +497,8 @@ public int GetColumnCount(DataGridViewElementStates includeFilter) DataGridViewElementStates correctedIncludeFilter = includeFilter & ~DataGridViewElementStates.Resizable; for (int columnIndex = 0; columnIndex < _items.Count; columnIndex++) { - if (((DataGridViewColumn)_items[columnIndex]).StateIncludes(correctedIncludeFilter) && - ((DataGridViewColumn)_items[columnIndex]).Resizable == DataGridViewTriState.True) + if (_items[columnIndex].StateIncludes(correctedIncludeFilter) && + _items[columnIndex].Resizable == DataGridViewTriState.True) { columnCount++; } @@ -548,12 +514,12 @@ internal int GetColumnCount(DataGridViewElementStates includeFilter, int fromCol DataGridViewElementStates.ReadOnly | DataGridViewElementStates.Selected | DataGridViewElementStates.Visible)) == 0); Debug.Assert((includeFilter & DataGridViewElementStates.Resizable) == 0); Debug.Assert(DisplayInOrder(fromColumnIndex, toColumnIndex)); - Debug.Assert(((DataGridViewColumn)_items[toColumnIndex]).StateIncludes(includeFilter)); + Debug.Assert(_items[toColumnIndex].StateIncludes(includeFilter)); int jumpColumns = 0; - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_items[fromColumnIndex]; + DataGridViewColumn dataGridViewColumn = _items[fromColumnIndex]; - while (dataGridViewColumn != (DataGridViewColumn)_items[toColumnIndex]) + while (dataGridViewColumn != _items[toColumnIndex]) { dataGridViewColumn = GetNextColumn(dataGridViewColumn, includeFilter, DataGridViewElementStates.None); @@ -586,7 +552,7 @@ private int GetColumnSortedIndex(DataGridViewColumn dataGridViewColumn) int index = 0; while (index < _itemsSorted.Count) { - if (dataGridViewColumn.Index == ((DataGridViewColumn)_itemsSorted[index]).Index) + if (dataGridViewColumn.Index == _itemsSorted[index].Index) { _lastAccessedSortedIndex = index; return index; @@ -606,9 +572,9 @@ internal float GetColumnsFillWeight(DataGridViewElementStates includeFilter) float weightSum = 0F; for (int columnIndex = 0; columnIndex < _items.Count; columnIndex++) { - if (((DataGridViewColumn)_items[columnIndex]).StateIncludes(includeFilter)) + if (_items[columnIndex].StateIncludes(includeFilter)) { - weightSum += ((DataGridViewColumn)_items[columnIndex]).FillWeight; + weightSum += _items[columnIndex].FillWeight; } } @@ -646,9 +612,9 @@ public int GetColumnsWidth(DataGridViewElementStates includeFilter) int columnsWidth = 0; for (int columnIndex = 0; columnIndex < _items.Count; columnIndex++) { - if (((DataGridViewColumn)_items[columnIndex]).StateIncludes(includeFilter)) + if (_items[columnIndex].StateIncludes(includeFilter)) { - columnsWidth += ((DataGridViewColumn)_items[columnIndex]).Thickness; + columnsWidth += _items[columnIndex].Thickness; } } @@ -683,7 +649,7 @@ public DataGridViewColumn GetFirstColumn(DataGridViewElementStates includeFilter int index = 0; while (index < _itemsSorted.Count) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_itemsSorted[index]; + DataGridViewColumn dataGridViewColumn = _itemsSorted[index]; if (dataGridViewColumn.StateIncludes(includeFilter)) { _lastAccessedSortedIndex = index; @@ -726,7 +692,7 @@ public DataGridViewColumn GetFirstColumn(DataGridViewElementStates includeFilter int index = 0; while (index < _itemsSorted.Count) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_itemsSorted[index]; + DataGridViewColumn dataGridViewColumn = _itemsSorted[index]; if (dataGridViewColumn.StateIncludes(includeFilter) && dataGridViewColumn.StateExcludes(excludeFilter)) { @@ -765,7 +731,7 @@ public DataGridViewColumn GetLastColumn(DataGridViewElementStates includeFilter, int index = _itemsSorted.Count - 1; while (index >= 0) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_itemsSorted[index]; + DataGridViewColumn dataGridViewColumn = _itemsSorted[index]; if (dataGridViewColumn.StateIncludes(includeFilter) && dataGridViewColumn.StateExcludes(excludeFilter)) { @@ -811,7 +777,7 @@ public DataGridViewColumn GetNextColumn(DataGridViewColumn dataGridViewColumnSta int indexMin = int.MaxValue, displayIndexMin = int.MaxValue; for (index = 0; index < _items.Count; index++) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_items[index]; + DataGridViewColumn dataGridViewColumn = _items[index]; if (dataGridViewColumn.StateIncludes(includeFilter) && dataGridViewColumn.StateExcludes(excludeFilter) && (dataGridViewColumn.DisplayIndex > dataGridViewColumnStart.DisplayIndex || @@ -829,14 +795,14 @@ public DataGridViewColumn GetNextColumn(DataGridViewColumn dataGridViewColumnSta } } - return columnFound ? ((DataGridViewColumn)_items[indexMin]) : null; + return columnFound ? _items[indexMin] : null; } else { index++; while (index < _itemsSorted.Count) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_itemsSorted[index]; + DataGridViewColumn dataGridViewColumn = _itemsSorted[index]; if (dataGridViewColumn.StateIncludes(includeFilter) && dataGridViewColumn.StateExcludes(excludeFilter)) { @@ -883,7 +849,7 @@ public DataGridViewColumn GetPreviousColumn(DataGridViewColumn dataGridViewColum int indexMax = -1, displayIndexMax = -1; for (index = 0; index < _items.Count; index++) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_items[index]; + DataGridViewColumn dataGridViewColumn = _items[index]; if (dataGridViewColumn.StateIncludes(includeFilter) && dataGridViewColumn.StateExcludes(excludeFilter) && (dataGridViewColumn.DisplayIndex < dataGridViewColumnStart.DisplayIndex || @@ -901,14 +867,14 @@ public DataGridViewColumn GetPreviousColumn(DataGridViewColumn dataGridViewColum } } - return columnFound ? ((DataGridViewColumn)_items[indexMax]) : null; + return columnFound ? _items[indexMax] : null; } else { index--; while (index >= 0) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_itemsSorted[index]; + DataGridViewColumn dataGridViewColumn = _itemsSorted[index]; if (dataGridViewColumn.StateIncludes(includeFilter) && dataGridViewColumn.StateExcludes(excludeFilter)) { @@ -1097,7 +1063,7 @@ public virtual void Remove(string columnName) int itemsCount = _items.Count; for (int i = 0; i < itemsCount; ++i) { - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_items[i]; + DataGridViewColumn dataGridViewColumn = _items[i]; // NOTE: case-insensitive if (0 == string.Compare(dataGridViewColumn.Name, columnName, true, CultureInfo.InvariantCulture)) { @@ -1142,7 +1108,7 @@ internal void RemoveAtInternal(int index, bool force) Debug.Assert(!DataGridView.NoDimensionChangeAllowed); Debug.Assert(!DataGridView.InDisplayIndexAdjustments); - DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)_items[index]; + DataGridViewColumn dataGridViewColumn = _items[index]; DataGridView.OnRemovingColumn(dataGridViewColumn, out Point newCurrentCell, force); InvalidateCachedColumnsOrder(); _items.RemoveAt(index); @@ -1202,7 +1168,7 @@ private void UpdateColumnCaches(DataGridViewColumn dataGridViewColumn, bool addi private void UpdateColumnOrderCache() { - _itemsSorted = (ArrayList)_items.Clone(); + _itemsSorted = _items.ToList(); _itemsSorted.Sort(s_columnOrderComparer); _lastAccessedSortedIndex = -1; } @@ -1236,8 +1202,8 @@ private bool VerifyColumnOrderCache() int index = 0; while (index < _itemsSorted.Count - 1) { - if (((DataGridViewColumn)_itemsSorted[index + 1]).DisplayIndex != - ((DataGridViewColumn)_itemsSorted[index]).DisplayIndex + 1) + if (_itemsSorted[index + 1].DisplayIndex != + _itemsSorted[index].DisplayIndex + 1) { return false; } From de976fcbf154803f75dcbd725338cf1b1231ab3f Mon Sep 17 00:00:00 2001 From: Lachlan Ennis <2433737+elachlan@users.noreply.github.com> Date: Thu, 10 Nov 2022 10:55:19 +1000 Subject: [PATCH 2/5] use ArrayList.Adapter instead of new arraylist --- .../src/System/Windows/Forms/DataGridViewColumnCollection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs b/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs index a0214d18442..7582eb277c8 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs @@ -103,7 +103,7 @@ public DataGridViewColumnCollection(DataGridView dataGridView) internal static IComparer ColumnCollectionOrderComparer => System.Windows.Forms.DataGridViewColumnCollection.s_columnOrderComparer; - protected override ArrayList List => new ArrayList(_items); + protected override ArrayList List => ArrayList.Adapter(_items); protected DataGridView DataGridView { get; } From cf83a5a4562881013ae86b70e99f4aca0883c39e Mon Sep 17 00:00:00 2001 From: Lachlan Ennis <2433737+elachlan@users.noreply.github.com> Date: Thu, 10 Nov 2022 11:44:34 +1000 Subject: [PATCH 3/5] Fix test --- .../System/Windows/Forms/DataGridViewColumnCollectionTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/DataGridViewColumnCollectionTests.cs b/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/DataGridViewColumnCollectionTests.cs index 9b06618e400..622b2676d78 100644 --- a/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/DataGridViewColumnCollectionTests.cs +++ b/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/DataGridViewColumnCollectionTests.cs @@ -20,7 +20,7 @@ public void DataGridViewColumnCollection_Ctor_DataGridView() Assert.Same(control, collection.DataGridView); Assert.False(collection.IsReadOnly); Assert.False(collection.IsSynchronized); - Assert.IsType(collection.List); + Assert.True(collection.List is ArrayList); Assert.Empty(collection.List); Assert.Same(collection, collection.SyncRoot); } From d3c2884cdce7059d8de2020cd722f0612b8c4c60 Mon Sep 17 00:00:00 2001 From: Igor Velikorossov Date: Thu, 10 Nov 2022 13:37:27 +1100 Subject: [PATCH 4/5] Update src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs --- .../src/System/Windows/Forms/DataGridViewColumnCollection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs b/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs index 7582eb277c8..cc1045862f5 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs @@ -20,7 +20,7 @@ namespace System.Windows.Forms public partial class DataGridViewColumnCollection : BaseCollection, IList { private CollectionChangeEventHandler _onCollectionChanged; - private readonly List _items = new List(); + private readonly List _items = new(); private List _itemsSorted; private int _lastAccessedSortedIndex = -1; private int _columnCountsVisible, _columnCountsVisibleSelected; From 7e85f8efae96240bb2e1a7f1406fd760340aec19 Mon Sep 17 00:00:00 2001 From: Igor Velikorossov Date: Thu, 10 Nov 2022 13:37:33 +1100 Subject: [PATCH 5/5] Update src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs --- .../src/System/Windows/Forms/DataGridViewColumnCollection.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs b/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs index cc1045862f5..8fe4e851878 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/DataGridViewColumnCollection.cs @@ -226,8 +226,8 @@ public virtual void AddRange(params DataGridViewColumn[] dataGridViewColumns) // Order the columns by ascending DisplayIndex so that their display indexes are not altered by the operation. // The columns with DisplayIndex == -1 are left untouched relative to each other and put at the end of the array. - List initialColumns = new List(dataGridViewColumns.Length); - List sortedColumns = new List(dataGridViewColumns.Length); + List initialColumns = new(dataGridViewColumns.Length); + List sortedColumns = new(dataGridViewColumns.Length); // All columns with DisplayIndex != -1 are put into the initialColumns array foreach (DataGridViewColumn dataGridViewColumn in dataGridViewColumns)