DataGridViewの列幅オートサイズモード(AutoSizeColumnsMode)がAllCellsなどのようにセルの内容によってオートサイズするモードの場合、セルのValueの設定回数が多いと描画が遅くなります。
これを改善するために、列幅オートサイズモードを一旦Noneに変更する拡張メソッドを作成しました。
これにより劇的に速度改善しました。
/// <summary>処理実行中に列幅のオートサイズを停止します。セルのValueの設定回数が多い場合、オートサイズ処理が遅いため、一旦オートサイズを停止することで高速化を行います。</summary> public static void SuspendColumnAutoSize(this DataGridView dgv, System.Action action) { //注意:AutoSizeRowsModeは対象外。Noneに変更しただけで遅いため //finallyで行う処理 System.Action finallyAction = () => { }; //AutoSizeColumnsModeがNoneなどでない場合はNoneに変更する if (dgv.AutoSizeColumnsMode.EqualsAny(DataGridViewAutoSizeColumnsMode.None, DataGridViewAutoSizeColumnsMode.Fill).Not()) { var mode = dgv.AutoSizeColumnsMode; finallyAction += () => dgv.AutoSizeColumnsMode = mode; dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; } //列のAutoSizeColumnsModeがNoneなどでない場合はNoneに変更する foreach (var col in dgv.Columns.ToList()) { if (col.AutoSizeMode.EqualsAny(DataGridViewAutoSizeColumnMode.None, DataGridViewAutoSizeColumnMode.NotSet, DataGridViewAutoSizeColumnMode.Fill).Not()) { var mode = col.AutoSizeMode; finallyAction += () => col.AutoSizeMode = mode; col.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; } } //処理実行 try { action(); } finally { finallyAction(); } }