2012-12-07 57 views
1

我有一个MDI父窗体,可能会打开一个名为“Order”的子窗体。订单表单有一个允许用户打印订单的按钮。该命令的形式在开头定义的打印尺寸变量:从VB.NET的MDI父窗体调整子窗体的公共变量

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父项和子项是很常见的,但尽管尝试了一些我在这里看到的选项,但似乎并没有奏效。这是错误的方法?

+1

以何种方式它不工作? –

+0

当我键入“f”时,我希望“psize”应该出现在我可以选择并键入f.psize的选项中,但是我得到的错误是“psize不是系统的成员......” Windows.Forms的”。它适用于我说Order.psize。但是我怎样才能在当前的实例中赋值呢? – user961627

回答

2

该属性不可用的原因是因为您正在使用错误类型的变量。基地Form类型不定义该属性。相反,你的衍生Order类型。你可以做这样的事情:

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

UPDATE

正如你在下面的评论说,你真正需要做的是能够将所有的表格,以便之间共享一个动态设置您可以随时更改设置,并使其影响您已显示的所有表单。要做到这一点,最好的方法是创建一个存储您的所有共享设置一个新的类,例如:

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形式创建它们:

Pubic 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对象所做的更改将立即被所有可见形式。

+0

我试过了,它似乎很顺利,因为它没有显示任何错误。我在Order窗体的load事件上放置了一个msgbox来显示当前的psize。当我启动时,它按预期显示A4。但是,当我真正对MDI父级的psize进行更改,然后加载新的订单表单时,其psize没有任何价值......既不是A4也不是A6,只是空白!这是我用来实际改变父母的psize的代码:'Me.psize =“A6”'...很简单,但不起作用! – user961627

+1

您是否已在订单表单显示后更改它? –

+0

好吧,它的工作,但是有一个问题,目前打开的订单窗体...我尝试以下,但再次f.psize导致错误: 'For Each f in Me.MdiChildren If TypeOf(f)Is Order Then f.psize = Me.psize End If Next' 如何动态地重新分配变量f来键入“Order”? – user961627

2

更改此:

Dim f As Form 

到实际执行的形式:

Dim f As Order 

或者只是快捷方式:

Dim f As New Order 
相关问题