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

时间:2018-05-21 16:27:54

标签: vb.net forms

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

这一切在第一次完成时效果很好。但是,第二次调用第二个表单时,下拉列表为空白。我通过一些调试确认正在运行正确的代码并且正在通过" SecondForm.ComboBox1.Items.Add"添加条目。 (我可以清除组合框,检查它是零,读取数据,然后再次检查列表中的项目,它会正确增加)但它们只是没有显示在表单上。我无法弄清楚为什么或如何解决它。

所以代码的相关部分......

在表单级别,我有这一行来设置第二个表单,我相信我需要WithEvents来传递所选数据,据我所知:

Public Class Form1 Friend WithEvents SecondForm As New Form2
Public Sub OpenStripformatstxtToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenStripformatstxtToolStripMenuItem.Click

    Dim fd As OpenFileDialog = New OpenFileDialog()
    Dim pos1 As Integer
    Dim pos2 As Integer


    ' Select the file to open
    fd.Title = "Open File Dialog"
    fd.InitialDirectory = "C:\BEST\Data"
    fd.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"
    fd.FilterIndex = 1
    fd.RestoreDirectory = True

    ' Put the filename selected in strfilename2
    If fd.ShowDialog() = DialogResult.OK Then
        strFileName2 = fd.FileName
    Else : Return
    End If

    If SecondForm.IsDisposed Then
        Dim 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))

上面的这一行填充了ComboBox,但是在显示表单的第一个实例后显示给用户的表单上没有显示该数据

        End If

        ' Next step in the string
    Next pos1
End Sub
Private Sub secondform_formclosing(sender As Object, e As FormClosingEventArgs) Handles SecondForm.FormClosing

这里有几百行代码,然后处理从表单关闭传递的数据,即ComboBox的选定值。这一切都适用于第一次运行代码,但由于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提供事件处理程序,而我似乎无法弄清楚如何使用它们甚至是它们的用途。如果隐藏表单是一个更好的替代解决方案,如果有人可以指出我正确的方向,如何做到这一点以及使用什么处理程序,那么我将感激不尽。

我可能做了一些非常愚蠢的事情,因为我所做的一切都是通过谷歌搜索自学,我可能对于为什么我需要做某些事情缺乏更多的理解,所以对任何无知的道歉我这边。考虑到这一点,如果我以一种完全愚蠢的方式做任何事情,我会以一种有帮助的方式重写它,但我可能需要一些手握这样做!

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

1 个答案:

答案 0 :(得分:1)

这里出现了主要问题:

If SecondForm.IsDisposed Then
    Dim secondform As New Form2

您在那里声明了一个新的局部变量,并将新的Form2对象分配给该变量,而不是成员变量,所以当您稍后引用成员变量来填充ComboBox时,您就是&#39 ;不要引用您刚创建的Form2实例。

无论如何,你的代码相当奇怪。这是我的建议。

首先,摆脱填充Form1ComboBox的代码格式Form2。表单应填充自己的控件。放置代码以填充ComboBox Load事件处理程序中的Form2。您确保无论何时在Show的新实例上调用Form2,都会执行填充ComboBox的代码。这就是表单应该如何运作。

作为替代方案,假设您正在从文件中读取并且数据可能在会话过程中无法更改,请读取数据并将其放入Load中的数组中Form1的事件处理程序,然后将该数组传递给Form2的构造函数。您必须自己编写该构造​​函数,并在其中使用数组数据填充ComboBox。这样,您就不会一遍又一遍地阅读和处理相同的数据文件,但仍然会在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方法以确保它具有焦点。