ダイアログから別フォームのコントロールを操作するには?

解決


ペーペー  2007-02-16 11:23:54  No: 135301

.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


魔界の仮面弁士  2007-02-16 12:39:14  No: 135302

> Form2からDialogを開きます。
> このDialogのButton1_Clickから、Form2のComboBox1をクリアするには

独自のイベントまたはデリゲートを用いて、親である Form2 に対して、
「ComboBox1 のクリア」を依頼する形を取ってみては如何でしょう?

それ以外の方法としては、Dialog を呼ぶときに、Form2 の ComboBox1 自身を
渡すという直接的な方法もあります。ただしこの場合は、フォーム間の
依存度が高くなりすぎるので、たとえば Form3 からも呼び出したいといった
機能変化には弱くなってしまうかも知れません。


ペーペー  2007-02-20 12:39:56  No: 135303

魔界の仮面弁士>
返答ありがとうございます。
イベント、デリゲートとやらを調べて色々と試していたのですが、
どうも上手く動作しません。
以下のコードって全然意味ありませんか?
どこにどうコードを書けば解決しそうでしょう?

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

初歩的な質問で申し訳ありませんが宜しくお願い致します。


魔界の仮面弁士  2007-02-20 13:21:18  No: 135304

> 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


ペーペー  2007-02-24 03:28:30  No: 135305

方法1を使わせて頂き、無事解決しました。
勉強になります。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加