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

Datagrid コントロールの列幅の調整方法について

環境/言語:[Windows XP、VS2002,]
分類:[.NET]

お早うございます。平ちゃんです。本日も宜しくお願いします。

10列あるDatagrid コントロールの最後の列幅を調整しピタッと収まるようにしたいのですが上手くできません。

次のようにすると上手くいく筈なんですが、垂直スクロールバーの分だけ幅が広くなります。

最後の列幅 = Datagrid.ClientSize.Width - (RowHeader.Width + 1〜9列幅の合計)

本サイト、Web で検索しましたが見つかりません。すみませんがアドバイスをお願いします。
スクロールバーのサイズだと確信があって、いつもそうなるなら、
スクロールバーのサイズ分を引いてやるべきかと。

まぁマニュアルによればClientSizeについての解説は
「
    コントロールのクライアント領域とは、コントロールの範囲から、
    スクロール バー、境界線、タイトル バー、メニューなどのクラ
    イアント以外の要素を除いた部分です。
」
ってなってるので、スクロールバーのサイズが含まれているのにはちょっと
納得いかないってところでしょうか・・・。

垂直スクロールバーの幅は、SystemInformation内を探してみてください。(すぐ見つかるけど。)

(何か、微妙な回答ですね・・・。)
■No8941に返信(こど。さんの記事)

こどさん 回答有難うございます。
SystemInformation.VerticalScrollBarWidth て知りませんでした。
(SystemInformationクラスも欲しかった情報です。)

さて
SystemInformation.VerticalScrollBarWidth を使用して
最後の列幅 = Datagrid.ClientSize.Width - (RowHeader.Width + 1〜9列幅の合計 + SystemInformation.VerticalScrollBarWidth)
としてみました。
しかし若干(ほんの少し)広く やはり水平スクロールバーが表示されてしまいます。
また表示行数が少なくて垂直スクロールバーがない状態ですと今度は幅が足りない表示となってしまいます。

きちんと幅を計算するには
微妙な補正値を実験で見つけ、画面の表示行数で垂直スクロールバーが有る、無しを判断して、計算させるという事が必要なんでしょうかねぇ。


> まぁマニュアルによればClientSizeについての解説は
> 「
> コントロールのクライアント領域とは、コントロールの範囲から、
> スクロール バー、境界線、タイトル バー、メニューなどのクラ
> イアント以外の要素を除いた部分です。
> 」
> ってなってるので、スクロールバーのサイズが含まれているのにはちょっと
> 納得いかないってところでしょうか・・・。
>

そうなんですよ。この通りであれば何も苦労しなくていいんですが。

(お詫び)
質問時に垂直スクロールバーの幅と書いたのはどうも私の勘違いと思います。垂直スクロールバーの幅にほぼ近いと訂正します。失礼しました。
> きちんと幅を計算するには
> 微妙な補正値を実験で見つけ、画面の表示行数で垂直スクロールバーが有る、無しを判断して、計算させるという事が必要なんでしょうかねぇ。

 微妙な補正値って‥‥(^_^;)
 BorderStyle を None にすれば計算があうのではないでしょうか? 境界線の幅を計算に入れていない分ずれが生じているのだと思います。
 線幅は BorderWidth プロパティで取得できるようですが、これはプライベート メンバです。( BorderStyle.None 以外にするなら)線幅は 2 として固定で計算しても、恐らく差し支えはないでしょう。
#計算する際は両端分引くのを忘れないでくださいね。

 垂直スクロールバーについては VertScrollBar プロパティから取得して Visible を見るほうが確実かと。
 VisibleRowCount プロパティでは行の一部のみ表示されるものもカウントされます。このため数的には収まっていても垂直スクロールバーが表示される、ということがあり得ますから。
#データグリッドのサイズ並びに行の高さ固定で、且つ行の一部が表示されることのないようなサイズでデザインされていれば問題ないでしょうけど。

#もしデータグリッドのサイズや列幅が可変なら他にも考慮しなけばならないことがあるでしょう。
■No8998に返信(深山さんの記事)

深山さん いつも有難うございます。
早速試してみます。
結果は報告させて頂きます。
2005/02/09(Wed) 12:34:09 編集(投稿者)
2005/02/09(Wed) 12:32:47 編集(投稿者)
2005/02/09(Wed) 12:31:48 編集(投稿者)

■No8998に返信(深山さんの記事)

深山さん こんにちは

深山さんの仰るとおり微妙な補正値はBorderStyleに関するものでした。

VertScrollBar プロパティは何故 プロテクトプロパティ なんでしょうか?
普通のプロパティにしてくれた方が使い勝手が良いと思うのですが。

深山さんのアドバイスを元に次のように実装しました。

DataGrid を継承したMyDataGridクラスを作りその中で
 VertScrollBar による垂直スクロールバーの有無を確認しwvに幅をセット 
 BorderStyle の種類を確認し補正値幅( = 2*2)をwbにセット
 Me.ClientSize.Width - wv-wb を返す ReadOnly Property ClientWidth() As Integerを作成

 
MyDataGrid のオブジェクト DataGrid1のPaintイベントで上記ClientWidthを呼び出し
ClientWidth-(RowHeader.Width + 1〜9列幅の合計)を計算させる。


以上で 垂直スクロールバー、BorderStyle、RowHeaderに関係なくピタッと列幅が合うようになり見栄えが断然よくなりました。

いつも的確なアドバイス有難うございます。
解らないことが多くてすみませんが今後とも宜しくお願いします。
解決済み!

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