3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net)DataGridViewで列、高さ自動設定の注意。

行の場合、DataGridView.AutoSizeRowsModeプロパティ
列の場合、DataGridView.AutoSizeColumnsModeプロパティで
指定できますが、これらのプロパティでNone以外の値指定すると、セルの値が変わったときに自動的に変更になるので、表示データが多い場合、パフォーマンスがよろしくありません。また、このプロパティを指定するとユーザが手動で列や行の幅を変更することができなくなります。

ということ、DataGridViewには1回だけサイズ自動調整する
DataGridView.AutoResizeRows()
DataGridView.AutoResizeColumns()
というメソッドが用意されてます。

今回はこれにやられました。

メインのフォームでデータ作成し、サブフォームのDataGridVewで表示するという流れです。
最初こんな感じで書いていました。サブフォーム名は frmDataExt と、DataGridViewはVSのデザイナで作成してます。

'結果表示するフォームの生成と設定
Dim frmDataExt As New frmDataExtract()
'DataGridView上の各種設定
frmDataExt.dgvExtract.DataSource = dtbl 'DataTableをデータソースに設定
'行の高さを1回だけ自動的に調整する
frmDataExt.dgvExtract.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells)
'結果表示するフォームを表示
frmDataExt.ShowDialog()

しかし、これだとうまくいきませんでした。行の高さが全然自動的に調整されていないのです。

それで、いろいろ試してみた結果、フォームが表示されないと AutoResizeRows() は使えないということがわかりました。
具体的なタイミングは未調査ですが、サブフォームの LoadイベントでAutoResizeRows()を処理すると自動的に調整されました。

'親フォーム側
'結果表示するフォームの生成と設定
Dim frmDataExt As New frmDataExtract()
'DataGridView上の各種設定
frmDataExt.dgvExtract.DataSource = dtbl 'DataTableをデータソースに設定
'結果表示するフォームを表示
frmDataExt.ShowDialog()

 

'サブフォーム側
Public Class frmDataExtract
    'Loadイベントに書くとうまくいった
    Private Sub frmDataExtract_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'グリッドの行の高さ自動調整
        Me.dgvExtract.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells)
    End Sub
End Class