<>

C# WindowsFormsでスクロールバーを表示させフォーム上にコントロールを動的に追加します。

デザイナで以下のようなものを作ります。Panel(panel1)を追加し、そのなかにさらにPanel(panel2)を追加します。追加ボタンをクリックするとPanelのなかにボタンが追加されます。フォームよりも下にボタンが生成されてもそれをクリックできるようにスクロールバーを表示させてクリックできるようにします。

Panelを二重にして対応

PanelのAutoSizeプロパティをtrueにするとスクロールバーが表示されますが、それだけだと適切な位置にボタンを表示させるのが難しくなるのでPanelを二重構造にしています。内側のPanelにボタンを追加し、このパネルを外側のPanelのなかに表示させます。そして内側のPanelを自動でサイズ変更可能にし、外側のPanelのAutoSizeプロパティをtrueにしてスクロール可能にすることで目的達成を目指します。

フォームのサイズ変更に伴って外側のPanelがサイズ変更されたときの処理を示します。

内側のPanelのサイズ変更をおこなっています。内側のPanelにはAnchorプロパティを設定していますが、これだけだといったんPanelのサイズが大きくなるとそのままになるので外側と同じサイズをセットしています。また常に縦のスクロールバーを表示させるために高さを少し大きめにしています。

追加時の処理

追加ボタンをクリックしたときの処理を示します。

追加されるボタンを生成してサイズと追加する位置をセットします。そのあとPanelのサイズ変更に対応できるようにAnchorプロパティを設定します。

削除時の処理

削除ボタンがクリックされたときはボタンが存在する場合は一番上のボタンを削除します。上にあるボタンが削除されたらその部分が空白になるので上に詰める処理をしています。内側のPanelはAutoSizeプロパティがtrueに設定されているため、自動的にサイズが縮小されています。