別のタブに移動したときに、中のコントロールの配置を変えたい

タグの編集
投稿者 わたなべ  (学生) 投稿日時 2021/9/23 16:18:45
いつもお世話になっております。 

今現在、ボタンを押すと違うタブページに移動するというプログラムを作成しています。
また、タブページ1つ1つには、ボタンが4つ(うち1つはタブページを移動させるボタン)並んでおり、ページを1つ移動するごとに、中のボタンが切り替わるという処理をさせたいです
(例えば、タブページ1にはbutton1,2,3,5が並んでおり、button5を押すとタブページ2に移動。タブページ2には、button2,3,4,5が並ぶ。タブページ3も同様の処理を行い、button3,4,1,5が並ぶ。タブページは4まで)

今のところ書いたプログラムは以下となります。
Public Class Form1

    Dim count As Integer

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click

        count += 1

        If count <= 3 Then
            Select Case count
                Case 1
                    TabPage2.Controls.Add(Button2)
                    TabPage2.Controls.Add(Button3)
                    TabPage2.Controls.Add(Button4)
                    TabPage2.Controls.Add(Button5)

                    TabControl1.SelectedTab = TabPage2
                Case 2
                    TabPage3.Controls.Add(Button3)
                    TabPage3.Controls.Add(Button4)
                    TabPage3.Controls.Add(Button1)
                    TabPage3.Controls.Add(Button5)

                    TabControl1.SelectedTab = TabPage3
                Case 3
                    TabPage4.Controls.Add(Button4)
                    TabPage4.Controls.Add(Button1)
                    TabPage4.Controls.Add(Button2)
                    TabPage4.Controls.Add(Button5)

                    TabControl1.SelectedTab = TabPage4
            End Select
        Else
            count = 0
            TabPage1.Controls.Add(Button1)
            TabPage1.Controls.Add(Button2)
            TabPage1.Controls.Add(Button3)
            TabPage1.Controls.Add(Button5)

            TabControl1.SelectedTab = TabPage1
        End If
    End Sub
End Class

上記プログラムは、一応目的の処理を行うことが出来ます。ただ、2つ困った点があります。

1つは、ボタンの場所が動かないことです。
Formのデザインで、タブページ1にbutton1,2,3,5を並べ、上記プログラムを行うと、タブページ2では、button1,2,3の場所にbutton2,3,4と配置されて欲しいのですが、button〇,2,3(〇は何も表示されていない)、といった形で表示されます。そうではなく、タブページ2では、button1,2,3の場所に2,3,4と表示され、タブページ3では、2,3,4の場所に3,4,1と表示してほしいです。

2つ目は、コードが冗長な気がします。
もう少し短く書けないかぁと眺めていて思います。
(2は自分自身が勝手に思っているだけなので、回答して頂かなくても大丈夫です)

1についての、何か良いアイデアがあればいただけないでしょうか。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/9/23 20:01:52
> ボタンを押すと違うタブページに移動するというプログラムを作成しています。
この場合は、
 TabControl1.SelectedTab = TabPage1
よりも
 TabControl.SelectedIndex = count
の方が扱いやすいと思います。

> ボタンの場所が動かないことです。
デザイン時に各ボタンの位置を変更すると、Location プロパティが変化しますよね?
同様に、各ボタンの親ページを変更した後で、自前で Location を明示しましょう。


> (例えば、タブページ1にはbutton1,2,3,5が並んでおり、button5を押すとタブページ2に移動。タブページ2には、button2,3,4,5が並ぶ。タブページ3も同様の処理を行い、button3,4,1,5が並ぶ。タブページは4まで)
デザイン時に、各ページごとにボタンを配置しておいた方が楽なのでは…?

処理を共通化させたいのであれば、1 つの Handles 句に複数のボタンを割り当てることもできます。
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5Page1.Click, Button5Page2.Click, Button5Page3.Click, Button5Page4.Click


あるいは、共通となる Button については、TabPage に置くのではなく
Form そのものに配置してはどうでしょうか?
たとえば、ボタンを Form1 上に配置したまま、
デザイン時に Location を調整しておけば、
TabControl の上に重なるような位置にボタンを並べることもできるわけで。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/9/23 20:04:43
> TabControl1.SelectedTab = TabPage1
> TabControl.SelectedIndex = count
TabControl1.SelectedIndex = count
の間違いです。

伝わるとは思いますが念のため訂正。
投稿者 わたなべ  (学生) 投稿日時 2021/9/23 20:38:11
魔界の仮面弁士様
ご返答ありがとうございます。

> TabControl.SelectedIndex = count
ありがとうございます。こういったことが出来るのは知らなかったです。勉強になります。

>デザイン時に、各ページごとにボタンを配置しておいた方が楽なのでは…?
やはりそうですよね…。自分でもそれが一番楽だと思っていましたが、ボタンの数が膨れ上がってしまうので躊躇していました。

上記の内容でやってみることにします!改めてご返答ありがとうございました!!