- PR -

DataGridViewのセルの表示を単語単位に折り返される挙動を変更したい

1
投稿者投稿内容
96
会議室デビュー日: 2005/06/09
投稿数: 17
投稿日時: 2008-09-24 13:47
改行を含む編集可能なセルに文字を入力し、確定した際、単語単位に
折り返される挙動を単語単位ではなく、以下のような(※1)端に来たら
折り返すような挙動にしたいのですが、可能でしょうか?
無理な場合、端に来たら改行を入れるとかしないと駄目かなと思っています。

(※1)を参考にして作成したカスタムTextBoxを(※2)を参考にして
DataGridViewに表示し、編集中は希望の動きとなるのですが、編集が終わって
表示される文字は、単語単位に表示されてしまい困っています。

DataGridViewの表示とカスタムTextBoxは画面上で共存している為、
出来るだけ挙動を統一したいのです。

よろしくお願いします。


(※1)TextBoxの表示が単語単位に自動改行される挙動を変更したい
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=37654&forum=7&7

(※2)DataGridViewにMaskedTextBoxを表示する
http://dobon.net/vb/dotnet/datagridview/maskedtextboxcolumn.html

<環境>
OS:WindowsXP
C#(.NET Framework3.5 Windowフォーム)
からあげ
会議室デビュー日: 2007/12/13
投稿数: 19
投稿日時: 2008-09-25 18:23
Cellの描画を自前でやればいいのではないでしょうか?

DataGridViewTextBoxCellのPaintメソッドあたりで、
セル幅に収まるように文字を切って表示してあげればいいと思います。

#個人的にはWrapMode=Trueの動きでも何の問題もないと思いますが。
からあげ
会議室デビュー日: 2007/12/13
投稿数: 19
投稿日時: 2008-09-25 19:08
作ってみました。こんな感じでしょうか。VB派なので、VBで。
プロジェクトを新規作成して、フォームにButton、DataGridViewを貼り付け、
下のコードに差し替えれば動くと思います。
中段あたりのCellTemplateを切り替えれば、その違いがわかると思います。
即興で作ったのでコードが汚いのはご愛敬。エラー処理もありません。
セルの幅をすごく小さくするとおかしくなるけど、見なかったことにしましょう

コード:

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
Dim cellStyle As New DataGridViewCellStyle()
cellStyle.WrapMode = DataGridViewTriState.True
DataGridView1.DefaultCellStyle = cellStyle

Dim col As New DataGridViewTextBoxColumnCustom()
col.Name = "CUSTOMCOLUMN"
DataGridView1.Columns.Add(col)

DataGridView1.RowCount = 3

DataGridView1.Item("CUSTOMCOLUMN", 0).Value = "visual studio 2005 professional edition"
DataGridView1.Item("CUSTOMCOLUMN", 1).Value = "Insider.NET 会議室"
DataGridView1.Item("CUSTOMCOLUMN", 2).Value = "DataGridViewのセルの表示を単語単位に折り返される挙動を変更したい"
End Sub
End Class

Public Class DataGridViewTextBoxColumnCustom
Inherits DataGridViewTextBoxColumn

Public Sub New()
CellTemplate = New DataGridViewTextBoxCellCustom()
'CellTemplate = New DataGridViewTextBoxCell()
End Sub
End Class

Public Class DataGridViewTextBoxCellCustom
Inherits DataGridViewTextBoxCell

Protected Overrides Sub Paint(ByVal graphics As System.Drawing.Graphics, _
ByVal clipBounds As System.Drawing.Rectangle, _
ByVal cellBounds As System.Drawing.Rectangle, _
ByVal rowIndex As Integer, _
ByVal cellState As System.Windows.Forms.DataGridViewElementStates, _
ByVal value As Object, _
ByVal formattedValue As Object, ByVal errorText As String, _
ByVal cellStyle As System.Windows.Forms.DataGridViewCellStyle, _
ByVal advancedBorderStyle As System.Windows.Forms.DataGridViewAdvancedBorderStyle, _
ByVal paintParts As System.Windows.Forms.DataGridViewPaintParts)
Dim cutStringList As New List(Of String)
Do
Dim cutStr As String = String.Empty
For idx As Integer = formattedValue.Length To 0 Step -1
cutStr = formattedValue.Substring(0, idx)
Dim wkWidth As Integer = Convert.ToInt32(graphics.MeasureString(cutStr, cellStyle.Font).Width)
If wkWidth < cellBounds.Width - 4 Then Exit For
Next
formattedValue = formattedValue.Replace(cutStr, String.Empty)
cutStringList.Add(cutStr)
Loop While (formattedValue.Length > 0)

formattedValue = cutStringList(0)
For idx As Integer = 1 To cutStringList.Count - 1
formattedValue = formattedValue + System.Environment.NewLine + cutStringList(idx)
Next

MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, _
errorText, cellStyle, advancedBorderStyle, paintParts)
End Sub
End Class



[ メッセージ編集済み 編集者: からあげ 編集日時 2008-09-25 19:09 ]
96
会議室デビュー日: 2005/06/09
投稿数: 17
投稿日時: 2008-09-29 20:32
お返事ありがとうございます。
レスが遅れ、大変申し訳ありません。

ソースの提示までして頂いたのですが、仕様上、入力値そのものに
意味が発生してしまい、改行を安易に入れて表示を同じようにすると
いう案では対応できなくなってしまいました。

同じようにする方法をネットで探しはしてみましたが、なかなか見つからず、
時間の関係上、今回は現状維持で行く事にしました。

本当にお返事が遅れてしまい、申し訳ありませんでした。
1

スキルアップ/キャリアアップ(JOB@IT)