传递形式参考自己

时间:2017-06-11 22:58:55

标签: vb.net forms

我有以下问题:

我有2个窗口形式(" Main"和" Form2")和分离的类" PI"。

使用面板,我显示" Form2"在里面"主要"。

代码来自" Main"

Dim frm As new Form2 = Form2()
panel1.Controls.Add(frm)
frm.Show()

工作正常。点击" Form2"该程序进入PI类进行一些计算,这也可以,但是当PI类的所有计算完成后,我需要将结果传递给" Form2"使用以下代码(test只是字符串公共变量)。 代码来自" PI":

 Public Shared Sub Test
    Form2.test = "It works!"
end sub

代码来自" Form2":

      Public test As String
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            PI.Test()
            MsgBox(test)
        End Sub

所以,问题是如果没有面板,如果我独立打开Form2(不在#34; Main"内部),以这种方式传递变量效果很好(msgbox显示语句),否则 - 它不会#& t(empy box)。你能告诉我出了什么问题吗?我该怎么办呢?

提前致谢!

2 个答案:

答案 0 :(得分:0)

像这样构建代码将PI和Form2结合在一起 - 他们彼此了解太多。通常我们更喜欢PI这样的类独立于使用它们的UI代码 - 它使它们更易于使用,重用和调试。

我不知道Test方法的结果是什么(在你的例子中它只是一个字符串),但是你应该让它让Test方法返回它,然后Form2可以使用它

如果结果更复杂(可能是几个值),您可以创建一个包含结果值的类,并从Test返回该类的实例。或者,您可以在PI实例上设置多个属性,并在调用Test后更改Form2代码以从这些属性中获取值。 (这并不像返回值那样好,但它可能更简单,并且比直接在Form2上设置PI结果要好得多。)

答案 1 :(得分:0)

为什么它适用于独立的 Form2

Public Shared Sub Test()
    Form2.test = "It works!"
End Sub
 

您始终在处理 Form2 的默认实例。如果您描述为“按预期工作”,那么您只需将其称为独立的。

但是在你的代码中

Dim frm As new Form2 = Form2()
    panel1.Controls.Add(frm)
frm.Show()

您正在创建 Form2 的新(另一个)实例。

在那里使用原始默认实例(如果您只需要一个 Form2 ),即不要使用new,它将开始工作。

panel1.Controls.Add(Form2)