我有一个调用第二种形式的程序。第二种形式有一个从外部文件的内容填充的组合框,用户需要从显示的选项中选择组合框中的选项。然后将此选择传递回主表单,在那里完成大量工作。
这一切在第一次完成时效果很好。但是,第二次调用第二个表单时,下拉列表为空白。我通过一些调试确认正在运行正确的代码并且正在通过" 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提供事件处理程序,而我似乎无法弄清楚如何使用它们甚至是它们的用途。如果隐藏表单是一个更好的替代解决方案,如果有人可以指出我正确的方向,如何做到这一点以及使用什么处理程序,那么我将感激不尽。
我可能做了一些非常愚蠢的事情,因为我所做的一切都是通过谷歌搜索自学,我可能对于为什么我需要做某些事情缺乏更多的理解,所以对任何无知的道歉我这边。考虑到这一点,如果我以一种完全愚蠢的方式做任何事情,我会以一种有帮助的方式重写它,但我可能需要一些手握这样做!
提前感谢任何人都能给予的帮助。
答案 0 :(得分:1)
这里出现了主要问题:
If SecondForm.IsDisposed Then
Dim secondform As New Form2
您在那里声明了一个新的局部变量,并将新的Form2
对象分配给该变量,而不是成员变量,所以当您稍后引用成员变量来填充ComboBox
时,您就是&#39 ;不要引用您刚创建的Form2
实例。
无论如何,你的代码相当奇怪。这是我的建议。
首先,摆脱填充Form1
中ComboBox
的代码格式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
方法以确保它具有焦点。