从非模态对话框窗体中检索对话框值

时间:2013-04-07 14:15:11

标签: .net vb.net winforms

我正在开发一个应用程序,我正在尝试创建一个可以在整个应用程序中重复使用的通用搜索表单(表单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的所有者并在调用表单上调用一个过程?

2 个答案:

答案 0 :(得分:2)

根据您对return a valuecall a procedure on the calling form的要求,我认为最好的解决方案是使用Events。我将通过一个简单的例子来展示这个概念。

对于此示例,假设您有Parent FormChild Form,并且每个表单都有ButtonTextBox

  1. 单击父表单上的按钮将生成一个子表单并订阅其ValueChanged事件。
  2. 单击子窗体上的按钮将引发一个事件,并将其TextBox的值传递给已订阅该事件的任何人。
  3. 以下是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 Eventspecify a procedure to execute when the event has fired。在这种情况下,每当触发ValueChanged事件时,您将看到父TextBox值将等于Child TextBox的值(在此示例中,单击Child的按钮时会发生这种情况)。

    您可以在Event声明和任何数据类型中放置多个参数,但是您只需要确保引发它时执行的过程(即ChildFormValueChanged)与Event具有相同的签名(期望相同的参数)和数据类型)。

答案 1 :(得分:1)

我试过这就是我的工作方式: 首先,你创建一个所有要求表单实现的接口(thx用于那个导联Styxxy):

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

现在,每当您调用搜索窗口时,您都会发送父级allong,只需调用parent.answer(IDValue)方法即可获得答案。

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

希望这有帮助

Sry,因为英语不好