none
DataGridViewのセル結合 RRS feed

  • 質問

  • ネットで色々調べたのですが、どうにもうまくいかないので教えてください。

    DataGridViewのセル結合は自前で、ということなので、CellPainting のイベント時に、

    1列目の処理として以下のようにしていますが、はみ出さないでセル長分しか表示されません。

    Dim rect As Rectangle = e.CellBounds
    Dim Brush As New SolidBrush(Me.dgvCompany.ColumnHeadersDefaultCellStyle.BackColor)
      rect.Width += dgvCompany.Columns(1).Width
      e.Graphics.FillRectangle(Brush, rect)
      TextRenderer.DrawText(e.Graphics, "あああああああああああああああああ", e.CellStyle.Font, rect, e.CellStyle.ForeColor, e.CellStyle.BackColor, TextFormatFlags.Left)
      e.Handled = True

    どのように修正すれば2列目にはみ出して、全テキスト表示されますでしょうか。よろしくお願いします。

    2015年5月1日 5:30

回答

  • こんにちは。

    コードからの推測ですが、列ヘッダの結合で良いですよね?
    2列目のヘッダ描画を行わなければ、とりあえずできそうですが。

    Private Sub dgvCompany_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs)
        If e.RowIndex = -1 AndAlso e.ColumnIndex = 0 Then
            Dim rect As Rectangle = e.CellBounds
            Dim Brush As New SolidBrush(Me.dgvCompany.ColumnHeadersDefaultCellStyle.BackColor)
            rect.Width += dgvCompany.Columns(1).Width
            e.Graphics.FillRectangle(Brush, rect)
            TextRenderer.DrawText(e.Graphics, "あああああああああああああああああ", e.CellStyle.Font, rect, e.CellStyle.ForeColor, e.CellStyle.BackColor, TextFormatFlags.Left)
            e.Handled = True
        ElseIf e.RowIndex = -1 AndAlso e.ColumnIndex = 1 Then
            e.Handled = True
        End If
    End Sub
    ※ヘッダ結合をしたことがないのでアプローチとして正しいのかどうかについてはなんとも…。


    2015年5月1日 6:34
    モデレータ

すべての返信

  • こんにちは。

    コードからの推測ですが、列ヘッダの結合で良いですよね?
    2列目のヘッダ描画を行わなければ、とりあえずできそうですが。

    Private Sub dgvCompany_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs)
        If e.RowIndex = -1 AndAlso e.ColumnIndex = 0 Then
            Dim rect As Rectangle = e.CellBounds
            Dim Brush As New SolidBrush(Me.dgvCompany.ColumnHeadersDefaultCellStyle.BackColor)
            rect.Width += dgvCompany.Columns(1).Width
            e.Graphics.FillRectangle(Brush, rect)
            TextRenderer.DrawText(e.Graphics, "あああああああああああああああああ", e.CellStyle.Font, rect, e.CellStyle.ForeColor, e.CellStyle.BackColor, TextFormatFlags.Left)
            e.Handled = True
        ElseIf e.RowIndex = -1 AndAlso e.ColumnIndex = 1 Then
            e.Handled = True
        End If
    End Sub
    ※ヘッダ結合をしたことがないのでアプローチとして正しいのかどうかについてはなんとも…。


    2015年5月1日 6:34
    モデレータ
  • kamata5191 さま よろしく。

    DataGridView の列の Name が DataGridViewTextBoxColumn1 だとして、

    Me.DataGridViewTextBoxColumn1.DefaultCellStyle.WrapMode = DataGridViewTriState.True

    で、複数行での表示になる筈ですが。
    ただし、このままでは、標準の Row の高さでの表示になり、一部、隠されるかも知れません。
    その場合でも、Mouse Hover では、保持されたデータを切れる事無く、表示します。

    正しく、ご質問の意味を理解していなかったら、勘弁して下さい。

    2015年5月1日 6:57
  • おお!できました。

    コードからは判断できなかったと思いますが、結合したかったのは、実はヘッダ以外の行でした。

    そして、1列目が空でないときは、2列目以降は空という使い方なので、

    1列目以外だったら、すべて Exit Sub してしまっていました。

    空でも e.Handled = True しなければいけなかったのですね。

    おかげで解決できました。ありがとうございました。

    • 回答としてマーク kamata5191 2015年5月1日 8:19
    • 回答としてマークされていない kamata5191 2015年5月1日 8:20
    2015年5月1日 8:19