VB.NET类库如何通过程序操作外部Windows窗体(Form)?
我计划把项目的菜单做成一个类库,以方便代码的管理!可是我不知道类库如何对外部Form窗体进行操作,具体如下:
GenMenus类库的全部代码:
Form1的全部代码:
项目中有两个Form,分别名为:Form1、Form2
菜单可以成功添加到Form1上,并且单击退出系统,退出功能可以正常执行。
期望通过单击“用户管理”菜单项以打开Form2窗体,但单击这个菜单项就出错。
请问我应该怎样修改类库的代码,才能使这个类库成功对窗体Form2进行操作?谢谢!
GenMenus类库的全部代码:
Imports System.Windows.Forms
Public Class Menus
Private Sub MenuBar1_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Form2.Text = "用户管理"
Form2.Show()
End Sub
Private Sub MenuBar1_2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Application.Exit()
End Sub
Public Function MainMenu() As MenuStrip
Dim MenuBar1 As New ToolStripMenuItem
Dim MenuBar1_1 As New ToolStripMenuItem
Dim MenuBar1_2 As New ToolStripMenuItem
MenuBar1.Text = "系统(&Y)"
MenuBar1_1.Text = "用户管理(&U)"
MenuBar1_2.Text = "退出系统(&E)"
AddHandler MenuBar1_1.Click, AddressOf Me.MenuBar1_1_Click
AddHandler MenuBar1_2.Click, AddressOf Me.MenuBar1_2_Click
MenuBar1.DropDownItems.Add(MenuBar1_1)
MenuBar1.DropDownItems.Add(MenuBar1_2)
Dim ToolStripMainMenu As New MenuStrip
ToolStripMainMenu.Items.Add(MenuBar1)
Return ToolStripMainMenu
End Function
End Class
Form1的全部代码:
Imports GenMenus
Public Class Form1
Dim myMenus As New Menus
Private Sub Main_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.Controls.Add(myMenus.MainMenu())
End Sub
End Class
项目中有两个Form,分别名为:Form1、Form2
菜单可以成功添加到Form1上,并且单击退出系统,退出功能可以正常执行。
期望通过单击“用户管理”菜单项以打开Form2窗体,但单击这个菜单项就出错。
请问我应该怎样修改类库的代码,才能使这个类库成功对窗体Form2进行操作?谢谢!
...全文
请发表友善的回复…
发表回复
ckp00001 2010-08-30
- 打赏
- 举报
Form2 被关闭后,下次打开的Form2还是它,并没有多占内存,一般都是这样用;
不过如你想点一下"用户管理"打开一个Form2,不关闭它;
再次点一下"用户管理",又打开一个Form2... 如果想这样的话,
可以用委托或事件的方法来动态创建Form2的实例来实现的。
不过如你想点一下"用户管理"打开一个Form2,不关闭它;
再次点一下"用户管理",又打开一个Form2... 如果想这样的话,
可以用委托或事件的方法来动态创建Form2的实例来实现的。
gzpydc 2010-08-28
- 打赏
- 举报
[Quote=引用 5 楼 ckp00001 的回复:]
Form2须传导进Class Menus
Dim f As Form = New Form2
Dim myMenus As New Menus(f)
Me.Controls.Add(myMenus.MainMenu())
====================================
在Class Menus中:
Dim Form2 As Form
……
[/Quote]
你好,刚才发现了一个比较严重的问题,用你这个方法后,是可以成功打开Form2了,但当我点击了Form2右上角的叉叉把Form2关闭后,再重新选择菜单就打不开Form2,并且出错了。
错误为:无法访问已释放的对象
我觉得是因为New传导的时候,只是加载菜单的时候New了一次,关闭Form2的时候,就等于把New进去的对象关闭了,应该是这样的吧?但我又想不到用什么方法来解决这个错误。
Hide不太现实,如果我的程序有很多个Form,那每个Form都打开后就一直长驻内存,那会比较耗资源,请问有方法解决这个问题,以使Form2关闭后还能再次被打开吗?
Form2须传导进Class Menus
Dim f As Form = New Form2
Dim myMenus As New Menus(f)
Me.Controls.Add(myMenus.MainMenu())
====================================
在Class Menus中:
Dim Form2 As Form
……
[/Quote]
你好,刚才发现了一个比较严重的问题,用你这个方法后,是可以成功打开Form2了,但当我点击了Form2右上角的叉叉把Form2关闭后,再重新选择菜单就打不开Form2,并且出错了。
错误为:无法访问已释放的对象
我觉得是因为New传导的时候,只是加载菜单的时候New了一次,关闭Form2的时候,就等于把New进去的对象关闭了,应该是这样的吧?但我又想不到用什么方法来解决这个错误。
Hide不太现实,如果我的程序有很多个Form,那每个Form都打开后就一直长驻内存,那会比较耗资源,请问有方法解决这个问题,以使Form2关闭后还能再次被打开吗?
gzpydc 2010-08-27
- 打赏
- 举报
[Quote=引用 5 楼 ckp00001 的回复:]
Form2须传导进Class Menus
Dim f As Form = New Form2
Dim myMenus As New Menus(f)
Me.Controls.Add(myMenus.MainMenu())
====================================
在Class Menus中:
Dim Form2 As Form
……
[/Quote]
最后还是用你的这个方法实现了,之前出现的错误是因为我传参的句子写错了,谢谢你的帮助!分全给你了!
Form2须传导进Class Menus
Dim f As Form = New Form2
Dim myMenus As New Menus(f)
Me.Controls.Add(myMenus.MainMenu())
====================================
在Class Menus中:
Dim Form2 As Form
……
[/Quote]
最后还是用你的这个方法实现了,之前出现的错误是因为我传参的句子写错了,谢谢你的帮助!分全给你了!
gzpydc 2010-08-27
- 打赏
- 举报
[Quote=引用 10 楼 ckp00001 的回复:]
我用的是Visual Studio 2005测试的,一切正常,也可以打开Form2窗体的!
[/Quote]
经过了研究,自己实现了对调用菜单的窗体进行操作,但是对调用菜单以外的其它窗还是找不到操作的方法!
我的#1代码,把Sub MenuBar1_1_Click的整个过程替换成如下的代码后,就实现了对调用菜单的Form1操作,不知道能不能在此的基础上,再进一步对Form2进行操作呢?
我用的是Visual Studio 2005测试的,一切正常,也可以打开Form2窗体的!
[/Quote]
经过了研究,自己实现了对调用菜单的窗体进行操作,但是对调用菜单以外的其它窗还是找不到操作的方法!
我的#1代码,把Sub MenuBar1_1_Click的整个过程替换成如下的代码后,就实现了对调用菜单的Form1操作,不知道能不能在此的基础上,再进一步对Form2进行操作呢?
Private Sub MenuBar1_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
ToolStripMainMenu.Parent.Text = "MenuForm"
End Sub
ckp00001 2010-08-27
- 打赏
- 举报
我用的是Visual Studio 2005测试的,一切正常,也可以打开Form2窗体的!
gzpydc 2010-08-27
- 打赏
- 举报
我的是Visual Studio 2010中的VB2010
gzpydc 2010-08-27
- 打赏
- 举报
按你的#5修改,也就是最终按你的#5修改成我的#6,但仍然是:
菜单可以成功添加到Form1上,并且单击退出系统,退出功能可以正常执行。
期望通过单击“用户管理”菜单项以打开Form2窗体,但单击这个菜单项就出错。
菜单可以成功添加到Form1上,并且单击退出系统,退出功能可以正常执行。
期望通过单击“用户管理”菜单项以打开Form2窗体,但单击这个菜单项就出错。
ckp00001 2010-08-27
- 打赏
- 举报
不知你的错发生在什么地方.
按照你#1的代码和我加进去的,已测试了,正常!
按照你#1的代码和我加进去的,已测试了,正常!
gzpydc 2010-08-27
- 打赏
- 举报
Imports System.Windows.Forms
Public Class Menus
'这部份是根据 #5 的建议修改的
Dim Form2 As Form
Public Sub New(ByVal f As Form)
Form2 = f
End Sub
'修改结束
Private Sub MenuBar1_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Form2.Text = "用户管理"
Form2.Show()
End Sub
Private Sub MenuBar1_2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Application.Exit()
End Sub
Public Function MainMenu() As MenuStrip
Dim MenuBar1 As New ToolStripMenuItem
Dim MenuBar1_1 As New ToolStripMenuItem
Dim MenuBar1_2 As New ToolStripMenuItem
MenuBar1.Text = "系统(&Y)"
MenuBar1_1.Text = "用户管理(&U)"
MenuBar1_2.Text = "退出系统(&E)"
AddHandler MenuBar1_1.Click, AddressOf Me.MenuBar1_1_Click
AddHandler MenuBar1_2.Click, AddressOf Me.MenuBar1_2_Click
MenuBar1.DropDownItems.Add(MenuBar1_1)
MenuBar1.DropDownItems.Add(MenuBar1_2)
Dim ToolStripMainMenu As New MenuStrip
ToolStripMainMenu.Items.Add(MenuBar1)
Return ToolStripMainMenu
End Function
End Class
Imports GenMenus
Public Class Form1
'这部份是根据 #5 的建议修改的
Dim f As Form = New Form2
Dim myMenus As New Menus(f)
'修改结束
Private Sub Main_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.Controls.Add(myMenus.MainMenu())
End Sub
End Class
按照你的方法修改后,还是会出错,错误提示为:
无法将类型为“System.Windows.Forms.ToolStripMenuItem”的对象强制转换为类型“System.Windows.Forms.Form”。
ckp00001 2010-08-27
- 打赏
- 举报
Form2须传导进Class Menus
Dim f As Form = New Form2
Dim myMenus As New Menus(f)
Me.Controls.Add(myMenus.MainMenu())
====================================
在Class Menus中:
Dim Form2 As Form
Public Sub New(ByVal f As Form)
Form2 = f
End Sub
Dim f As Form = New Form2
Dim myMenus As New Menus(f)
Me.Controls.Add(myMenus.MainMenu())
====================================
在Class Menus中:
Dim Form2 As Form
Public Sub New(ByVal f As Form)
Form2 = f
End Sub
gzpydc 2010-08-27
- 打赏
- 举报
[Quote=引用 3 楼 ckp00001 的回复:]
在项目中,可将另外一项目(或Dll文件)添加进去;
1:在解决方案资源管理器中,右击“引用”->添加引用->项目(或Dll文件);
2:在程序中:
Imports 你的项目名称
Dim myMenus As New Menus
[/Quote]
都已经做了,要不然Form1的开头也不会有 Imports GenMenus 这句了,并且成功添加到菜单了,而且,菜单已经可以运行了,就是菜单委托里面的过程不能对外部Form2操作.
在项目中,可将另外一项目(或Dll文件)添加进去;
1:在解决方案资源管理器中,右击“引用”->添加引用->项目(或Dll文件);
2:在程序中:
Imports 你的项目名称
Dim myMenus As New Menus
[/Quote]
都已经做了,要不然Form1的开头也不会有 Imports GenMenus 这句了,并且成功添加到菜单了,而且,菜单已经可以运行了,就是菜单委托里面的过程不能对外部Form2操作.
ckp00001 2010-08-27
- 打赏
- 举报
在项目中,可将另外一项目(或Dll文件)添加进去;
1:在解决方案资源管理器中,右击“引用”->添加引用->项目(或Dll文件);
2:在程序中:
Imports 你的项目名称
Dim myMenus As New Menus
1:在解决方案资源管理器中,右击“引用”->添加引用->项目(或Dll文件);
2:在程序中:
Imports 你的项目名称
Dim myMenus As New Menus
长风起点 2010-08-27
- 打赏
- 举报
没用过VB,友情帮顶
如一宝宝 2010-08-27
- 打赏
- 举报
没用过VB,友情帮顶