- 題名: DataGridの列の幅を文字列の幅に合わせて複数列を自動的に調節する
- URL: http://homepage3.nifty.com/e-nethatano/
- 日時: 2006/03/30 16:36:39
- ID: 15123
- この記事の返信元:
- (なし)
- この記事への返信:
- [15129] Re[1]: DataGridの列の幅を文字列の幅に合わせて複数列を自動的に調節する2006/03/31 0:09:01
- [15132] Re[1]: DataGridの列の幅を文字列の幅に合わせて複数列を自動的に調節する2006/03/31 10:09:04
- ツリーを表示
分類:[.NET]
始めまして普通の会社員と申します。
日本語プログラム言語「ひまわり」から「VB.NET」へ転進しているところです。
以下、For文でチャレンジしたのですが、解決できませんでしたので、何方か助けていただけたら幸いです。
DataGridコントロールのTipsに掲載されています「DataGridの列の幅を文字列の幅に合わせて自動的に調節する」を活用させて頂こうかと思い、21フィールドあるDataGridに対応させる編集を行なっています。
その際に、例外検出の為に「MsgBox(ex.Message)」を埋め込みましたところ、検索2回目から、「このデータグリッドのテーブルスタイルコレクションには既に同じマップ名のテーブルスタイルが含まれています。パラメータ名:table」と言うメッセージが返って着て、Grid幅の自動調節はされていませんでした。
Forを行なうことで、マップ名が重複することが関係していことは分りますが、どうしたら良いか困っています。
解決方法をご教示頂けないでしょうか?
以下、検討しているソースです。
Dim dtTable As DataTable
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'▼文字列の幅に合わせてDataGrid列幅を自動調整を呼び出す
Dim i As Integer
'新しいDataGridTableStyleの作成
Dim ts As New DataGridTableStyle
'マップ名を指定する
ts.MappingName = "ThkData"
'DataGridTableStyleをDataGridに追加する
'DataGridColumnStyleを追加せずにDataGridTableStyleを追加すると、
'DataGridColumnStyleオブジェクトのコレクションが自動的に作成される
DataGrid1.TableStyles.Add(ts)
For i = 0 To 21
AutoSizeColumnWidth(DataGrid1, i)
Next i
'▲ここまで
End Sub
Public Shared Sub AutoSizeColumnWidth(ByVal DataGrid1 As DataGrid, ByVal column As Integer)
'DataGridのGraphicsを取得
Dim g As Graphics = Graphics.FromHwnd(DataGrid1.Handle)
'すべてのセルを調べて、一番広い幅を取得
Dim sf As New StringFormat(StringFormat.GenericTypographic)
Dim dtTable As DataTable = CType(DataGrid1.DataSource, DataTable)
Dim rowsCount As Integer = dtTable.Rows.Count
Dim maxWidth As Single
Dim i As Integer
If rowsCount > 0 Then
For i = 0 To rowsCount - 1
Dim [text] As String = DataGrid1(i, column).ToString()
maxWidth = Math.Max(g.MeasureString( _
[text], DataGrid1.Font, DataGrid1.Width, sf).Width, maxWidth)
Next i
Dim cs As DataGridColumnStyle
cs = DataGrid1.TableStyles(dtTable.TableName).GridColumnStyles(column)
'破棄
g.Dispose()
'幅の変更
cs.Width = CInt(maxWidth) + 10
End If
End Sub
以上、宜しくお願いします。