質問: calendar.Size 'デバッグモードでSizeを直接見た場合とcalendarの中のsizeを見た場合で値が異なり、 'インスタンスを経由したあとに、再度Sizeを直接見ると値が反映されている。 f.Controls.Add(calendar) f.Show() End Sub End Class ``` ### 試したこと コンソールに出力した場合はSizeを直接見た場合の値が出力されます。 コントロールをDataGridViewやButtonに変えて確認したところ、特に問題はありませんでした。(Sizeに乖離がない) ### 補足情報(言語/FW/ツール等のバージョンなど) 環境は Windows7 VisualStudio2010 です。 また似たような問題がDataTableにおいても発生しております。 こちらはデータバインディングでDataTable型のプロパティの内容をDataGridViewに表示しているのですが、 プロパティを更新した後にデバッグモードでプロパティの値を直接確認しないとDataGridViewに反映されません。 (デバッグモードでプロパティの値を見ることで動作が変化するという共通点があるため一応この情報も載せておきました。) もしこの現象の原因や解決方法に心当たりがあれば教えていただけないでしょうか? よろしくお願いします。 追記 カレンダが載っているフォームのサイズに関してはAutoSizeModeをGrowAndShrink、AutoSizeをtureに変更することで解決できました。 ただデバッグモードでプロパティの値を見ることで動作が変化するという現象は解決できておりませんので引き続きお願いします。
回答: アップされているコードで f.Size = calendar.Size の行にブレークポイントを設定し、デバッグ実行してその行で実行を止め、マウスのカーソルを f.Size と calendar.Size の Size に置いたとき、大きさが違うと言ってますか? であれば、それは当たり前のような気がしますが。 ステップオーバー (F10) で次の行に進めてから、同様にマウスのカーソルを f.Size と calendar.Size の Size に置いて調べてみてください。同じになるのでは? 【追伸】 コメント欄に「ご参考に、回答欄に自分が検証した際の画像をアップしておきます」と書きましたが、ここには自分は画像をアップできないようですので、自分が使っているレンタルサーバーにアップしてそれへのリンクを張っておきます。 ちなみに、自分の環境は Windows 10 Pro 64-bit, VS2015 Community, .NET 4.6.1, Any CPU 32 ビット優先, Debug ビルドです。 【2017/10/29 追記】 下の 2017/10/29 11:26 のコメントに「その結果を回答欄に追記しておきます」と書きましたように、自分が調べた結果を書いておきます。 念のため問題は何かを書いておきますと、 質問者さんのコードの f.Size = calendar.Size で、calendar の中身をデバッガで見ないと、calendar の真のサイズが calendar.Size に反映されないのは何故か? ということですよね。 まず、MonthCalendar の特殊性として、そのサイズを決定するのは使用されるフォントだけで(MonthCalendar.Size プロパティの設定では変えられない)、フォントが決まらないとサイズが決まらないということがあります。 ここからは想像が入っていますが、以下のようなことだと思われます。 (1) Dim calendar As New MonthCalendar() の時点ではフォントが不明なので真のサイズも不明。 (2) f.Size = calendar.Size の時点でも、依然としてフォントが不明なので真のサイズも不明。 (3) デバッグ実行して calendar.Size の Size にマウスカーソルを当てると Width = 178, Height = 155 という値が取得されるが、それはデフォルト(?)の値で、フォントを考慮した真のサイズではない。 (4) calendar.Size の calendar にマウスカーソルを当て開くと、その時点で calendar が完全に初期化される。すなわち、使用されるフォントに応じて真のサイズが Size プロパティに設定される。 (5) なので、その後で calendar.Size の Size にマウスカーソルを当てると真のサイズが取得できる。 上記の想像を裏付ける Microsoft の公式文書などは見つからないのですが、以下のコードで検証した結果が、多分上記の想像は正しいことを裏付けていると思います。 ``` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Button button = new Button(); button.Click += Button_Click; this.Controls.Add(button); } private void Button_Click(object sender, EventArgs e) { Form f = new Form(); Size size1 = f.Size; // size1 = {Width = 300 Height = 300} f.Size = new Size(200, 200); size1 = f.Size; // size1 = {Width = 200 Height = 200} MonthCalendar calendar = new MonthCalendar(); Size size2 = calendar.Size; // size2 = {Width = 178 Height = 155} calendar.Size = new Size(200, 200); size2 = calendar.Size; // size2 = {Width = 178 Height = 155} f.Controls.Add(calendar); size2 = calendar.Size; // size2 = {Width = 178 Height = 155} f.Show(); size2 = calendar.Size; // size2 = {Width = 199 Height = 162} f.ClientSize = calendar.Size; } } } ``` calendar が完全に初期化される、すなわち、使用されるフォントに応じて真のサイズが Size プロパティに設定されるのは、上記のコードでは f.Show(); の時点のようです。 その後であれば、calendar.Size で真のサイズを取得でき、それを Form の Size に設定してやれば期待される結果になります。(上のコードで検証済み)