none
DataGridViewで改行可能にした場合の自動サイズ調整について RRS feed

  • 質問

  •  

    いつもお世話になります。

     

    DataGridViewで、いくつかの任意列のDefaultCellStyleのWrapModeを「True」にして、

    DataGridViewのAutoSizeColumnsModeとAutoSizeRowsModeを「AllCells」に

    したときに、行の高さはうまく自動調整されるのですが、列の幅がデータ内容にあった幅に

    調整されないのです(幅が狭くなります)。そのため、自分が改行して欲しい文字列の位置と

    違う位置で改行されて表示されてしまいます。

    改行は「Shift+Enter」で入力しています。

    入力するデータの改行の数は、セルによって様々です。(しない場合もあります)

     

    これをうまく表示させる方法はあるのでしょうか?

    よろしくお願いします。

     

    開発環境:WindowsXP SP2 + VB2005 ExpressEdition + MDB(Access2000)

     

     

    2008年3月7日 2:41

回答

  • WrapModeをtrueにするということは、列の幅が固定されていなければ意味がありません。列の幅が自動拡張されて文字列が全て1行で表示されるようになるとすれば、WrapModeをtrueにする意味がないからです。

    列のAutoSizeModeがNotSetの場合、DataGridViewのAutoSizeColumnsModeがその列に適用されます。この時、その列のWidthはヘッダ文字列長より自動的に計算されて固定値として設定され、WrapModeがTrueの場合、このWidthを基準にして文字列が折り返されるようです。
    これを避けるには、列のAutoSizeModeをNoneにして、列のWidthに固定値を指定します。

     

    繰り返しになりますが、WrapMode = trueが意味を持つには、その基準となる列の固定のWidthが必要なのでしょう。

    2008年3月10日 6:43
    モデレータ

すべての返信

  • 簡単にこちらで試してみましたが再現しませんでした。何かの条件が重なっているのでしょう。にゅうさんの方でテスト用に簡単なフォームを作成し、そこで再現する最低限の状況をご提示願えますか? そのテスト用フォームを作成する段階で、何かに気づかれるかもしれません。

    2008年3月10日 2:01
    モデレータ
  • trapemiyaさんのアドバイスに従い、

    テストとして新しいプロジェクトを作り、Form1上にDataGridView1を作成し、

    DataGridView1に列「Column1」~「Column2」を作成しました。

     

    DataGridView1の「AutoSizeColumnsMode」を「AllCells」に

               「AutoSizeRowsMode」を「AllCells」にしました。

     

    Column1~Column2の「DefultCellStyle」中の「WrapMode」を「True」にしました。

     

    上記設定にて実行したDataGridView1にデータを入力したところ、

     

     Column1           Column2 

    おはようござい  あいさつ 

    ます         朝

     

    と、Column1には途中に改行を入れていないのに2行表示になってしまいます。

    これを

     

           Column1      Column2

    おはようございます     あいさつ

                   朝

     

    と表示したいのですが、うまくいきませんでした。

     

    設定は上記のものしか変更していません。

    こちらの設定の仕方がまずいのでしょうか?

    2008年3月10日 5:29
  • WrapModeをtrueにするということは、列の幅が固定されていなければ意味がありません。列の幅が自動拡張されて文字列が全て1行で表示されるようになるとすれば、WrapModeをtrueにする意味がないからです。

    列のAutoSizeModeがNotSetの場合、DataGridViewのAutoSizeColumnsModeがその列に適用されます。この時、その列のWidthはヘッダ文字列長より自動的に計算されて固定値として設定され、WrapModeがTrueの場合、このWidthを基準にして文字列が折り返されるようです。
    これを避けるには、列のAutoSizeModeをNoneにして、列のWidthに固定値を指定します。

     

    繰り返しになりますが、WrapMode = trueが意味を持つには、その基準となる列の固定のWidthが必要なのでしょう。

    2008年3月10日 6:43
    モデレータ
  •  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 Single

     

    For 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

2008年3月11日 4:08
  • こんにちは。中川俊輔 です。

     

    trapemiyaさん、回答ありがとうございます。

     

    にゅうさん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、trapemiyaさんの回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    にゅうさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年3月18日 1:31
  • すいません。チェックし忘れてました。

     

    trapemiyaさん、中川俊輔さん

    改めて御礼を申し上げます。

    2008年3月19日 9:25