【问题标题】:Adjust child form's public variable from MDI parent form in VB.NET在 VB.NET 中从 MDI 父窗体调整子窗体的公共变量
【发布时间】:2018-04-14 03:04:13
【问题描述】:

我有一个 MDI 父窗体,它可以打开一个名为“Order”的子窗体。订单表格有一个按钮,允许用户打印订单。 Order 表单在开头定义了一个打印大小变量:

Public Class Order

Public psize As String 

    Private Sub button_order_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles process_order.Click
  ' Code to handle the order and then print, etc 

现在父表单也有一个psize 变量,默认设置为“A4”。 只有当有人单击父窗口菜单条上的菜单项之一时才会发生这种情况:

psize = "A6"

默认情况下,每当父窗口打开一个新的订单表单时,我需要它来将子表单的psize 变量设置为它自己的psize 值。像这样的:

    Dim f As Form
    f = New Order
    f.MdiParent = Me
    f.psize = Me.psize ' BUT THIS LINE DOESN'T WORK
    f.Show()

我收到 f.psize 不是表单成员的错误。 我知道在 MDI 父级和子级之间传递变量是很常见的,但是尽管尝试了我在这里看到的一些选项,但它似乎并没有起作用。这是错误的方法吗?

【问题讨论】:

  • 在什么情况下不起作用?
  • 当我输入“f”时,我希望“psize”应该出现在我可以选择并输入 f.psize 的选项中......但我收到“psize is not System...Windows.Forms 的成员。当我说 Order.psize 时它起作用了。但是如何在当前实例中分配它的值?

标签: vb.net forms global-variables mdichild mdiparent


【解决方案1】:

属性不可用的原因是您使用了错误的变量类型。基本 Form 类型未定义该属性。相反,您派生的 Order 类型可以。你可以这样做:

Dim f As Order
f = New Order
f.MdiParent = Me
f.psize = Me.psize
f.Show()

更新

正如您在下面的 cmets 中所说,您真正需要做的是能够在所有表单之间共享动态设置,以便您可以随时更改设置并让它影响所有已经被显示。最好的方法是创建一个存储所有共享设置的新类,例如:

Public Class Settings
    Public PaperSize As String = "A6"
End Class

如您所见,通过这样做,您可以轻松地将所有默认设置集中在设置类中,这是一个额外的好处。然后,您需要将Order 表单中的公共属性更改为新的Settings 类型,例如:

Public Class Order
    Inherits Form

    Public Settings As Settings
End Class

然后,您需要在 MDI 父表单中创建共享设置对象,然后在创建时将其传递给每个 Order 表单:

Public Class MyParentForm
    Private _settings As New Settings()

    Private Sub ShowNewOrderForm()
        Dim f As New Order()
        f.MdiParent = Me
        f.Settings = _settings
        f.Show()
    End Sub

    Private Sub ChangePaperSize(size As String)
        _settings.PaperSize = size
    End Sub
End Class

然后,由于父表单和所有子 Order 表单共享相同的 Settings 对象,并且对 Settings 对象所做的更改将立即被所有表单看到。

【讨论】:

  • 我试过这个,它似乎很顺利,因为它没有显示任何错误。我在 Order form 的 load 事件上放了一个 msgbox 来显示当前的 psize。当我启动时,它按预期显示 A4。但是当我实际更改 MDI 父级的 psize,然后加载新的订单时,它的 psize 没有任何价值……既不是 A4 也不是 A6,只是空白!这是我用来实际更改父母 psize 的代码:Me.psize = "A6"... 非常简单,但不起作用!
  • 在Order form已经显示之后你要改吗?
  • 好吧,它工作了,但是是的,当前打开的订单表格有问题......我尝试了以下但 f.psize 再次导致错误:'For Each f In Me.MdiChildren If TypeOf (f ) Is Order Then f.psize = Me.psize End If Next' 如何动态重新分配变量 f 以键入“Order”?
【解决方案2】:

改变这个:

Dim f As Form

到你的表单的实际实现:

Dim f As Order

或者只是捷径:

Dim f As New Order

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多