トップ回答者
DataGridViewの列の並びがビルド時に変わるのを防ぎたい

質問
-
・概要
ビルドするとDataGridViewの列の並びが入れ替わってしまいます。以下のようなデータバインド列を含む状況で発生しているのですが、再現性に何となく不安があります(一応2回確認しましたが…)
・問題の起こる状況
db.mdbに以下のテーブルを作成します
Table01…Field01 (テキスト型で、主キー。)・PC起動→IDE起動→WindowsApplication1 を新規に作成
・新しいデータソース db.mdb を追加
・データソースウィンドウから「Table01」をドラッグアンドドロップで Form1 上に落とすと「Table01DataGridView」ができる
・「Table01DataGridView」の「列の編集」→「追加」→「非バインド列」を選択、列のプロパティはデフォルト(名前「Column1」など)のままで追加ボタンを押す
・この時点で「Table01DataGridView」には左から順に「Field01」「Column1」の2列が並ぶここでビルドすると列の並びが左から順に「Column1」「Field01」と入れ替わってしまいます。
(ちなみに続けて Form2 を作成し、ここにも Table01DataGridView を作って同じ事をすると、今度は入れ替わりません。)それでWebで調べたところ、
DataGridViewの列の表示順が勝手に変わる
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34072&forum=7&4
に「列の自動生成オプションをオフにする」ように書かれているのを見つけたのですが、その方法が分かりません。
AutoGenerateColumns かと思って調べてみたのですが、DGVを作った時点で自動的に Form1.Designer.vb に
Me.Table01DataGridView.AutoGenerateColumns = False
と書かれているのに入れ替わります。これの事ではなさそうですが…入れ替わるのを防ぐ方法が分かる方がいらっしゃったらご教示ください。よろしくお願いします。
以下バージョン情報です。
(IDEの設定はあまり覚えてないのですが多分5,6箇所変えてるかと思います(ShowGridとか)。)
---
Microsoft Visual Studio 2005
Version 8.0.50727.42 (RTM.050727-4200)
Microsoft .NET Framework
Version 2.0.50727インストールされている Edition: VB Express
Microsoft Visual Basic 2005 76541-000-0000011-00124
Microsoft Visual Basic 2005
---
Windows XP Professional Version 2002 Service Pack 2
---
Office Professional Edition 2003 の一部
Access 2003 (11.6566.8122) SP2
---
end
回答
-
列の順序が入れ替わったタイミングで、それぞれの列のDisplayIndexはどうなっていますでしょうか?
もし、表示順に正しくインデックスが振られているようですと、以下の最後から2番目のMark Rideout氏の書き込みが参考になるかもしれません。(以下はビジネスオブジェクトの場合ですが)DataGridView columns in designer
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=319362&SiteID=1また、プログラムでDisplayIndexを振ることもできますので、そちらの方法でも良いかもしれません。
すべての返信
-
列の順序が入れ替わったタイミングで、それぞれの列のDisplayIndexはどうなっていますでしょうか?
もし、表示順に正しくインデックスが振られているようですと、以下の最後から2番目のMark Rideout氏の書き込みが参考になるかもしれません。(以下はビジネスオブジェクトの場合ですが)DataGridView columns in designer
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=319362&SiteID=1また、プログラムでDisplayIndexを振ることもできますので、そちらの方法でも良いかもしれません。
-
大変参考になる情報ありがとうございます。
DisplayIndexの値は以下の通りでした。(正しい順序:左からField01, Column1の順。)
入れ替わる前:Field01 = 0, Column1 = 1
入れ替わった後:Field01 = 1, Column1 = 0 (※実行時には並びが正しくなるのですが、更に列の編集を行うと次の実行時に入れ替わるようです。この時の値です。)
この値を実行時にプログラムで振り直すと希望通りの順序で表示されました。
(デザイナ上では入れ替わったままですが、用途によってはこれでも十分です。)また、Mark Rideout氏の方法でも正しい順序で表示できました。こちらはデザイナ上でも入れ替わりません。
一時的にですがDataSouceを(なし)にしているのでこの辺りの検証が必要かもしれませんが、今のところ問題なく動いているようです。・DGV の DataSource を (なし)にする
・「列の編集」→非バインド列で「Field01」と「Column1」を追加
・バインドしたい列(Field01)のDataPropertyNameにフィールド名をキーボードから直接打ち込む(Field01)
・Form1_Load に以下のコードを追加する
Table01DataGridView.AutoGenerateColumns = False
Table01DataGridView.DataSource = Table01BindingSource