【发布时间】:2015-06-03 11:22:16
【问题描述】:
我在 vb.net 中玩耍,想为我的应用程序创建一个菜单。该应用程序有一个 Main,它是 MDI Parent,然后具有在用户浏览菜单结构时打开的子表单。我想跟踪用户来自哪个表单,以便当他们关闭当前表单时,它会打开他们之前打开的表单。
到目前为止,我有一个公共变量“FormTracking”,它是一个表单列表。打开表单功能工作正常,但是当他们关闭表单并调用“OpenPreviousForm”函数时,它会失败,因为前一个表单已关闭/处置。我如何创建表单的新实例,因为调用“NEW”似乎不起作用
Public FormTracking As New List(Of Form)
Public Sub OpenForm(theNewForm As Object)
'First Declare the new form
Dim f As Form = DirectCast(theNewForm, Form)
'Set the Forms parent
f.MdiParent = frmMain2
'Add the form to the tracking
FormTracking.Add(theNewForm)
'Show the form
f.Show()
End Sub
Public Sub OpenPreviousForm()
If modMenu.FormTracking.Count > 1 Then
Dim f As New Form
f = modMenu.FormTracking(modMenu.FormTracking.Count - 2)
'Set the Forms parent
f.MdiParent = frmMain2
'Remove the last item
modMenu.FormTracking.RemoveAt(modMenu.FormTracking.Count - 1)
'Show the form
f.Show()
Else
MessageBox.Show("Whoops, run out of forms.... ", "modMenu - OpenPreviousForm")
End If
End Sub
打开它调用的表单时:
modMenu.OpenForm(menupage_1)
me.close
关闭表单时,我尝试调用
modMenu.OpenPreviousForm()
调用上述代码时遇到的错误是
"An unhandled exception of type 'System.ObjectDisposedExeption' occured in System.Windows.Forms.dll
Additional Information: Cannot access a disposed object
我知道我需要再次创建对象,但不确定如何使用上述功能。或者,如果有人可以提供更好的应用程序菜单方式,请随时告诉我。 干杯
【问题讨论】:
-
Dim f As New Form不会创建特定表单的实例,而是所有表单都基于的通用基类。Dim frm As New MainForm其中“MainForm”是项目中的表单或类名。关键是每个表单都有自己的类或类型,因为它显示在每个表单的顶部:Public Class MainForm -
@Plutonix 虽然是真的,但这不是异常的原因。这是由以下代码行引起的,该代码行将最后一个(已处理的)表单分配给 f。
-
@ZoharPeled 我正在回答第一部分中嵌入的明确问题
How can i create a new instance of...Stephen,如果下一行为它分配了一个不同的实例,你也没有真正使用你的新表单实例:f = modMenu.Form...新实例正在被其他东西替换。 -
@Stephen:您需要在上一个状态下打开上一个表单,还是需要一个来自上一个表单类型的新表单?
-
嗨@ZoharPeled,我很高兴打开表单的一个新实例,因为它是一个菜单结构,所以表单只包含按钮。