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

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

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

Re[1]: CheckedListBoxを使用したフォームの読み込み 2


(過去ログ 126 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■75122 / inTopicNo.1)  CheckedListBoxを使用したフォームの読み込み 2
  
□投稿者/ VBNET (4回)-(2015/03/01(Sun) 16:28:14)

分類:[.NET 全般] 

使用言語:VB.NET
CheckedListBoxで選択された順にフォームを出す方法に関してお教えください。
Formは計5枚。

Form1にて、表示したいフォーム(Form2,3,4)をチェックリストボックスで選択し、ボタンをクリックをしたあと、
表示したいフォームが順に表示され、最後にForm5のみが表示され終了。
Form2,3,4,5はフォーム上にボタンのみとします。

・Form1
Form1には、CheckedListBoxとButtonがあります。
コード案

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
CheckedListBox1.BeginUpdate()
CheckedListBox1.Items.Add("Form2を表示")
CheckedListBox1.Items.Add("Form3を表示")
CheckedListBox1.Items.Add("Form4を表示")
CheckedListBox1.EndUpdate()
End Sub
’チェックリストボックスの項目を設定

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

’Form2,3,4を順に表示したい

Me.Hide()
’Form1を画面上から消す。Form1を閉じるのはチェックリストボックスの最後にチェックの入ったフォームが閉じられるときに合わせて閉じる
End Sub


このとき、Form1におけるコード内容についてお教えいただきたいのですが、
以前同様の質問をし、アドバイス(下部引用)をいただきました。
その後、参考書等をもとにコードを書いては見たものの、

>インデックス用変数idxを用意します。
> 各Formを開くときにFormClosingかFormClosedイベントにAddHandlerにより処理を割り当てるようにします。

この内容について理解することができず、現在も作成できておりません。
そこで、大変申し訳ないのですが、コードで教えいただけないでしょうか。
内容は2点です。
チェックリストボックスをもとにフォームを表示したい場合のコードと、
Form1をForm5が表示されるタイミングで閉じるには、 Me.Hide()でよろしいのでしょうか

宜しくお願い致します。



> CheckedListBoxにはCheckedIndices(チェックの入っているアイテムのインデックスコレクション)とか
> CheckedItems(チェックの入っているアイテムのコレクション)などがあるのでこれらの中身を参照して
> リストを作ります。このリストを順番に参照するためのインデックス用変数idxを用意します。
> 各Formを開くときにFormClosingかFormClosedイベントにAddHandlerにより処理を割り当てるようにします。
> この処理では閉じたとき次のFormを開くようにします。この処理でidxを+1すれば次々と開いていくことが可能になります。
引用返信 編集キー/
■75123 / inTopicNo.2)  Re[1]: CheckedListBoxを使用したフォームの読み込み 2
□投稿者/ shu (704回)-(2015/03/01(Sun) 22:49:01)
No75122 (VBNET さん) に返信

だいたいこんな感じでいけると思います。
Form1以外はたくさん用意するのが面倒なのでForm2を兼用しています。
実際はそれぞれのFormインスタンスを作成するようにしてください。
Iterator,yieldが使えないバージョンでしたらShowFormの中を工夫して
呼ばれる毎にCheckedIndicesを順番に処理するようにしてみて下さい。

Public Class Form1

    Private _Forms As IEnumerator(Of Form)
    Private WithEvents _Form As Form

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        CheckedListBox1.Items.AddRange({"Form2を表示",
                                        "Form3を表示",
                                        "Form4を表示"})
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        _Forms = OpenForms().GetEnumerator()
        ShowForm()
    End Sub

    Private Iterator Function OpenForms() As IEnumerable(Of Form)
        Dim idxs() As Integer = CheckedListBox1.CheckedIndices.OfType(Of Integer)().ToArray
        Dim frm As Form = Nothing

        For Each idx In idxs
            Select Case idx
                Case 0
                    frm = New Form2()
                    frm.Text = "Form2"
                Case 1
                    frm = New Form2()
                    frm.Text = "Form3"
                Case 2
                    frm = New Form2()
                    frm.Text = "Form4"
            End Select
            Yield frm
        Next
        frm = New Form2()
        frm.text = "Form5"
        Yield frm
    End Function

    Private Sub ShowForm()
        If _Forms.MoveNext Then
            _Form = _Forms.Current()
            If _Form IsNot Nothing Then
                _Form.Show()
                Me.Hide()
            End If
        Else
            Me.Show()
        End If
    End Sub

    Private Sub _Form_FormClosed(sender As Object, e As FormClosedEventArgs) Handles _Form.FormClosed
        ShowForm()
    End Sub
End Class

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -