.NETで、まずForm1からForm2を開き、Form2からDialogを開きます。
このDialogのButton1_Clickから、Form2のComboBox1をクリアするにはどうすればよいのでしょうか?
Public Class Form1
Private Sub Button1_Click(...
Dim Fm2 As New Form2()
With Fm2
.ShowDialog()
End With
End Sub
End Class
Public Class Form2
Private Sub Button1_Click(...
Dim Dia1 As New Dialog1()
With Dia1
.ShowDialog()
End With
End Sub
End Class
Public Class Dialog1
Private Sub Button1_Click(...
Form1.ComboBox1.Items.Clear() 'Form1のComboBox1はクリアされる
Form2.ComboBox1.Items.Clear() 'Form2のComboBox1はクリアされない
End Sub
End Class
> Form2からDialogを開きます。
> このDialogのButton1_Clickから、Form2のComboBox1をクリアするには
独自のイベントまたはデリゲートを用いて、親である Form2 に対して、
「ComboBox1 のクリア」を依頼する形を取ってみては如何でしょう?
それ以外の方法としては、Dialog を呼ぶときに、Form2 の ComboBox1 自身を
渡すという直接的な方法もあります。ただしこの場合は、フォーム間の
依存度が高くなりすぎるので、たとえば Form3 からも呼び出したいといった
機能変化には弱くなってしまうかも知れません。
魔界の仮面弁士>
返答ありがとうございます。
イベント、デリゲートとやらを調べて色々と試していたのですが、
どうも上手く動作しません。
以下のコードって全然意味ありませんか?
どこにどうコードを書けば解決しそうでしょう?
Public Delegate Sub ItemClearDelegate()
Public Class Form2
Private Sub Button1_Click(...
Dim Dia1 As New Dialog1()
With Dia1
.ShowDialog()
End With
End Sub
Public Sub Combobox() '<-***********************
ComboBox1.Items.Clear() '<-**デリゲート経由で実行?
End Sub '<-***********************
End Class
Public Class Dialog1
Private Sub Button1_Click(...
Dim ItemClearMethod As ItemClearDelegate '
Dim Fm2 As New Form2() '
ItemClearMethod = AddressOf Fm2.Combobox '
ItemClearMethod() '委譲処理呼び出し
End Sub
End Class
ところで、Form1からForm2を開き、Form2からDialogを開いたとき、
以下コードで、Form1.ComboBox1はクリアできるけど、Form2.ComboBox1はクリアされないのは正しい動作なのでしょうか?
> Private Sub Button1_Click(...
> Form1.ComboBox1.Items.Clear() 'Form1のComboBox1はクリアされる
> Form2.ComboBox1.Items.Clear() 'Form2のComboBox1はクリアされない
> End Sub
初歩的な質問で申し訳ありませんが宜しくお願い致します。
> Dim Dia1 As New Dialog1()
> With Dia1
> .ShowDialog()
> End With
(Show ではなく)ShowDialog で呼び出されたフォームは、最後に
Dipose メソッドによるオブジェクトの解放を行う必要があります。
http://msdn2.microsoft.com/ja-jp/library/c7ykbedk(VS.80).aspx
> どこにどうコードを書けば解決しそうでしょう?
イベントを使った場合、および、デリゲートを渡す場合とで、
それぞれの例を書いてみます。
'==========================
' 方法 1
'--------------------------
Public Class Form2
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Using SampleDialog As New Dialog1()
AddHandler SampleDialog.Request, AddressOf MyClearMethod
SampleDialog.ShowDialog()
End Using
End Sub
Private Sub MyClearMethod()
ComboBox1.Items.Clear()
End Sub
End Class
'--------------------------
Public Class Dialog1
Public Event Request()
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
RaiseEvent Request()
End Sub
End Class
'==========================
' 方法 2
'--------------------------
Public Class Form2
Private WithEvents SampleDialog As New Dialog1()
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
SampleDialog.ShowDialog()
End Sub
Private Sub SampleDialog_Request() Handles SampleDialog.Request
ComboBox1.Items.Clear()
End Sub
Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles MyBase.FormClosing
SampleDialog.Dispose()
End Sub
End Class
'--------------------------
Public Class Dialog1
Public Event Request()
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
RaiseEvent Request()
End Sub
End Class
'==========================
' 方法 3
'--------------------------
Public Class Form2
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Using SampleDialog As New Dialog1(AddressOf MyClearMethod)
SampleDialog.ShowDialog()
End Using
End Sub
Private Sub MyClearMethod(ByVal sender As Object, ByVal e As EventArgs)
ComboBox1.Items.Clear()
End Sub
End Class
'--------------------------
Public Class Dialog1
Private request As EventHandler = Nothing
Public Sub New(ByVal ClearMethod As EventHandler)
request = ClearMethod
InitializeComponent()
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
If request IsNot Nothing Then
request(Me, EventArgs.Empty)
End If
End Sub
End Class
方法1を使わせて頂き、無事解決しました。
勉強になります。ありがとうございました。
ツイート | ![]() |