トップ回答者
タブ内ユーザーコントロールのフラグ

質問
-
こんにちは。
タブにユーザーコントロールを貼り付けそこにボタン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
回答
-
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
すべての返信
-
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
-
みっとさんありがとうございます。ユーザーコントロールの扱いがおかしかったのですね。
ちなみにこのあたりの参考になるページやキーワードなどありますか?また追加で申し訳ないのですが、フォームの×ボタンで全体を閉じるときにタブ内のどこかにfalseフラグがあればメッセージを表示させたいのですがどうすればよいのでしょうか?
Dim T_Cou As Integer = TAB_CONATROL1.TabCount 'タブ枚数
Dim TABE_FLAG As BooleanFor 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すみません。アドバイスよろしくお願いいたします。
-
ちなみにこのあたりの参考になるページやキーワードなどありますか?
「このあたり」が「Dim U_ENTR As Object = New UserControl1」のことを指しているのであれば、クラスやオブジェクトに関する基礎的なところの勉強が必要としか言えないと思います。
また追加で申し訳ないのですが、フォームの×ボタンで全体を閉じるときにタブ内のどこかにfalseフラグがあればメッセージを表示させたいのですがどうすればよいのでしょうか?
??? と書いている部分がわからないということであれば、生成したユーザーコントロールを保持しておく配列のフィールド変数(メンバー変数)を持てばよいでしょう。
このあたりの言葉でイメージを持てないのであれば、前述のようにクラスやオブジェクトについて勉強してください。