トップ回答者
DataGridViewのセル結合

質問
-
ネットで色々調べたのですが、どうにもうまくいかないので教えてください。
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列目にはみ出して、全テキスト表示されますでしょうか。よろしくお願いします。
回答
-
こんにちは。
コードからの推測ですが、列ヘッダの結合で良いですよね?
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
※ヘッダ結合をしたことがないのでアプローチとして正しいのかどうかについてはなんとも…。
- 編集済み Tak1waMVP, Moderator 2015年5月1日 6:35
- 回答としてマーク kamata5191 2015年5月1日 8:18
- 回答としてマークされていない kamata5191 2015年5月1日 8:19
- 回答としてマーク kamata5191 2015年5月1日 8:20
すべての返信
-
こんにちは。
コードからの推測ですが、列ヘッダの結合で良いですよね?
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
※ヘッダ結合をしたことがないのでアプローチとして正しいのかどうかについてはなんとも…。
- 編集済み Tak1waMVP, Moderator 2015年5月1日 6:35
- 回答としてマーク kamata5191 2015年5月1日 8:18
- 回答としてマークされていない kamata5191 2015年5月1日 8:19
- 回答としてマーク kamata5191 2015年5月1日 8:20
-
kamata5191 さま よろしく。
DataGridView の列の Name が DataGridViewTextBoxColumn1 だとして、
Me.DataGridViewTextBoxColumn1.DefaultCellStyle.WrapMode = DataGridViewTriState.True
で、複数行での表示になる筈ですが。
ただし、このままでは、標準の Row の高さでの表示になり、一部、隠されるかも知れません。
その場合でも、Mouse Hover では、保持されたデータを切れる事無く、表示します。正しく、ご質問の意味を理解していなかったら、勘弁して下さい。
-
おお!できました。
コードからは判断できなかったと思いますが、結合したかったのは、実はヘッダ以外の行でした。
そして、1列目が空でないときは、2列目以降は空という使い方なので、
1列目以外だったら、すべて Exit Sub してしまっていました。
空でも e.Handled = True しなければいけなかったのですね。
おかげで解決できました。ありがとうございました。
- 回答としてマーク kamata5191 2015年5月1日 8:19
- 回答としてマークされていない kamata5191 2015年5月1日 8:20