关于Vb.net 调用用户控件的子控件事件,AddHandler和RemoveHandler的使用方法

im战术 2017-04-08 01:29:26

Public Class UserControl1
'新建一个VB.net窗口程序,在里面添加一个用户控件:控件名为默认的UserControl1.vb
'复制这些代码到UserControl1.vb代码设计器里.
'打开UserControl1.vb设计面板,添加一个TextBox1和Button1.然后选择菜单栏里的 生成->重新生成解决方案
'这时你可在Form1.vb设计面板工具栏里找到UserControl1,拖一个到Form1.vb设计面板.
'使用方法是,按每个方法注解或去除注解来运行程序.
'程序运行后,你只要在那个TextBox里打字就可以看出效果
#Region "AddHandler的使用方法"
Sub TB1_TextChanged() '定义一个函数过程
BackColor = Color.Red 'UserControl1的底色变成红色
End Sub

Private Sub UserControl1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 添加回调函数 当回调函数被触发时 下面这个SUB或FUNCTION也被触发
AddHandler TextBox1.TextChanged, AddressOf TB1_TextChanged
End Sub


'''''上面的过程相当于这个过程,没什么吊用!
'Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
' TB1_TextChanged()
'End Sub
#End Region

#Region "AddHandler跟RemoveHandler的使用方法"
''添加RemoveHandler功能 运行先点断开按钮再输入看看效果,然后重开试着不点断开再输入看看
'Sub TB1_TextChanged(sender As Object, e As EventArgs) '注意这里面加了参数,因为不加的话RemoveHandler会报错
' BackColor = Color.Red
'End Sub

'Private Sub UserControl1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Me.Width = 500
' Button1.Text = "断开和回调函数的连接不再使用"
' Button1.Width = 240
' '----------------------------以上只是提示跟内容无关---------------------------


' ' 添加回调函数 当回调函数被触发时 下面这个SUB或FUNCTION也被触发
' AddHandler TextBox1.TextChanged, AddressOf TB1_TextChanged
'End Sub
''通过Button1我们可以 断开和回调函数的连接不再使用 这时就好像有点吊用了!
'Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' RemoveHandler TextBox1.TextChanged, AddressOf TB1_TextChanged
'End Sub


''''''上面的过程相当于这个过程!
''Sub TB1_TextChanged() '注意这里面不用加参数,因为没有参与绑定事件
'' BackColor = Color.Red
''End Sub

''Dim comp As Boolean
''Private Sub UserControl1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'' Me.Width = 500
'' Button1.Text = "断开和回调函数的连接不再使用"
'' Button1.Width = 240
'' '----------------------------以上只是提示跟内容无关---------------------------


'' ' 添加回调函数 当回调函数被触发时 下面这个SUB或FUNCTION也被触发
'' comp = True
''End Sub

''Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'' comp = False
''End Sub

''Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
'' If comp = True Then
'' TB1_TextChanged()
'' End If
''End Sub
#End Region
'总结AddHandler是个绑定事件的使用过程

#Region "Public Event和RaiseEvent的使用方法"
''下面是添加触发事件 也叫自定义事件触发 用处是让用户控件的子控件的个别事件能在用户控件里触发
'Public Event TB1_TextChanged(ByVal sender As Object, ByVal e As EventArgs) '添加一个自定义事件
''-------------注意以上是带参数的,参数要跟绑定事件的参数一样,可直接复制原参数到()里-------------
''-------------再有就是要用Public Event,不然Form1.vb里看不到事件-------------

''在TextBox1.TextChanged触发时,同时也触发自定义事件.
'Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
' RaiseEvent TB1_TextChanged(sender, e) '自定义事件被触发
'End Sub
#End Region
''''''将以下代码放到Form1.vb里,运行程序,TextBox里打字试试看.
''Public Class Form1
'' Private Sub TB1_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles UserControl11.TB1_TextChanged
'' BackColor = Color.Green
'' End Sub
''End Class
''''''总结Public Event和RaiseEvent是添加子控件事件添加到主控件自定义事件里的待触发定义
End Class


对于自定义事件,我想是不是还有别的方法可以直接使用用户控件子控件的事件呢.
如在Form1.vb里写

WithEvents oldTextBox As TextBox = UserControl11.TextBox1

Private Sub oldTextBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles oldTextBox.KeyPress
BackColor = Color.Green
End Sub

我试过New了没反应,不New就会报错说没实例化
还有为什么我要写这些,因为网上有关这四个方法写的实在太乱.我看不下去了完全是在误导国人.
好在我晕了两天后,要睡觉前想明白了,特此写下为大家提供最对的最简单的例子.
...全文
1521 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
??18608007982 2020-08-05
  • 打赏
  • 举报
回复
好贴,感谢分享研究成果,解决了问题!
STEPHENSYH 2018-08-01
  • 打赏
  • 举报
回复
楼主,非常感谢您的付出。我刚学VB.NET 2月好多概念不懂。自己准备编个工作用的管理软件,边学边干。正好卡在自定义控件这儿了。您的贴子非常不错,列举了种种方法。使我有点入门了。谢谢
OneCoderr 2017-07-12
  • 打赏
  • 举报
回复
我喜欢楼主的注释风格,教科书一样,给分吧。 我用AddHandler的经验是执行别重复了,及时Remove,不然它是事件会执行两次。
im战术 2017-07-03
  • 打赏
  • 举报
回复
谁来拿分!我累个去,老是让我自问自答!
im战术 2017-04-08
  • 打赏
  • 举报
回复
刚才试验了一下,成功了!这样就能使用用户控件的子控件所有事件响应.

Public Class Form1
    WithEvents oldTextBox As New TextBox

    Private Sub oldTextBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles oldTextBox.KeyPress
        BackColor = Color.Green
        Text = "成功"
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        oldTextBox = UserControl11.TextBox1
    End Sub
End Class

16,553

社区成员

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

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