vb.net - vb winform 自定义事件处理程序
问题描述
我正在尝试在用户控件上添加自定义事件处理程序。
如果我在同一个解决方案和同一个项目上创建用户控件,我可以在主窗体上添加自定义事件处理程序。
AddHandler usercontrol1.button.click,button_clickHandler的地址
当我输入 usercontrol1. 我可以从弹出代码完成中选择按钮
但是如果我在同一个解决方案上为用户控件创建另一个项目,比如说用户控件名为 uc 所以在我将它放在名为 uc1 的主窗体上之后
AddHandler uc1.button.click...
当我输入uc1。如果我输入 AddHandler uc1.button.click, addressof button_clickHandler2,我在弹出代码完成和编译时看不到按钮
我得到编译错误 uc1.button 在这种情况下无法访问,因为它是朋友。
用户控件自定义事件是否仅在同一项目上创建的用户控件才有效?
我只是想在一个项目中将公共用户控件和其他公共库分开,这样它就可以被其他项目使用,而不是在每个项目上创建相同的用户控件。
如果您能就如何创建自定义事件处理程序给出一些指示,或者我只是在同一个项目上创建用户控件以使其工作,我将不胜感激。
谢谢你。
解决方案
虽然简单的解决方案是只声明子控件Public
而不是 default Friend
,但好的做法是无论如何都不要公开用户控件的子控件,无论它在哪里声明。应该制作子控件,Private
并且应该为希望从外部访问的任何属性、方法或事件提供传递。例如,ButtonClick
在用户控件中声明自己的Click
事件,在内部处理事件,Button
然后引发自己的事件,例如
Public Event ButtonClick As EventHandler
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
OnButtonClick(EventArgs.Empty)
End Sub
Protected Overridable Sub OnButtonClick(e As EventArgs)
RaiseEvent ButtonClick(Me, e)
End Sub
然后,您的表单将处理用户控件而不是其子控件的事件。有关声明和引发您自己的事件的更多信息,请参见此处。
顺便说一句,不制作子控件的一个原因Public
是,任何可以访问用户控件的代码都可以访问子控件的各个方面,包括能够用新控件替换它们。通过制作它们Private
并提供传递,您只公开了应该从外部访问的子控件的特定方面。这也意味着您的用户控件更像是一个集成单元,而不是一组部件。具体就事件而言,这也意味着用户控件是sender
每个事件处理程序中的,而不是单个子控件。
推荐阅读
- configuration - 用证书连接 Kurento
- javascript - 如何使用 formik 和 yup 验证对数组字段进行验证
- java - 我无法进入第二个循环,而第一个循环是正确的,但不能进入第二个
- c++ - E0349:在使用 nlohmann-json 使用 JSON 时,没有运算符“=”匹配这些操作数
- apache - Htaccess中的分页URL结构
- spartacus-storefront - Spartacus 3.1 从 1.4.4 升级显示空白页
- topic-modeling - 如何使用 python 3.7 在 jupyter notebook 上应用 lda2vec?
- flutter - ScrollBar 和 SingleChildScrollView 不起作用
- python - TypeError: 'int' 对象在使用 model.fit() 时不可迭代
- c - 如何删除已经写在c输出中的东西