Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET从form2修改form1中的标签_Vb.net_Forms - Fatal编程技术网

VB.NET从form2修改form1中的标签

VB.NET从form2修改form1中的标签,vb.net,forms,Vb.net,Forms,我知道这方面有一百万个主题,但我找到的每个解决方案要么不满足我的需要(只适用于Form1到Form2),要么是关于C#而不是VB.NET 为了简单起见,假设我有一个带有标签(LBLtest)和按钮(BUTtest)的Form1。 然后我有一个带有两个按钮(BUToption1)和(BUToption2)的Form2。如果我单击BUToption1,我希望Form2隐藏,LBLtest显示“您已选择选项1”。如果我单击BUToption2,我希望Form2隐藏,LBLtest显示“您已选择选项2”

我知道这方面有一百万个主题,但我找到的每个解决方案要么不满足我的需要(只适用于Form1到Form2),要么是关于C#而不是VB.NET

为了简单起见,假设我有一个带有标签(LBLtest)和按钮(BUTtest)的Form1。 然后我有一个带有两个按钮(BUToption1)和(BUToption2)的Form2。如果我单击BUToption1,我希望Form2隐藏,LBLtest显示“您已选择选项1”。如果我单击BUToption2,我希望Form2隐藏,LBLtest显示“您已选择选项2”

在Visual Studio 2012中,我曾使用Form1编写:

Private Sub BUTtest_Click(sender As Object, e As EventArgs) Handles BUTtest.Click
Form2.show()
End Sub
Private Sub BUTtest_Click(sender As Object, e As EventArgs) Handles BUTtest.Click
Dim SecondForm as New Form2()
SecondForm.show()
End Sub
然后在表格2中:

Private Sub BUToption1_Click(sender As Object, e As EventArgs) Handles BUToption1.Click
Form1.LBLtest.text = "You've chosen option 1"
Me.Hide()
End Sub
一切都会像在梦中一样。 现在在VisualStudio2019中,这根本不起作用,因为它不允许我在没有为表单本身声明对象的情况下从另一个表单调用任何东西

现在我用表格1写下:

Private Sub BUTtest_Click(sender As Object, e As EventArgs) Handles BUTtest.Click
Form2.show()
End Sub
Private Sub BUTtest_Click(sender As Object, e As EventArgs) Handles BUTtest.Click
Dim SecondForm as New Form2()
SecondForm.show()
End Sub
在Form2中,我不知道我能写什么,因为如果我使用相同的“Dim FirstForm as New Form1()”,程序将要做的是创建一个新的对象Form1,它不是已经打开的对象Form1,并且我在打开的Form1中看不到任何更改

(我也不明白为什么2012年的比赛如此轻松,而现在却如此痛苦)

任何帮助都将不胜感激


注意:Form2隐藏而不是关闭是很重要的。在另一种情况下,将有单选按钮和其他东西,我希望选择的选项仍然存在,以便在表单再次显示时进行修改。如果它是关闭的,它将从头开始打开。

你这样做完全是错误的。正确的方法是
Form1
创建
Form2
实例,将所需的任何数据传递给它,然后通过调用
ShowDialog
来显示它。当用户单击
Form2
上的
按钮时,该按钮将关闭,
ShowDialog
调用将返回
Form1
然后根据需要使用
Form2
中的返回值和/或适当的属性值。如果需要再次显示
Form2
,则创建一个新实例并再次传递它所需的任何数据。您不需要隐藏
Form2
,它就可以维护状态。将表示其状态的数据存储在适当的位置,然后在下次显示时使用该数据

这里有一个例子。我刚刚创建了一个包含两个表单的项目。在
Form2
上,我添加了两个
按钮
和一个
组合框
。以下是表格2的代码:

'The SelectedIndex of the ComboBox.
Public Property SelectedIndex As Integer

'The text for the Button that was clicked.
Public Property OptionText As String

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Select the same item that was selected last time.
    ComboBox1.SelectedIndex = SelectedIndex
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Remember what item was selected.
    SelectedIndex = ComboBox1.SelectedIndex

    'Indicate what Button was clicked.
    OptionText = "Option 1"

    'Close this instance permanently.
    Close()
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    'Remember what item was selected.
    SelectedIndex = ComboBox1.SelectedIndex

    'Indicate what Button was clicked.
    OptionText = "Option 2"

    'Close this instance permanently.
    Close()
End Sub
Form1
上,我添加了一个
按钮
和一个
标签
。以下是表格1的代码:

'The SelectedIndex of the ComboBox on Form2.
Private form2SelectedIndex As Integer = -1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Create a new instance of Form2.
    Using dialogue As New Form2
        'Tell the dialogue what item to select.
        dialogue.SelectedIndex = form2SelectedIndex

        'Show the dialogue modally.
        dialogue.ShowDialog()

        'Remember what item was selected.
        form2SelectedIndex = dialogue.SelectedIndex

        'Display the text based on which Button was clicked.
        Label1.Text = dialogue.OptionText
    End Using
End Sub
如果您创建这样一个项目并运行它,您将看到它完全按照您的预期工作。每次单击
表单2
上的
按钮时,正确的文本将显示在
标签
中,并且
表单2
的状态-在这种情况下,无论您打开和关闭对话框多少次,
组合框中的选择都将保持不变

请注意,
Form2
完全不知道
Form1
的存在,这正是它应该存在的情况。如果可能的话,你应该避免像那样的紧密耦合。目前,您可以在完全不同的场景中使用相同的
Form2
类,它仍然可以工作,因为它对
Form1
或它包含的控件没有特定的依赖性。需要对任一窗体上的控件进行的任何更改都只能由该窗体完成。即使在
Form2
上,
Form1
也只是通过属性提供数据,如何基于该数据修改自己的控件取决于
Form2

要显示VS 2019支持默认实例的方式与2005年以来的每个版本完全相同,您可以将
Form1
中的代码更改为如下所示:

'The SelectedIndex of the ComboBox on Form2.
Private form2SelectedIndex As Integer = -1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Use the default instance of Form2.

    'Tell the dialogue what item to select.
    Form2.SelectedIndex = form2SelectedIndex

    'Show the dialogue modally.
    Form2.ShowDialog()

    'Remember what item was selected.
    form2SelectedIndex = Form2.SelectedIndex

    'Display the text based on which Button was clicked.
    Label1.Text = Form2.OptionText
End Sub
运行它,您会发现,从用户的角度来看,它的工作方式完全相同。实际上,当您通过调用
ShowDialog
来显示表单时,关闭它并不会处理它。在第一个场景中,
Form2
实例是使用
Using
语句创建的,因此它在
结束时使用
语句进行处理,这意味着每次都必须创建一个新实例。如果不处理它,实际上可以再次显示相同的实例。这意味着您可以使用默认实例,而不必记住状态,因为每次都是同一个实例。这意味着您可以将代码简化为:

'The text for the Button that was clicked.
Public Property OptionText As String

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Indicate what Button was clicked.
    OptionText = "Option 1"

    'Close this instance permanently.
    Close()
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    'Indicate what Button was clicked.
    OptionText = "Option 2"

    'Close this instance permanently.
    Close()
End Sub
这是:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Use the default instance of Form2.

    'Show the dialogue modally.
    Form2.ShowDialog()

    'Display the text based on which Button was clicked.
    Label1.Text = Form2.OptionText
End Sub
它会像预期的那样工作。也就是说,默认实例是大多数有经验的开发人员都会避免的,建议其他人也避免。它们的存在有两个主要原因:一是帮助不了解对象如何工作的初学者,二是帮助习惯于以这种方式工作的VB6开发人员迁移表单。如果您想成为一名VB.NET开发人员,最好像对待任何其他对象一样对待表单,即根据需要创建和销毁实例


表单关于表单间通信的更多信息,您可以阅读我的三部分博客文章。第一部分是关于默认表单实例的。值得一读,但正如我所说,我建议不要使用它们。第二部分是一种老套的做事方式,第三部分是“正确”的做事方式。

你错了,这在VS 2019中不起作用。我只是自己测试了一下,以确认我已经知道了什么,也就是说,你所描述的和你在VS2019中描述的完全一样。如果在这个特定的应用程序中它不适合你,那是因为你做了一些事情来阻止它。您的代码使用默认实例,它们只能在特定情况下工作,因此您必须做一些事情来创建它们无法工作的环境。您对“它不允许我”的模糊描述并不能帮助我们确定是什么,但是,除非您的VS安装被破坏,否则这是您所做的事情。如果不清楚,请道歉,但是