none
タブ内ユーザーコントロールのフラグ RRS feed

  • 質問

  • こんにちは。

    タブにユーザーコントロールを貼り付けそこにボタン2つとラベルを張り付けています。

    タブを増やしていくとユーザーコントロールがコピーしていきます。

    各々のタブでボタンを押すとフラグがtrueになり、閉じる用のボタンを押すとフラグがfalseの場合だけダイアログでクローズの確認メッセージを出すようにしたいのですが、上手くいきません。以下のコードでまずい部分がありますでしょうか?

    フォーム側

    Public Class Form1

        Private Sub TABCONTROL1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged

            Tab_Add()

        End Sub

        Private Sub Tab_Add() 'タブ追加

            If TabControl1.TabCount = (TabControl1.SelectedIndex + 1) Then

                ' 追加するタブを作成
                Dim Tab1 = New TabPage
                Dim obj_usercont As New UserControl1
                AddHandler obj_usercont.BTN_CLS_Click, AddressOf BTN_CLS_Click
                TabControl1.TabPages.Add(Tab1)
                Tab1.Controls.Add(obj_usercont)
            End If

        End Sub



        Private Sub BTN_CLS_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles UserControl11.BTN_CLS_Click,UserControl12.BTN_CLS_Click
                Tab_Close()
         End Sub

        Private Sub Tab_Close()

            Dim Answer As Integer
            Dim U_ENTR As Object = New UserControl1

            If U_ENTR.E_FLAG = True Then
                'フラグがtrueの場合はダイアログを出さずに閉じる。
                TabControl1.TabPages.Remove(TabControl1.SelectedTab)

            Else
                Answer = MsgBox("閉じますか?", vbExclamation Or vbOKCancel,
    "確認")
                Select Case Answer
                    Case vbOK
                        TabControl1.TabPages.Remove(TabControl1.SelectedTab) '
                End Select
            End If
        End Sub


    End Class 

    ユーザーコントロール側

    Public Class UserControl1

        Public AAA As Boolean

        Private Sub UserControl1_Load(ByVal sender As Object, ByVal e As
    System.EventArgs) Handles Me.Load
            AAA = False 'OKフラグ閉じる。
        End Sub


        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            AAA = True 'OKフラグを立てる
            Label1.Text = "OK"
        End Sub


        Public Event BTN_CLS_Click(ByVal sender As System.Object, ByVal e As
    System.EventArgs)
        'ボタンクリックにより閉じる
        Public Sub BTN_CLSClick(ByVal sender As System.Object, ByVal e As
    System.EventArgs) Handles Button2.Click

            RaiseEvent BTN_CLS_Click(sender, e)

        End Sub

    End Class

    2013年2月6日 23:11

回答

  • Tab_Closeの

    >> Dim U_ENTR As Object = New UserControl1

    ここで新しいUserControl1をインスタンスして、そのフラグを見に行っているのが原因ですね。
    ここはSelectedTabの中の既存のUserControl1を格納してやる必要があります。

        Private Sub Tab_Close()
    
            Dim Answer As Integer
            Dim tabPage As TabPage = TabControl1.SelectedTab
            Dim U_ENTR As Object = Nothing
            For Each obj As Object In tabPage.Controls
                If TypeOf obj Is UserControl1 Then
                    U_ENTR = obj
                    Exit For
                End If
            Next
            'Dim U_ENTR As Object = New UserControl1
    
            If U_ENTR.E_FLAG = True Then
                'フラグがtrueの場合はダイアログを出さずに閉じる。
                TabControl1.TabPages.Remove(TabControl1.SelectedTab)
    
            Else
                Answer = MsgBox("閉じますか?", vbExclamation Or vbOKCancel, "確認")
                Select Case Answer
                    Case vbOK
                        TabControl1.TabPages.Remove(TabControl1.SelectedTab) '
                End Select
            End If
        End Sub

    以上、参考まで。

    • 回答としてマーク あすた 2013年2月11日 12:21
    2013年2月6日 23:46

すべての返信

  • Tab_Closeの

    >> Dim U_ENTR As Object = New UserControl1

    ここで新しいUserControl1をインスタンスして、そのフラグを見に行っているのが原因ですね。
    ここはSelectedTabの中の既存のUserControl1を格納してやる必要があります。

        Private Sub Tab_Close()
    
            Dim Answer As Integer
            Dim tabPage As TabPage = TabControl1.SelectedTab
            Dim U_ENTR As Object = Nothing
            For Each obj As Object In tabPage.Controls
                If TypeOf obj Is UserControl1 Then
                    U_ENTR = obj
                    Exit For
                End If
            Next
            'Dim U_ENTR As Object = New UserControl1
    
            If U_ENTR.E_FLAG = True Then
                'フラグがtrueの場合はダイアログを出さずに閉じる。
                TabControl1.TabPages.Remove(TabControl1.SelectedTab)
    
            Else
                Answer = MsgBox("閉じますか?", vbExclamation Or vbOKCancel, "確認")
                Select Case Answer
                    Case vbOK
                        TabControl1.TabPages.Remove(TabControl1.SelectedTab) '
                End Select
            End If
        End Sub

    以上、参考まで。

    • 回答としてマーク あすた 2013年2月11日 12:21
    2013年2月6日 23:46
  • みっとさんありがとうございます。ユーザーコントロールの扱いがおかしかったのですね。
    ちなみにこのあたりの参考になるページやキーワードなどありますか?

    また追加で申し訳ないのですが、フォームの×ボタンで全体を閉じるときにタブ内のどこかにfalseフラグがあればメッセージを表示させたいのですがどうすればよいのでしょうか?

    Dim T_Cou As Integer = TAB_CONATROL1.TabCount 'タブ枚数
    Dim TABE_FLAG As Boolean

      For i As Integer = 0 To T_Cou - 2
           TAB_CONATROL1.SelectedIndex = i
            If タブ内のユーザーコントロールの.E_FLAG = False ?? Then
       メッセージを表示
                 TABE_FLAG = True
             Exit For
            End If
     Next

    すみません。アドバイスよろしくお願いいたします。

    2013年2月7日 23:37
  • ちなみにこのあたりの参考になるページやキーワードなどありますか?

    「このあたり」が「Dim U_ENTR As Object = New UserControl1」のことを指しているのであれば、クラスやオブジェクトに関する基礎的なところの勉強が必要としか言えないと思います。

    また追加で申し訳ないのですが、フォームの×ボタンで全体を閉じるときにタブ内のどこかにfalseフラグがあればメッセージを表示させたいのですがどうすればよいのでしょうか?

    ??? と書いている部分がわからないということであれば、生成したユーザーコントロールを保持しておく配列のフィールド変数(メンバー変数)を持てばよいでしょう。

    このあたりの言葉でイメージを持てないのであれば、前述のようにクラスやオブジェクトについて勉強してください。

    2013年2月8日 15:04
    モデレータ
  • Azuleanさん回答ありがとうございます。

    頑張って勉強してみます!

    2013年2月11日 12:21