From 2d32d3fd7a2126295bb737291a86e36f6b0fe693 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/5] 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/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs index 2ce5e73dd45..460b74d2725 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs @@ -27486,7 +27486,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/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs index 40d49ea6d65..26a9e4ce5e7 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs +++ b/src/System.Windows.Forms/src/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 b3124e23bf23c52f55c9596ed32cb7e1a14f14e7 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/5] 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/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs index 460b74d2725..36e91899dc4 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs @@ -27487,7 +27487,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/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs index 26a9e4ce5e7..446b300ca1f 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs +++ b/src/System.Windows.Forms/src/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 4f21312c1ded597cb3b0b1334fcb25bd5dc34b64 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/5] Removing field _isReleasingDataSource --- .../System/Windows/Forms/Controls/DataGridView/DataGridView.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs index 446b300ca1f..2447e741e32 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs +++ b/src/System.Windows.Forms/src/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; From 43117a9ebc3d952db62d0cc4d7b034d0c1e4b1b7 Mon Sep 17 00:00:00 2001 From: Leaf Shi <132890443+LeafShi1@users.noreply.github.com> Date: Thu, 24 Apr 2025 18:02:55 -0700 Subject: [PATCH 4/5] Moving tag OperationInReleasingDataSource to function "OnDataSourceDisposed" (#13362) * Removing tag OperationInReleasingDataSource * Add judgment IsHandleCreated to before defining currentCell in function SetCurrentCellAddressCore --- .../Controls/DataGridView/DataGridView.Methods.cs | 6 +++--- .../Forms/Controls/DataGridView/DataGridView.cs | 12 +----------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs index 36e91899dc4..0ab7fc2fc59 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.Methods.cs @@ -27484,10 +27484,10 @@ protected virtual bool SetCurrentCellAddressCore(int columnIndex, { int oldCurrentCellX = _ptCurrentCell.X; int oldCurrentCellY = _ptCurrentCell.Y; - if (oldCurrentCellX >= 0 + if (IsHandleCreated + && oldCurrentCellX >= 0 && !_dataGridViewState1[State1_TemporarilyResetCurrentCell] - && !_dataGridViewOper[OperationInDispose] - && !_dataGridViewOper[OperationInReleasingDataSource]) + && !_dataGridViewOper[OperationInDispose]) { DataGridViewCell currentCell = CurrentCellInternal; if (!EndEdit( diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs index 2447e741e32..9b8ed9dd019 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs @@ -222,7 +222,6 @@ 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,16 +1921,7 @@ public object? DataSource newDataSource.Disposed += OnDataSourceDisposed; } - _dataGridViewOper[OperationInReleasingDataSource] = true; - - try - { - CurrentCell = null; - } - finally - { - _dataGridViewOper[OperationInReleasingDataSource] = false; - } + CurrentCell = null; if (DataConnection is null) { From c97f91280b22454eec9b8982a5cc34a731dd64a5 Mon Sep 17 00:00:00 2001 From: "Leaf Shi (BEYONDSOFT CONSULTING INC)" Date: Fri, 25 Apr 2025 09:26:00 +0800 Subject: [PATCH 5/5] Removing extra blank line --- .../System/Windows/Forms/Controls/DataGridView/DataGridView.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs index 9b8ed9dd019..40d49ea6d65 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/Controls/DataGridView/DataGridView.cs @@ -1922,7 +1922,6 @@ public object? DataSource } CurrentCell = null; - if (DataConnection is null) { DataConnection = new DataGridViewDataConnection(this);