次のように、プログラムで DataGridView に列を挿入しています (つまり、データ テーブル/データベースにバインドされていません)。
int lastIndex = m_DGV.Columns.Count - 1; // Count = 4 in this case
DataGridViewTextBoxColumn col = (DataGridViewTextBoxColumn)m_DGV.Columns[lastIndex];
m_DGV.Columns.RemoveAt(lastIndex);
m_DGV.Columns.Insert(insertIndex, col); // insertIndex = 2
この方法を使用すると、列が視覚的に順不同であることがわかりました。回避策は、後で列の DisplayIndex プロパティを手動で設定することです。このコードを追加すると「修正」されますが、なぜこのように動作するのかわかりません。
Console.Write(m_DGV.Columns[0].DisplayIndex); // Has value of 0
Console.Write(m_DGV.Columns[1].DisplayIndex); // Has value of 1
Console.Write(m_DGV.Columns[2].DisplayIndex); // Has value of 3
Console.Write(m_DGV.Columns[3].DisplayIndex); // Has value of 2
col.DisplayIndex = insertIndex;
Console.Write(m_DGV.Columns[0].DisplayIndex); // Has value of 0
Console.Write(m_DGV.Columns[1].DisplayIndex); // Has value of 1
Console.Write(m_DGV.Columns[2].DisplayIndex); // Has value of 2
Console.Write(m_DGV.Columns[3].DisplayIndex); // Has value of 3
余談ですが、私のグリッドは列数を動的に増やすことができます。チャンクで成長させたかったので、各挿入で列の割り当て (および関連する初期化) は必要ありませんでした。「新しい」各列は、未使用の列を最後から取得し、目的の位置に挿入して表示することで追加されます。