トップ回答者
DataGridViewで改行可能にした場合の自動サイズ調整について

質問
-
いつもお世話になります。
DataGridViewで、いくつかの任意列のDefaultCellStyleのWrapModeを「True」にして、
DataGridViewのAutoSizeColumnsModeとAutoSizeRowsModeを「AllCells」に
したときに、行の高さはうまく自動調整されるのですが、列の幅がデータ内容にあった幅に
調整されないのです(幅が狭くなります)。そのため、自分が改行して欲しい文字列の位置と
違う位置で改行されて表示されてしまいます。
改行は「Shift+Enter」で入力しています。
入力するデータの改行の数は、セルによって様々です。(しない場合もあります)
これをうまく表示させる方法はあるのでしょうか?
よろしくお願いします。
開発環境:WindowsXP SP2 + VB2005 ExpressEdition + MDB(Access2000)
回答
-
WrapModeをtrueにするということは、列の幅が固定されていなければ意味がありません。列の幅が自動拡張されて文字列が全て1行で表示されるようになるとすれば、WrapModeをtrueにする意味がないからです。
列のAutoSizeModeがNotSetの場合、DataGridViewのAutoSizeColumnsModeがその列に適用されます。この時、その列のWidthはヘッダ文字列長より自動的に計算されて固定値として設定され、WrapModeがTrueの場合、このWidthを基準にして文字列が折り返されるようです。
これを避けるには、列のAutoSizeModeをNoneにして、列のWidthに固定値を指定します。繰り返しになりますが、WrapMode = trueが意味を持つには、その基準となる列の固定のWidthが必要なのでしょう。
すべての返信
-
trapemiyaさんのアドバイスに従い、
テストとして新しいプロジェクトを作り、Form1上にDataGridView1を作成し、
DataGridView1に列「Column1」~「Column2」を作成しました。
DataGridView1の「AutoSizeColumnsMode」を「AllCells」に
「AutoSizeRowsMode」を「AllCells」にしました。
Column1~Column2の「DefultCellStyle」中の「WrapMode」を「True」にしました。
上記設定にて実行したDataGridView1にデータを入力したところ、
Column1 Column2
おはようござい あいさつ
ます 朝
と、Column1には途中に改行を入れていないのに2行表示になってしまいます。
これを
Column1 Column2
おはようございます あいさつ
朝
と表示したいのですが、うまくいきませんでした。
設定は上記のものしか変更していません。
こちらの設定の仕方がまずいのでしょうか?
-
WrapModeをtrueにするということは、列の幅が固定されていなければ意味がありません。列の幅が自動拡張されて文字列が全て1行で表示されるようになるとすれば、WrapModeをtrueにする意味がないからです。
列のAutoSizeModeがNotSetの場合、DataGridViewのAutoSizeColumnsModeがその列に適用されます。この時、その列のWidthはヘッダ文字列長より自動的に計算されて固定値として設定され、WrapModeがTrueの場合、このWidthを基準にして文字列が折り返されるようです。
これを避けるには、列のAutoSizeModeをNoneにして、列のWidthに固定値を指定します。繰り返しになりますが、WrapMode = trueが意味を持つには、その基準となる列の固定のWidthが必要なのでしょう。
-
trapemiya さんからの引用 WrapModeをtrueにするということは、列の幅が固定されていなければ意味がありません。列の幅が自動拡張されて文字列が全て1行で表示されるようになるとすれば、WrapModeをtrueにする意味がないからです。
繰り返しになりますが、WrapMode = trueが意味を持つには、その基準となる列の固定のWidthが必要なのでしょう。
ありがとうございます。プロパティで設定するのは無理なようですね・・・
代替案として、列ごとの最大文字幅を取得してその幅を列に設定するようにしようと思います。
とりあえず、下記コードで希望どおりに表示できたのですが、
もしもっと良い方法があればアドバイスお願いします。
Private Sub DataGridView1_DataBindingComplete(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles DataGridView1.DataBindingComplete
Dim g As Graphics = DataGridView1.CreateGraphics
Dim ColWidth(DataSet1.Table1.Columns.Count - 1) As Single
Dim StrWidth As SingleFor Each DR As DataRow In DataSet1.Table.Rows
For i As Integer = 0 To DataSet1.Table1.Columns.Count - 1
If Not IsDBNull(DR(i)) Then
StrWidth = g.MeasureString(DR(i), DataGridView1.DefaultCellStyle.Font).Width
If ColWidth(i) < StrWidth Then ColWidth(i) = StrWidth
End If
Next
Next
For i As Integer = 0 To DataGridView1.ColumnCount - 1
DataGridView1.Columns(i).Width = ColWidth(i)
Next
End Sub