質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Q&A

解決済

1回答

2772閲覧

パネルに追加したユーザーコントロールを適切に自動サイズ調整する方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2022/09/17 15:05

編集2022/09/19 12:37

前提

visual stadio2022を使ってc#でプログラミングしています。
ショッピングサイトのようなシステムを作っています。
それを実装のとき、Windowサイズをマウスで大きさが変更するとき、
Form内のパネルに追加したユーザーコントロールのSizeの大きさが変わらない。

VisualStudioでwindows formのForm上には
Panel1(左上)、Panel2(右上)、Panel3(左下)、Panel4(右下)で構成されています。
また、Panel3(左下)にはUserControl1とUserControl2
Panel4(右下)にはUserControl3、UserControl4…
と複数のユーザーコントロールが追加されています。

これのユーザーコントロールは
例)画面遷移を行うときにpanel3内のUserControl1からUserControl2に表示を変えて、
Panel4のUserControl3はUserControl4…などの表示に変わり使います。

実現したいこと

実装するとき、Googleサイトやショッピングサイト(Amazonのサイドメニューや商品の一覧の画面)のようにWindowサイズをマウスで変更するとき、
配置されているpanelに追加したユーザーコントロールの大きさがFormの画面のサイズやpanelのサイズに自動的に調整されていること

つまり、
1.Formの大きさを変えたとき、panel3やpanel4の大きさがFormのサイズに合わせて自動的に変わるようにする。
2.例)panel3に追加されているUserControl1とUserControl2の大きさが
1のときに調整されたpanel3と同じサイズで適切に調整し画面に表示されている。

試したこと

1について、panel3のAnchroプロパティをtop、left、bottomと設定することで
panel3の大きさがWindowsフォームのサイズ変更とともに、パネルの高さが広がったり縮んだりするようになりました。

その後
2についてUserControl1を適切にサイズ変更するために以下の2つのソースコードのどちらかを使った。

c#

1 public partial class UserControl1 : UserControl 2 { 3 public UserControl1() 4 { 5 InitializeComponent(); 6    //Formを取得 7       Form1 form = (Form1)this.FindForm(); 8    //ユーザーコントロールのサイズを変更(下の2つのコードのどちらかを使って行う) 9 form.userControl1.Size = form.panel3.Size; 10 11 Size = form.panel3.Size; 12 } 13 }

c#

1 public partial class UserControl1 : UserControl 2 { 3 4 private void UserControl1_SizeChanged(object sender, EventArgs e) 5 { 6 7 Form1 form = (Form1)this.FindForm(); 8 //form.userControl1.Size = form.panel3.Size; 9 Size = form.panel3.Size; 10 } 11 } 12

また、 AutoSizeとAutoSizeModeを変更するなどのさまざまな組み合わせを使用しようとしましたが、うまく機能していないようです。最終的にUserControlのサイズが十分に大きくならなず、まったく変わらない状態になってしまいます。

補足

Form1のソースコードはこのようになっています。

c#

1public partial class Form1 : Form 2 { 3 4 //ユーザーコントロール1 5 public userControl1 page = new UserControl1(); 6 //ユーザーコントロール2 7 public userControl2 page = new UserControl2(); 8 //ユーザーコントロール3 9 public userControl3 page = new UserControl3(); 10 //ユーザーコントロール4 11 public userControl4 page = new UserControl4(); 12 13 14 public Form1() 15 { 16 InitializeComponent(); 17 18 //パネル4にユーザーコントロールを追加 19 panel4.Controls.Add(userControl3); 20 panel4.Controls.Add(userControl4); 21 22 //画面遷移するための画面の表示の切り替え 23 userControl3.Visible = false; 24 userControl4.Visible = true; 25 26 //ユーザーコントロールの画面を追加 27 panel3.Controls.Add(userControl1); 28 panel3.Controls.Add(userControl2); 29 30   userControl1.Visible = false; 31 userControl2.Visible = true; 32 33 } 34 35 }

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

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

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

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

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

YAmaGNZ

2022/09/17 15:45

「適切」とはどうなれば適切なのですか?
退会済みユーザー

退会済みユーザー

2022/09/17 22:10

.NET Framework なのか .NET Core/.NET どっちかとそのバージョンを書いてください。
KOZ6.0

2022/09/18 09:07

やりたいことが伝わってこないですね。 フォームのサイズ変更前と変更後の画像を貼り付けることはできないでしょうか? こうなってほしいというのをデザインして表示すれば良いです。
退会済みユーザー

退会済みユーザー

2022/09/18 13:29

.NET Framework のバージョンでお願いします。 適切とは実装したとき、ユーザーコントロールとpanelのサイズが同じサイズになることです。
退会済みユーザー

退会済みユーザー

2022/09/18 13:35

やりたいことは実装したとき、Windowサイズをマウスで変更したとき、 レイアウトに関して、 panel3の大きさが自動的に変わり、それと同時にpanel3に追加したUserControl1の大きさがpanel3の大きさに自動的に同じなって表示できることです。
YAmaGNZ

2022/09/18 13:36

パネルの中にユーザーコントロールが複数あるのですよね? そうなのであればパネルの大きさ=ユーザーコントロールの大きさにはならないのではないですか? 図で示すなりスクリーンショットなりで表現してください。
退会済みユーザー

退会済みユーザー

2022/09/19 11:27

Formをマウスで動かしたとき、 panel3にはUserControlの画面とpanel3の空白ができてしまいます。 その空白をなくすために、パネルの大きさ=ユーザーコントロールの大きさを自動的にしたいです。
YAmaGNZ

2022/09/19 11:46

Panel3にはUserControl1とUserControl2があるわけですよね? Panel3の大きさ=UserControl1の大きさであればUserControl2は表示する場所がない Panel3の大きさ=UserControl1の大きさ+UserControl2の大きさであれば UserControl1の大きさとUserControl2の大きさはどのように変化するのか 上記を説明しないとダメなのではないですか?
退会済みユーザー

退会済みユーザー

2022/09/19 12:33

説明不足ですみません。 UserControl1とUserControl2はPanel3内で画面遷移をするために必要なものです。
YAmaGNZ

2022/09/19 13:34

UserControl1とUserControl2は同時に表示されずにあるタイミングで片方が表示、もう片方が非表示と切り替わるということですか? それならTN8001さんの回答のようにDockプロパティを設定するか、各ユーザーコントロールにもAnchroプロパティを設定すればいいでしょう。
guest

回答1

0

ベストアンサー

こういうことですか?

cs

1userControl1.Dock = System.Windows.Forms.DockStyle.Fill;

Control.Dock プロパティ (System.Windows.Forms) | Microsoft Learn
DockStyle 列挙型 (System.Windows.Forms) | Microsoft Learn


UserControlの中身も伸び縮みしないと意味ないわけですが。


追記
これが要望通りの状態でしょうか?
アプリ画像
リサイズ
デザイナ

デザイナ上のプロパティ設定のみで、C#コードは1行も書いていません

  • panel1(白)
    BackColor:White
  • panel2(赤)
    Anchor:Top, Left, Right
    BackColor:Red
  • panel3(橙)
    Anchor:Top, Bottom, Left
    BackColor:Orange
    Padding:10,10,10,10(重なりをわかりやすくするため)
  • panel4(黄色)
    Anchor:Top, Bottom, Left, Right
    BackColor:Yellow
    Padding:10,10,10,10(重なりをわかりやすくするため)
  • userControl1(緑)
    BackColor:Lime
    Dock:Fill
  • userControl2(見えていない)
    Dock:Fill
  • userControl3(青)
    BackColor:Blue
    Dock:Fill
  • userControl4(見えていない)
    Dock:Fill

コードでどうこうする前に、まずはデザイナで各コントロールやプロパティの使い方を把握してください。
c# form レイアウト - Google 検索

投稿2022/09/18 15:31

編集2022/09/21 10:12
TN8001

総合スコア9326

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

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

退会済みユーザー

退会済みユーザー

2022/09/20 11:27

すみません。 userControlにはDockやAnchroプロパティの設定がないのですが、それであるのか説明をお願いします。
TN8001

2022/09/20 12:47 編集

提示コードに矛盾?があるのですが > //ユーザーコントロール1 > public userControl1 page = new UserControl1(); これがUserControlの派生クラスであるなら↓です。 page.Dock = System.Windows.Forms.DockStyle.Fill; 逆に > userControl1.Visible = false; > userControl2.Visible = true; > userControl3.Visible = false; > userControl4.Visible = true; これらはどのクラスのインスタンスなんでしょうか? > userControlにはDockやAnchroプロパティの設定がない これはどう確認されましたか? デザイナでしょうか?C#コード上でしょうか? 当方手元ではどちらでも出ているのですが。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問