C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

DataGridViewのセルインデックス順?について /モモ (23/10/04(Wed) 10:07) #102451
Re[1]: DataGridViewのセルインデックス順?について /魔界の仮面弁士 (23/10/04(Wed) 11:37) #102452
  └ Re[2]: DataGridViewのセルインデックス順?について /モモ (23/10/04(Wed) 13:14) #102453 解決済み


親記事 / ▼[ 102452 ]
■102451 / 親階層)  DataGridViewのセルインデックス順?について
□投稿者/ モモ (1回)-(2023/10/04(Wed) 10:07:42)

分類:[C#] 

DataGridView1.Rows[i].Cells
で取得できるセルインデックス(列)の順は何で決定されるのでしょうか。
DataGridViewに新列を追加するとデザイナで指定した順番とCellsコレクションのインデックスが一致しておらずセルに対する処理部分で弊害が出ています。
デザイナで指定した順番でenumを定義しており、各所で使用しています。
ちなみによくあるColumnIndexではColumnsコレクションは変更されてもCellsは変更されませんでした。

デザイナーファイル
xxxxx.designer.cs
を見ましたが、各項目は順番通りに定義されています。
Cellsコレクション(順序)を変更する?にはどこを修正すればいいか教えていただけると幸いです。
何卒よろしくお願いいたします。
[ □ Tree ] 返信 編集キー/

▲[ 102451 ] / ▼[ 102453 ]
■102452 / 1階層)  Re[1]: DataGridViewのセルインデックス順?について
□投稿者/ 魔界の仮面弁士 (3700回)-(2023/10/04(Wed) 11:37:35)
No102451 (モモ さん) に返信
> DataGridView1.Rows[i].Cells

dataGridView1.Rows[y].Cells[x] や
dataGridView1[x, y] によるアクセスは、極力使用しないでください。

行番号に依存したソースは、ソート時の影響を受けてしまいますし、
共有行が解除されてしまうといったパフォーマンス面の問題もあります。

基本的には .DataSource に割り当てたオブジェクトを読み書きするようにし、
DataGridView の個々の Rows への直接アクセスは控えるようにします。

たとえば DataSet/DataTable をデータバインドしている場合は、
 DataRow row = ((DataRowView)dataGridView1.CurrentRow?.DataBoundItem).Row;
のようにして、バインド元の行にアクセスすることもできます。

セルのフォントや色を変えたいような場合も、セル単位で個別に割り当てるのではなく、
「列単位」「奇数行単位」などの大きな単位で割り当てるようにします。
https://dobon.net/vb/dotnet/datagridview/cellstyle.html

もっとも非バインド列に対しては、セル値を直接参照するしかないですけれどね。


データ依存でスタイルを変えたい場合は、CellFormatting イベントにて
e.CellStyle のみを操作するのが良いでしょう。
https://dobon.net/vb/dotnet/datagridview/cellformatting.html


> DataGridViewに新列を追加するとデザイナで指定した順番とCellsコレクションのインデックスが一致しておらずセルに対する処理部分で弊害が出ています。
DataGridView の AutoGenerateColumns が、既定値の true になっていると思いますが、
これにより、DataSouce に指定したオブジェクトの内容に応じて、列が増減することになります。
https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.datagridview.autogeneratecolumns

自動生成に任せるか、false にして手動割り当てするかは任意ですが、
列番号が安定しない場合は、列名でアクセスするというのも一つの選択肢かともいます。
各列の Name を明示することで、実行時に
 dataGridView1.Rows[y].Cells["列名"]
 dataGridView1["列名", y]
によるアクセスが可能です。これなら、AllowUserToOrderColumns の影響を受けにくいというメリットもあります。

列オブジェクトのインスタンスをそのまま使って、
 dataGridView1[列.ColumnIndex, y]
のようにアクセスすることもできますね。
[ 親 102451 / □ Tree ] 返信 編集キー/

▲[ 102452 ] / 返信無し
■102453 / 2階層)  Re[2]: DataGridViewのセルインデックス順?について
□投稿者/ モモ (3回)-(2023/10/04(Wed) 13:14:46)
No102452 (魔界の仮面弁士 さん) に返信

なるほど承知いたしました。
よく分かる解説でとても助かりました。
本当にありがとうございました。
解決済み
[ 親 102451 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -