■102452 / inTopicNo.2) |
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] のようにアクセスすることもできますね。
|
|