【问题标题】:retrieve dialog value from NON modal dialog form从非模态对话框中检索对话框值
【发布时间】:2023-03-06 11:18:01
【问题描述】:

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

【问题讨论】:

  • 将其转换为正确的类型(使用 TryCast)。您可以使用可以启动此搜索器的每个表单都实现的接口。
  • 我会尝试转换成什么,Me.Owner 已经是一个表单类型?
  • 因为 System.Windows.Forms.Form 没有你的方法,所以你必须转换它以获得正确的类型(确实有这个方法)。

标签: .net vb.net winforms


【解决方案1】:

根据您对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 Eventspecify a procedure to execute when the event has fired。在这种情况下,每当触发 ValueChanged 事件时,您将看到父文本框的值将等于子文本框的值(在本例中,当单击子按钮时发生这种情况)。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    希望对你有帮助

    对不起,英语不好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多