From ecf5b7f6ea2caa52c915c49ca7ef4175d355e842 Mon Sep 17 00:00:00 2001 From: "Leaf Shi (BEYONDSOFT CONSULTING INC)" Date: Thu, 17 Apr 2025 15:37:38 +0800 Subject: [PATCH 1/3] Add _isReleasingDataSource to prevent unnecessary operations on CurrentCell when changing or releasing DataSource --- .../Controls/DataGridView/DataGridView.Methods.cs | 3 ++- .../Forms/Controls/DataGridView/DataGridView.cs | 13 ++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs index 2c92bf0a787..2a834fd4a5c 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs @@ -27017,7 +27017,8 @@ protected virtual bool SetCurrentCellAddressCore(int columnIndex, int oldCurrentCellY = _ptCurrentCell.Y; if (oldCurrentCellX >= 0 && !_dataGridViewState1[State1_TemporarilyResetCurrentCell] - && !_dataGridViewOper[OperationInDispose]) + && !_dataGridViewOper[OperationInDispose] + && !_isReleasingDataSource) { DataGridViewCell currentCell = CurrentCellInternal; if (!EndEdit( diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs index 488b74bab95..0d4c3ad0bc5 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs @@ -345,6 +345,7 @@ private const DataGridViewAutoSizeRowCriteriaInternal InvalidDataGridViewAutoSiz private int _inBulkPaintCount; private int _inBulkLayoutCount; private int _inPerformLayoutCount; + private bool _isReleasingDataSource; private int _keyboardResizeStep; private Rectangle _resizeClipRectangle; @@ -1921,7 +1922,17 @@ public object? DataSource newDataSource.Disposed += OnDataSourceDisposed; } - CurrentCell = null; + _isReleasingDataSource = true; + + try + { + CurrentCell = null; + } + finally + { + _isReleasingDataSource = false; + } + if (DataConnection is null) { DataConnection = new DataGridViewDataConnection(this); From 0d1418f1df7a11409a411f15ce6facc58d611a6d Mon Sep 17 00:00:00 2001 From: "Leaf Shi (BEYONDSOFT CONSULTING INC)" Date: Mon, 21 Apr 2025 09:44:01 +0800 Subject: [PATCH 2/3] Add a new flag _dataGridViewOper[OperationInReleasingDataSource] instead of field _isReleasingDataSource --- .../Forms/Controls/DataGridView/DataGridView.Methods.cs | 2 +- .../Windows/Forms/Controls/DataGridView/DataGridView.cs | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs index 2a834fd4a5c..d90e6915916 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs @@ -27018,7 +27018,7 @@ protected virtual bool SetCurrentCellAddressCore(int columnIndex, if (oldCurrentCellX >= 0 && !_dataGridViewState1[State1_TemporarilyResetCurrentCell] && !_dataGridViewOper[OperationInDispose] - && !_isReleasingDataSource) + && !_dataGridViewOper[OperationInReleasingDataSource]) { DataGridViewCell currentCell = CurrentCellInternal; if (!EndEdit( diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs index 0d4c3ad0bc5..b8f42450078 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs @@ -222,6 +222,7 @@ public partial class DataGridView : Control, ISupportInitialize private const int OperationInEndEdit = 0x00400000; private const int OperationResizingOperationAboutToStart = 0x00800000; private const int OperationTrackKeyboardColResize = 0x01000000; + private const int OperationInReleasingDataSource = 0x02000000; private const int OperationMouseOperationMask = OperationTrackColResize | OperationTrackRowResize | OperationTrackColRelocation | OperationTrackColHeadersResize | OperationTrackRowHeadersResize; private const int OperationKeyboardOperationMask = OperationTrackKeyboardColResize; @@ -1922,7 +1923,7 @@ public object? DataSource newDataSource.Disposed += OnDataSourceDisposed; } - _isReleasingDataSource = true; + _dataGridViewOper[OperationInReleasingDataSource] = true; try { @@ -1930,7 +1931,7 @@ public object? DataSource } finally { - _isReleasingDataSource = false; + _dataGridViewOper[OperationInReleasingDataSource] = false; } if (DataConnection is null) From 59cbb8154d85b55d2a713d04dc0780da44aab072 Mon Sep 17 00:00:00 2001 From: "Leaf Shi (BEYONDSOFT CONSULTING INC)" Date: Mon, 21 Apr 2025 12:10:31 +0800 Subject: [PATCH 3/3] Removing field _isReleasingDataSource --- .../System/Windows/Forms/Controls/DataGridView/DataGridView.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs index b8f42450078..44d7978e5bd 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs @@ -346,7 +346,6 @@ private const DataGridViewAutoSizeRowCriteriaInternal InvalidDataGridViewAutoSiz private int _inBulkPaintCount; private int _inBulkLayoutCount; private int _inPerformLayoutCount; - private bool _isReleasingDataSource; private int _keyboardResizeStep; private Rectangle _resizeClipRectangle;