我正在开发一个应用程序,我正在尝试创建一个可以在整个应用程序中重复使用的通用搜索表单(表单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 :(得分:2)
根据您对return a value
和call a procedure on the calling form
的要求,我认为最好的解决方案是使用Events
。我将通过一个简单的例子来展示这个概念。
对于此示例,假设您有Parent Form
和Child Form
,并且每个表单都有Button
和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值将等于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,因为英语不好