1

私はアプリに取り組んでおり、アプリケーション全体で再利用できる汎用検索フォーム (フォーム 2) を作成しようとしています。

検索フォームは DB を調べて、選択した項目の ID 値を返します。

フォーム (フォーム 2) をダイアログとして使用してこれを行うことができ、呼び出し元のフォーム (フォーム 1) に値を返すだけですが、フォーム (フォーム 2) を非モーダルにして、値が表示された後も開いたままにしておきます。合格した。

呼び出すだけでこれを実行できることはわかっていForm1.SubName(IDValue)ますが、この単一の検索フォームを呼び出すフォームが 10 個もある可能性があるため、フォーム名を手動で (または case ステートメントで) 指定したくありません。

フォームの所有者を設定して実行しようとしMe.Owner.SubName(IDValue)ましたが、エラーが発生します'SubName' is not a member of 'System.Windows.Forms.Form'

フォーム 2 からフォーム 2 の所有者に値を返し、呼び出し元のフォームでプロシージャを呼び出す方法はありますか?

4

2 に答える 2

2

と の両方に対する要件に基づいて、最良の解決策は を使用することだreturn a valuecall a procedure on the calling form思いますEvents。概念を示すために簡単な例を見ていきます。

この例では、Parent Formと がありChild Form、各フォームに と があるButtonとしTextBoxます。

  1. 親フォームのボタンをクリックすると、子フォームが生成され、その ValueChanged イベントに登録されます。
  2. 子フォームのボタンをクリックするとイベントが発生し、その TextBox の値がイベントを購読しているすべての人に渡されます。

のコードは次のParent Formとおりです。

Public Class ParentForm

    Private Sub ParentButton_Click(sender As System.Object, e As System.EventArgs) Handles ParentButton.Click
        Dim child As New ChildForm
        AddHandler child.ValueChanged, AddressOf ChildFormValueChanged
        child.Show()
    End Sub

    Private Sub ChildFormValueChanged(ByVal NewValue As String)
        ParentTextBox.Text = NewValue
    End Sub

End Class

のコードは次のChild Formとおりです。

Public Class ChildForm

    Public Event ValueChanged(ByVal NewValue As String)

    Private Sub ChildButton_Click(sender As System.Object, e As System.EventArgs) Handles ChildButton.Click
        RaiseEvent ValueChanged(ChildTextBox.Text)
    End Sub

End Class

AddHandlerコードは重要Parent Form to subscribe to the Child Form's ValueChanged Eventです。specify a procedure to execute when the event has firedこのシナリオでは、ValueChanged イベントが発生するたびに、親 TextBox の値が子 TextBox の値と等しくなることがわかります (この例では、これは子のボタンがクリックされたときに発生します)。

Event 宣言内に複数の引数と任意のデータ型を入れることができますが、発生したときに実行されるプロシージャ (つまり、ChildFormValueChanged) が Event と同じシグネチャを持っていることを確認する必要があるだけです (引数とデータ型が同じであることが期待されます)。 )。

于 2013-04-08T01:50:04.827 に答える