質問するログイン新規登録
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

317閲覧

C# WindowsForms FlowLayoutPanelの仕様について

kakerukyun

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2023/12/30 14:32

0

0

実現したいこと

FlowLayoutPanelの中に配置するコントロールが少しズレて配置されてしまいます。
これは何が起きているのかご教授頂きたいのと、解決法について知りたいです。
VSは使用できないため使用しておりません。

詳細

C# Windowsフォームの勉強をしています。
フォーム左側にドックしたパネルにメニューの様なアイテムを配置したいと思っています。

下記のコードはFormクラスを継承した、フォームを表示するクラスのコンストラクタです。
11行目の様にinnerLeftPaneをPanelクラスで作成した場合は画像1の様にその子のitemPane01がピッタリ配置されますが、
innerLeftPaneをFlowLayoutPanelクラスで作成した場合、画像2の様にその子のitemPane01が若干ズレて配置されます。
この理由と、解決法をご教授頂きたいです。

該当のソースコード

C#

1 public WindowTest_MainFrame() 2 { 3 this.Size = new Size(512, 512); 4 5 Panel mainPane = new Panel(); 6 mainPane.BackColor = Color.Black; 7 mainPane.Dock = DockStyle.Fill; 8 mainPane.Padding = new Padding(8); 9 this.Controls.Add(mainPane); 10 11 Panel innerLeftPane = new Panel(); 12 innerLeftPane.BackColor = Color.Red; 13 innerLeftPane.Dock = DockStyle.Left; 14 mainPane.Controls.Add(innerLeftPane); 15 16 Panel itemPane01 = new Panel(); 17 itemPane01.BackColor = Color.Blue; 18 itemPane01.Width = innerLeftPane.Width; 19 innerLeftPane.Controls.Add(itemPane01); 20 21 Label itemLabel01 = new Label(); 22 itemLabel01.Text = "ラベル1"; 23 itemLabel01.Width = itemPane01.Width; 24 itemLabel01.BackColor = Color.Yellow; 25 itemLabel01.TextAlign = ContentAlignment.MiddleCenter; 26 itemPane01.Controls.Add(itemLabel01); 27 }

11行目を以下の様に変更

C#

1 FlowLayoutPanel innerLeftPane = new FlowLayoutPanel();

画像1
イメージ説明
画像2
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

FlowLayoutPanel 内部のコントロールは、Location プロパティが無効になるかわりに Margin プロパティが有効になります。
デフォルト値は Padding(3) なので、3ドットの余白が出来ます。

itemPane01.Margin = new Padding(0);
itemLabel01.Margin = new Padding(0);

とすることで、ぴったり配置できます。

別件になりますが、コントロールの幅を親コントロールに合わせる場合は、親コントロールの Width プロパティではなく、ClientSize.Width を使ってください。

itemPane01.Width = innerLeftPane.ClientSize.Width;

投稿2023/12/30 17:05

KOZ6.0

総合スコア2740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakerukyun

2023/12/30 17:29

ご回答ありがとうございます。 とてもわかりやすくご教授頂き理解できました。 ClientSize.Widthについても大変ためになりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問