DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridの列の幅を文字列の幅に合わせて複数列を自動的に調節する

環境/言語:[Windows2000 VB.NET(2003)]
分類:[.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

以上、宜しくお願いします。
Addする前に、同名のものが既存ならDataGrid1.TableStylesから
削除すればよいのでは?(消えませんか?)
'新しいDataGridTableStyleの作成
Dim ts As New DataGridTableStyle
'マップ名を指定する
ts.MappingName = "ThkData"
'DataGridTableStyleをDataGridに追加する
'DataGridColumnStyleを追加せずにDataGridTableStyleを追加すると、
'DataGridColumnStyleオブジェクトのコレクションが自動的に作成される
DataGrid1.TableStyles.Add(ts)

上の部分は一度だけ設定すれば良いので、Page_Loadなどで行ってしまえばいいんじゃないでしょうか?
こど。さん、trapemiyaさん、ご回答ありがとうございます。
Load時に処理を持っていったところ、問題なく繰り返すことが出来ました。
大変ありがとうございました。
今後も宜しくお願いします。
解決済み!
関連で質問です。

最初は、AccessのMDBファイルを使うことから、OelDataAdpterをつかっていましたが、オラクルデータベースを使用していましたので、OrcleDataAdpterでDataSetに切り替えたました。
OracleSelectCommand1.CommandTextにSELECT文を入れ、OracleDataAdapter1.Fill(DataSet11)にてDataGrid1へ表示させるようにしました。

ところが、前回解決したはずの「DataGridの列の幅を文字列の幅に合わせて複数列を自動的に調節する」が、引っかかってしまいました。
「指定されたキャストは有効ではありません」と怒られます。

Tryを外すと、「Dim dtTable As DataTable = CType(DataGrid1.DataSource, DataTable)」の文の背景色は黄色になります。
どなたか、宜しくお願いします。

DOBON.NET | プログラミング道 | プログラミング掲示板