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

ヘッダーテキストをフルに表示するDataGridViewの列幅を求める

環境/言語:[Vista, C#, VS2005]
分類:[.NET]

2009/09/10(Thu) 17:40:39 編集(投稿者)

DataGridViewでヘッダーテキストをフルに表示する列幅を求めようとして、
以下のようにして、テキスト幅と列幅の関係を調べてみました。
(DataGridViewのヘッダーはWordwrapしないように設定しています。)

    // ヘッダーテキスト幅と列幅の関係を調べる
        private void mitemWidthCheck_Click(object sender, EventArgs e)
        {
            // dgv:DataGridViewオブジェクト
            DataGridViewCell cell = dgv.Columns[2].HeaderCell;
            Graphics g = dgv.CreateGraphics();
            Font f = dgv.Font;
            Size x = DataGridViewCell.MeasureTextSize(g, (string)cell.Value,
                         f,TextFormatFlags.SingleLine);
            StringBuilder msg = new StringBuilder();
            msg.Append("Header Text =" + (string)cell.Value + "\n");
            msg.Append("column width =" + dgv.Columns[2].Width + "\n"); 
            msg.Append("cell size = " + cell.Size.Width+ "\n");
            msg.Append("cell padding left  = " + cell.Style.Padding.Left + "\n");
            msg.Append("cell padding right = " + cell.Style.Padding.Right + "\n");
            msg.Append("text size = " + x.Width + "\n");
            MessageBox.Show(msg.ToString());
            g.Dispose();
        }


★質問1 テキスト幅の調べ方はこれで良いでしょうか。Graphicsオブジェ
クトやFontオブジェクトについての知識はまったくありません。ほとんど
闇雲にコードを書いています。

★質問2 テキスト幅67の時、Column幅が73以上だと、テキストがフルに表
示されます。Column幅がそれより狭いと、テキストの一部が「...」で表示
されます。テキスト幅よりも、列幅が広いことが必要であることは雰囲気
的には分かりますが、その余裕がどのように定められているのか分かりま
せん。Paddingというプロパティがあるのでそれも調べてみましたが、その
幅はゼロでした。
■No25380に返信(とんびさんの記事)
> DataGridViewでヘッダーテキストをフルに表示する列幅を求めようとして、

実際に、DataGridView にテキストをセットしてみて、
DataGridViewAutoSizeColumnMode.ColumnHeader を
AutoResizeColumn(s) メソッドに指定することで、幅を測定するとか。
■No25381に返信(魔界の仮面弁士さんの記事)
> 実際に、DataGridView にテキストをセットしてみて、
> DataGridViewAutoSizeColumnMode.ColumnHeader を
> AutoResizeColumn(s) メソッドに指定することで、幅を測定するとか。

魔界の仮面弁士さん、有難う御座います。
Columnの後ろに"s"がつく以下のメソッドで全列を一度に処理する方法を試し
てみました。それなりの列幅が設定されるようです。
dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.ColumnHeader);

●疑問点
ただし、このメソッドで設定される列幅は、文字列の長さよりも25大きくなりま
す。この25がどこで定められているのか、Fontが違っても25なのか、分かりませ
ん。また、実際にはもっと列幅がせまくとも文字列を全部表示できますが、なぜ
25という余裕のある数値を設定するの良く分かりません。

●確認したいポイント
このメソッドを実行した後、ユーザーの列幅変更を許可したいのですが、なにも
しなくとも列幅変更許可の条件は変わっていないと考えて良いでしょうか。
■No25386に返信(とんびさんの記事)
> このメソッドで設定される列幅は、文字列の長さよりも25大きくなります。
列ヘッダをクリックすると、並び替えを行う事ができますよね。

その列の SortMode が Automatic/Programmatic の場合、列ヘッダの右端には
並び替え状況を表す▼または▲を表示するための領域が用意されます。

AutoResizeColumn(s) では、その分も考慮したサイズになっています。
NotSortable の場合にはこのアイコンは表示されないため、
この領域分は考慮されません。

なお、列ヘッダの幅や高さを測定する場合には、EnableHeadersVisualStyles の
設定によって、必要なサイズが変化する可能性がありますので注意してください。


> このメソッドを実行した後、ユーザーの列幅変更を許可したいのですが、なにも
> しなくとも列幅変更許可の条件は変わっていないと考えて良いでしょうか。
質問の意図が良く分かりませんが、それぞれの Resizable プロパティや AutoSizeMode プロパティの
値を変更しても、AutoResizeColumn(s) メソッドはそのまま利用できます。もちろん、列幅調整後に
これらのプロパティを変更する事もできます。
■No25388に返信(魔界の仮面弁士さんの記事)
> その列の SortMode が Automatic/Programmatic の場合、列ヘッダの右端には
> 並び替え状況を表す▼または▲を表示するための領域が用意されます。

魔界の仮面弁士さん、早速のお返事有難う御座います。なるほど、▲などを
表示するための領域を取っているんですね。

> 質問の意図が良く分かりませんが、それぞれの Resizable プロパティや

分かりにくい質問でごめんなさい。AutoResizeColumn(s) メソッドが、
ResizableやAutoSizeModeなどのプロパティに影響するかという質問です。どう
やら、メソッドはその場限りの動作であって、プロパティを変更させる事はな
いようですね。
魔界の仮面弁士さん、ありがとうございました。

列のSortModeをNotSortableに設定すると、列幅が文字幅+6で、
手動で文字がフルに表示されるぎりぎりの幅まで縮めて時と同
じになりました。これで期待する動きを作ることができると思
います。

また、いつかお世話になると思います。その節はよろしく。
解決済み!

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