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

わんくま同盟

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

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

■102452 / 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]
のようにアクセスすることもできますね。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←DataGridViewのセルインデックス順?について /モモ →Re[2]: DataGridViewのセルインデックス順?について /モモ
 
上記関連ツリー

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

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信