有关窗体继承的问题

baoxiaodong 2008-10-27 07:39:26
在甲窗体中有一个按钮,定义单击事件过程是
Protected Overridable Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
乙窗体继承甲窗体,重新编写该事件过程
Protected Overrides Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click

结果错误提示是
事件Click为只读,因此无法更改。请问如何解决,谢谢

(只是一个警告错误,不影响程序的正常运行)
...全文
79 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
迈克揉索芙特 2008-10-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 PrinSun 的回复:]
5楼的,你的测试代码中子窗体的那个事件触发过程中的Overrides有写吗?也就是:
Public Overrides Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.ButtonClick
baseSub()
End Sub

否则我觉得会执行两次
[/Quote]

楼主的问题就是因为写上了Overrides,带Overrides的确要执行两次。
PrinSun 2008-10-28
  • 打赏
  • 举报
回复
5楼的,你的测试代码中子窗体的那个事件触发过程中的Overrides有写吗?也就是:
Public Overrides Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.ButtonClick
baseSub()
End Sub

否则我觉得会执行两次
迈克揉索芙特 2008-10-28
  • 打赏
  • 举报
回复

'下面两行没用,可以直接去掉
'Public Overridable Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.ButtonClick
'End Sub


即使这些不被屏蔽掉,也不会执行两次。请检查一下其他部分的代码。
迈克揉索芙特 2008-10-28
  • 打赏
  • 举报
回复
我测试并没有发现你说的情况。
以下是我测试的代码,是Form1继承了Form2:

'Form1
Public Class Form1
Inherits Form2
Sub baseSub()
MessageBox.Show(x.ToString)
End Sub

Public Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.ButtonClick
baseSub()
End Sub
End Class

'Form2
Public Class Form2
Protected x As Integer = 1

Public Event ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
'下面两行没用,可以直接去掉
'Public Overridable Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.ButtonClick
'End Sub

Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
RaiseEvent ButtonClick(sender, e)
End Sub
End Class
PrinSun 2008-10-28
  • 打赏
  • 举报
回复
baseSub执行两次
我觉得是:

Public Overridable Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.ButtonClick

End Sub

这一句中的一个Handles将事件绑定到这个过程中,而你是重载这个过程,所以执行了一次。不知道是不是你写错了,还是.NET版本不同,我是VS2003其中根本不支持在类定义中绑定类的事件“Handles Me.ButtonClick”。

Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
RaiseEvent ButtonClick(sender, e)
End Sub

当你再次点击这个按钮时,又触发了这个事件,所以执行了两次。
其实根本不需要这么麻烦的

Public Event ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
RaiseEvent ButtonClick(sender, e)
End Sub
子窗口:
Sub baseSub()
MessageBox.Show(x.ToString)
End Sub

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Mybase.ButtonClick
baseSub()
End Sub

baoxiaodong 2008-10-28
  • 打赏
  • 举报
回复
谢谢大家 这个问题我已经完全明白了 现在结贴 给分 请大家笑纳 o(∩_∩)o...
baoxiaodong 2008-10-27
  • 打赏
  • 举报
回复
谢谢两位的回答,事件Click为只读的错误已经解决了。但现在又有了新的问题,先把代码贴出来,我是这样写的
父窗口:
Protected x As Integer = 1

Public Event ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
Public Overridable Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.ButtonClick

End Sub

Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
RaiseEvent ButtonClick(sender, e)
End Sub

子窗口:
Sub baseSub()
MessageBox.Show(x.ToString)
End Sub

Public Overrides Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.ButtonClick
baseSub()
End Sub

但是运行子窗口后,点击按钮,发现baseSub过程执行了两遍(就是弹出两遍 1 ),不知是什么原因?谢谢
mjjzg 2008-10-27
  • 打赏
  • 举报
回复
UP
迈克揉索芙特 2008-10-27
  • 打赏
  • 举报
回复
可以在甲窗体中定义一个事件,比如:
Public Event ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
在甲窗体的button1_Click中激发该事件。

在乙窗体中就可以使用一个 Form_ButtonClick 事件

16,717

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧