2013-04-07 100 views
1

我正在開發一個應用程序,我試圖創建一個可以重新用於整個應用程序的通用搜索表單(表單2)。從非模態對話框中檢索對話框的值

搜索表單將查看數據庫並返回選定項目的ID值。我可以使用窗體(窗體2)作爲對話框並簡單地將值返回給調用窗體(窗體1),但我希望窗體(窗體2)是非模態的並保持打開狀態值通過後。

我知道我可以這樣做,只是調用Form1.SubName(IDValue),但我不想指定手動指定表單名稱(或與case語句),因爲我可能有多達10個表單調用此單一搜索表單。

我已經嘗試設置窗體所有者和做Me.Owner.SubName(IDValue)但我得到一個錯誤'SubName' is not a member of 'System.Windows.Forms.Form'

有沒有辦法將表單2中的值返回給表單2的所有者並在調用表單上調用過程?

+0

將其轉換爲正確的類型(使用TryCast)。你可以使用一個接口,每一個可以啓動這個搜索器的表單都可以實現。 – Styxxy 2013-04-07 14:28:43

+0

我會怎樣嘗試投射,「Me.Owner」已經是一種表單類型? – bendataclear 2013-04-07 14:30:13

+0

因爲'System.Windows.Forms.Form'沒有你的方法,所以你必須把它轉換成正確的類型(它有這個方法)。 – Styxxy 2013-04-08 09:57:50

回答

2

根據您的要求,既return a valuecall a procedure on the calling form,我認爲最好的辦法是使用Events。我將通過一個簡單的例子來展示這個概念。

對於這個例子,假設你有一個Parent FormChild Form,並且每種形式都有一個ButtonTextBox

  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事件被觸發時,您將看到Parent TextBox值等於Child TextBox的值(在此示例中,這發生在單擊Child's Button時)。

你可以在你的Event聲明和任何數據類型中放置多個參數,但是你只需要確保當它被引發時執行的過程(即ChildFormValueChanged)與Event具有相同的簽名(期望相同參數和數據類型)。

+0

我發現這個方法最容易實現,謝謝。 – bendataclear 2013-04-24 14:24:47

+0

@bendataclear沒問題,很高興它爲你工作。 – Mash 2013-04-24 14:51:38

1

我試了一下,這是我如何做它的工作: 首先你要所有詢問的形式實現(THX的鉛Styxxy)的接口:

public interface IAsk 
{ 
    void answer(String IDValue); 
} 

現在每次調用搜索窗口您的時間發送父母allong,只需撥打parent.answer(IDValue)方法,你就可以得到答案。

public Form2(IAsk caller) 
{ 
    parent = caller; 
    InitializeComponent(); 
} 

希望這有助於

Sry基因,對於英​​語不好