如何在添加到窗体的Partial User Class中访问单个按钮点击事件
问题描述
我已退休二十余年,期间未接触SQL、Visual Studio等技术,如今重新学习SQL、VS、VB.NET及C#。我创建了一个可用于不同窗体的Partial User Class(用户控件类),其中包含九个按钮(含一个退出按钮),希望点击退出按钮时返回调用窗体。但问题是,将该类添加到窗体后,我无法处理其中单个按钮的点击事件——所有按钮均已声明为public,却找不到处理按钮点击的事件,也无法识别点击的是哪个按钮。我尝试了如下代码但未能成功:
Private Sub UserControl11_Click(sender As Object, e As EventArgs) Handles UserControl11.Click 'How to identify which button has been clicked Dim oButton As DirectCast(sender, Text) MsgBox(oButton.text) End Sub
解决方案
方法一:用户控件内部处理事件,向外暴露自定义事件
这是最规范的做法,能避免宿主窗体直接操作用户控件内部元素:
- 打开你的用户控件代码文件(比如
UserControl1.vb) - 为内部按钮添加点击事件处理,并触发自定义事件:
' 处理退出按钮点击 Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click RaiseEvent ExitButtonClicked(Me, EventArgs.Empty) End Sub ' 批量处理其他按钮点击 Private Sub CommonButton_Click(sender As Object, e As EventArgs) Handles btn1.Click, btn2.Click, btn3.Click, btn4.Click, btn5.Click, btn6.Click, btn7.Click, btn8.Click Dim clickedBtn As Button = DirectCast(sender, Button) RaiseEvent ButtonClicked(clickedBtn, EventArgs.Empty) End Sub - 在用户控件类的顶部声明自定义事件:
Public Event ExitButtonClicked(sender As Object, e As EventArgs) Public Event ButtonClicked(clickedButton As Button, e As EventArgs) - 返回宿主窗体,选中用户控件(比如
UserControl11),在属性窗口的「事件」面板里就能找到ExitButtonClicked和ButtonClicked事件,双击即可添加处理代码:Private Sub UserControl11_ExitButtonClicked(sender As Object, e As EventArgs) Handles UserControl11.ExitButtonClicked ' 关闭当前窗体,回到调用窗体 Me.Close() End Sub Private Sub UserControl11_ButtonClicked(clickedButton As Button, e As EventArgs) Handles UserControl11.ButtonClicked MsgBox("点击了按钮:" & clickedButton.Text) End Sub
方法二:直接在宿主窗体关联用户控件内的按钮事件
如果按钮已经设为Public,可以直接在宿主窗体里绑定事件:
' 在窗体加载时绑定事件 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load AddHandler UserControl11.btnExit.Click, AddressOf ExitBtn_Click AddHandler UserControl11.btn1.Click, AddressOf NormalBtn_Click ' 其他按钮依次添加绑定 End Sub Private Sub ExitBtn_Click(sender As Object, e As EventArgs) Me.Close() End Sub Private Sub NormalBtn_Click(sender As Object, e As EventArgs) Dim targetBtn As Button = DirectCast(sender, Button) MsgBox("点击了:" & targetBtn.Text) End Sub
你之前代码的问题说明
- 你监听的是用户控件本身的
Click事件,不是内部按钮的点击事件,所以sender是用户控件,不是按钮 DirectCast(sender, Text)类型转换错误,Text不是控件类型,正确的应该是DirectCast(sender, Button)
内容的提问来源于stack exchange,提问作者MGC
相关产品推荐
相关产品推荐

