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 的所有者并在调用表单上调用一个过程?

4

2 回答 2

2

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

对于此示例,假设您有 aParent Form和 a Child Form,并且每个表单都有 aButton和 a 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 Eventspecify a procedure to execute when the event has fired. 在这种情况下,您将看到每当触发 ValueChanged 事件时,父文本框的值将等于子文本框的值(在此示例中,当单击子按钮时会发生这种情况)。

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

于 2013-04-08T01:50:04.827 回答
1

我试过了,这就是我让它工作的方式:首先,你创建一个所有请求表单都实现的接口(感谢那个领导 Styxxy):

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

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

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

希望这可以帮助

对不起,对于糟糕的英语

于 2013-04-07T18:37:36.570 回答