C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

フォーム初期化時にTableLayoutPanelを取得でき /半角 (20/10/14(Wed) 17:44) #95986
Re[1]: フォーム初期化時にTableLayoutPanelを取得でき /半角 (20/10/15(Thu) 21:40) #96013
│└ Re[2]: フォーム初期化時にTableLayoutPanelを取得でき /Hongliang (20/10/15(Thu) 22:45) #96014
Re[1]: フォーム初期化時にTableLayoutPanelを取得でき /WebSurfer (20/10/16(Fri) 09:08) #96015
  └ Re[2]: フォーム初期化時にTableLayoutPanelを取得でき /半角 (20/10/16(Fri) 15:36) #96021 解決済み


親記事 / ▼[ 96013 ] ▼[ 96015 ]
■95986 / 親階層)  フォーム初期化時にTableLayoutPanelを取得でき
□投稿者/ 半角 (1回)-(2020/10/14(Wed) 17:44:09)

分類:[.NET 全般] 

VB2015を使っております。

TableLayoutPanel1をフォーム上に配置します。

この状態で、


    Public Sub Form6_Imaging_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim Heights = TableLayoutPanel1.GetRowHeights
        Dim Widths = TableLayoutPanel1.GetColumnWidths

    End Sub


を実行すると、TableLayoutPanel1のWidthやHeightを取得することができます。

一方で、なぜかTableLayoutPanel1のいずれかのセルにPictureBoxを配置した状態で、
上記のコードを実行すると、
WidthもHeightもLength=0となっており、
値を取得することができません。

ただし、一度フォームのロードが終わった後は取得できるようになります。

更に、なぜか、PictureBoxに加えて、Labelを追加すると、
また取得可能なようになります。

これって一体どういう仕様なのでしょうか?

PictureBoxしか入っていない状態で、
フォームのロード時に、
WidthやHeightを取得するにはどうすれば良いですか?

[ □ Tree ] 返信 編集キー/

▲[ 95986 ] / ▼[ 96014 ]
■96013 / 1階層)  Re[1]: フォーム初期化時にTableLayoutPanelを取得でき
□投稿者/ 半角 (2回)-(2020/10/15(Thu) 21:40:21)
どなたかご回答いただけないでしょうか?

https://stackoverflow.com/questions/13725721/get-height-and-width-of-tablelayoutpanel-cell-in-windows-forms

このページにも似たような質問があります。
回答に、コントロールを含まない場合には
空の配列を返す、と書かれてあると思います。

私の環境では、コントロール無しでは配列が取得できますが、
Pictureboxがあると取得できなくなります。

では、こういう条件で、
配列を取得するにはどのようにすれば良いのでしょうか?

[ 親 95986 / □ Tree ] 返信 編集キー/

▲[ 96013 ] / 返信無し
■96014 / 2階層)  Re[2]: フォーム初期化時にTableLayoutPanelを取得でき
□投稿者/ Hongliang (1096回)-(2020/10/15(Thu) 22:45:17)
2020/10/15(Thu) 22:56:33 編集(投稿者)
InitializeComponent()内のtableLayoutPanel1.SuspendLayout()が原因ですが、
なぜそうなるかはさすがに追いきれませんでした。
// わざわざインテリセンスに出ないようにしてるのはこの辺の挙動の不安定さからなのかしら。

とりあえず回避策として、BeginInvokeでちょっと実行を遅らせればなんとかなるようです。

Sub Form1_Load(略) Handles MyBase.Load
    Me.BeginInvoke(New MethodInvoker(AddressOf GetSizes))
End Sub

Sub GetSizes()
    Dim heights = TableLayoutPanel1.GetRowHeights()
    Dim widths = TableLayoutPanel1.GetColumnWidths()
End Sub

<追記>
ちなみにShownイベントでなら問題なく取得できるようなので、
問題なければこちらのイベントを使うのもいいでしょう。
</追記>

[ 親 95986 / □ Tree ] 返信 編集キー/

▲[ 95986 ] / ▼[ 96021 ]
■96015 / 1階層)  Re[1]: フォーム初期化時にTableLayoutPanelを取得でき
□投稿者/ WebSurfer (2124回)-(2020/10/16(Fri) 09:08:23)
No95986 (半角 さん) に返信

全くの想像&思い付きレベルですが・・・

> 一方で、なぜかTableLayoutPanel1のいずれかのセルにPictureBoxを配置した状態で、
> 上記のコードを実行すると、
> WidthもHeightもLength=0となっており、
> 値を取得することができません。

PictureBox のサイズは表示するまで分からない
から、それを格納するパネルのサイズは分からない
ということではないでしょうか?

MonthCalendar コントロール (使うフォント
でサイズが決まる) で、表示するまで正しいサイズ
が取得できないということからの想像です。

ハズレでしたら失礼しました。
[ 親 95986 / □ Tree ] 返信 編集キー/

▲[ 96015 ] / 返信無し
■96021 / 2階層)  Re[2]: フォーム初期化時にTableLayoutPanelを取得でき
□投稿者/ 半角 (3回)-(2020/10/16(Fri) 15:36:16)
(Hongliang さん) に返信

うまくいきました。
どうもありがとうございます。

(WebSurfer さん) に返信
コメントありがとうございます。
解決済み
[ 親 95986 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -