Vb.net 第二次加载表单时未填充控件

Vb.net 第二次加载表单时未填充控件,vb.net,forms,Vb.net,Forms,我有一个程序调用第二个表单。第二个表单有一个由外部文件内容填充的组合框,用户需要从显示的选项中选择组合框中的一个选项。然后将此选择传递回主窗体,在主窗体中完成大量工作 这一切在第一次完成时都能很好地工作。但是,第二次调用第二个表单时,下拉列表为空。我已经通过一些调试确认正在运行正确的代码,并且正在通过“SecondForm.ComboBox1.Items.Add”添加条目(我可以清除combobox,检查它为零,读取数据,然后再次检查列表中的项目,它会正确增加),但它们只是没有显示在表单上。我不

我有一个程序调用第二个表单。第二个表单有一个由外部文件内容填充的组合框,用户需要从显示的选项中选择组合框中的一个选项。然后将此选择传递回主窗体,在主窗体中完成大量工作

这一切在第一次完成时都能很好地工作。但是,第二次调用第二个表单时,下拉列表为空。我已经通过一些调试确认正在运行正确的代码,并且正在通过“SecondForm.ComboBox1.Items.Add”添加条目(我可以清除combobox,检查它为零,读取数据,然后再次检查列表中的项目,它会正确增加),但它们只是没有显示在表单上。我不知道为什么或者如何修复它

所以代码的相关部分

在表单级别,我有这行代码来设置第二个表单,我相信我需要WithEvents将所选数据传递回我所能知道的范围:

Public Class Form1 Friend WithEvents SecondForm As New Form2

我怀疑上面这行就是问题所在,我正在第二次创建表单,但没有WithEvents参数。但是我不能在这部分代码中使用它,我得到一个错误“'WithEvents'不是有效的局部变量声明”。我已经读到,关闭和重新打开表单不是很好的编码,我应该隐藏/显示它们

        secondform.Show()
        InitializeComponent()

    Else
        SecondForm.Show()
    End If

    ' Copy the file contents to a string called sfcontents (Strip Format Contents)
    sfcontents = My.Computer.FileSystem.ReadAllText(fd.FileName)


    ' Define some points in the string, starting at the beginning
    pos1 = 1
    pos2 = 1


    ' Loop from the start to the end of the string
    For pos1 = 1 To Len(sfcontents)

        ' Look for FO, the strip name header, do the following if you find it
        If Mid(sfcontents, pos1, 3) = "FO " Then
            pos1 = pos1 + 3
            pos2 = pos1 + 1

            'Find the space after "FO " so we've captured the whole next word, that's the strip name
            Do Until Mid(sfcontents, pos2, 1) = " "
                pos2 = pos2 + 1
            Loop
            ' Add that strip name to the combobox for selecting by user
            SecondForm.ComboBox1.Items.Add(Mid(sfcontents, pos1, pos2 - pos1))
正是这一行在上面填充组合框,但是在显示表单的第一个实例之后,数据不会显示在向用户显示的表单上

        End If

        ' Next step in the string
    Next pos1
End Sub

这里有几百行代码,然后处理表单关闭时传递的数据,即组合框的选定值。对于代码的第一次运行,这一切都可以正常工作,但是由于在后续运行中ComboBox是空的,因此之后它就不工作了。如果有人认为这会有所帮助,我很乐意发布这段代码,但我认为这会在现阶段把问题搞得一团糟,因为这段代码看起来不错。但是,请参阅下面关于事件处理程序的部分

End Sub

Form2.vb上的代码如下:

Public Class Form2
Public selectedstrip As String '= ComboBox1.SelectedItem
Public stripfunction As Integer

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If RadioButton1.Checked Then stripfunction = 1
    If RadioButton2.Checked Then stripfunction = 2
    If RadioButton3.Checked Then stripfunction = 3
    selectedstrip = ComboBox1.SelectedItem
    Me.Close()

End Sub
End Class
我在网上读到过一点,说关闭和重新打开表格,恕我直言,不是好的形式。然而,我需要form.hide的事件处理程序,我似乎不知道如何使用它们,甚至不知道它们是什么。如果隐藏表单是一个更好的替代解决方案,如果有人能为我指明正确的方向,告诉我如何做,以及使用什么样的处理程序,我将不胜感激

我可能在做一些非常愚蠢的事情,因为我做的每件事都是通过谷歌自学的,我可能对为什么我需要做某些事情缺乏更多的理解,所以我为自己的无知道歉。考虑到这一点,如果我以一种完全愚蠢的方式做任何事情,我愿意以一种有帮助的方式重写它,但我可能需要一些帮助来做到这一点


提前感谢任何人能给予的帮助

在他看来,主要问题是:

If SecondForm.IsDisposed Then
    Dim secondform As New Form2
您在那里声明了一个新的局部变量,并将新的
Form2
对象分配给该对象,而不是分配给成员变量,因此,当您稍后引用成员变量来填充
组合框时,您并不是指刚创建的
Form2
实例

你的代码很奇怪。这是我的建议

首先,去掉填充
Form2
中的
组合框的代码表单
Form1
。表单应该填充自己的控件。在
Form2
Load
事件处理程序中,放入用于填充
组合框的代码。这样,您就可以保证在任何时候调用
Form2
的新实例上的
Show
,将执行填充
组合框的代码。这就是表单的工作方式

另一种方法是,如果您正在从文件中读取数据,并且数据可能不会在会话过程中发生更改,请读取数据并将其放入
Form1
Load
事件处理程序中的数组中,然后将该数组传递给
Form2
的构造函数。您必须自己编写该构造函数,并在其中使用数组数据填充
组合框。这样,您就不会一遍又一遍地读取和处理同一个数据文件,但仍然在
Form2
中填充
Form2
的控件

其次,更改此代码:

If SecondForm.IsDisposed Then
    Dim secondform As New Form2
    secondform.Show()
    InitializeComponent()
Else
    SecondForm.Show()
End If
为此:

If SecondForm.IsDisposed Then
    'Create and display a new instance.
    Secondform = New Form2
    Secondform.Show()
Else
    'Focus the existing instance.
    SecondForm.Activate()
End If
请注意,没有局部变量,因此新实例被分配给成员变量

也没有对
InitializeComponent
的调用。该方法是基于设计器中的操作在窗体上创建和配置控件的方法。唯一被调用的地方是在构造函数中

最后,如果已显示
Form2
的实例,则调用其
Activate
方法以确保其具有焦点

If SecondForm.IsDisposed Then
    Dim secondform As New Form2
    secondform.Show()
    InitializeComponent()
Else
    SecondForm.Show()
End If
If SecondForm.IsDisposed Then
    'Create and display a new instance.
    Secondform = New Form2
    Secondform.Show()
Else
    'Focus the existing instance.
    SecondForm.Activate()
End If