Vb.net vb winform自定义事件处理程序

Vb.net vb winform自定义事件处理程序,vb.net,winforms,Vb.net,Winforms,我正在尝试在用户控件上添加自定义事件处理程序 如果在同一解决方案和同一项目上创建用户控件,则可以在主窗体上添加自定义事件处理程序 AddHandler usercontrol1.button.click,按钮的地址\u clickHandler 当我输入usercontrol1时。我可以从弹出的代码完成中选择按钮 但是如果我在同一个解决方案上为用户控制创建另一个项目,比如称为uc的用户控制 所以在我把它放在名为uc1的主窗体上之后 AddHandler uc1.按钮。单击 当我输入uc1时。我看

我正在尝试在用户控件上添加自定义事件处理程序

如果在同一解决方案和同一项目上创建用户控件,则可以在主窗体上添加自定义事件处理程序

AddHandler usercontrol1.button.click,按钮的地址\u clickHandler

当我输入usercontrol1时。我可以从弹出的代码完成中选择按钮

但是如果我在同一个解决方案上为用户控制创建另一个项目,比如称为uc的用户控制 所以在我把它放在名为uc1的主窗体上之后

AddHandler uc1.按钮。单击

当我输入uc1时。我看不到按钮上的弹出代码完成,当我编译它,如果我键入 AddHandler uc1.button.click,按钮的地址\u ClickHandler 2

我收到编译错误uc1.button在此上下文中不可访问,因为它是friend。

仅当用户控件在同一项目上创建时,用户控件自定义事件才起作用吗

我只是想在一个项目中分离公共用户控件和其他公共库,这样它就可以被其他项目使用,而不是在每个项目上创建相同的用户控件

如果您能给我一些关于如何创建自定义事件处理程序的指针,或者我只需要在同一个项目上创建用户控件就可以让它工作,我将不胜感激


谢谢。

虽然简单的解决方案是只声明子控件
Public
,而不是默认的
Friend
,但好的做法是无论如何都不要公开用户控件的子控件,不管它声明在何处。子控件应该是私有的,并且您应该为希望从外部访问的任何属性、方法或事件提供传递。例如,声明自己的
按钮单击用户控件中的
事件,在内部处理
按钮的
事件,然后引发自己的事件,例如

公共事件按钮单击作为事件处理程序
私有子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
OnButtonClick(EventArgs.Empty)
端接头
受保护的可重写子按钮单击(e作为事件参数)
升起事件按钮单击(Me,e)
端接头
然后,窗体将处理用户控件的事件,而不是其子控件的事件。有关声明和引发自己的事件的更多信息,请参阅


顺便说一句,不将子控件
公开的一个原因是,可以访问用户控件的任何代码都可以访问子控件的各个方面,包括能够用新控件替换它们。通过将它们设置为私有的,并提供传递,您可以只公开应该从外部访问的子控件的特定方面。这也意味着用户控件的行为更像是一个集成单元,而不是一个零件集合。特别是在事件方面,这还意味着用户控件是每个事件处理程序中的
发送方
,而不是单个子控件。

这与用户控件或事件处理程序无关,只是关于访问级别。显然,您不知道Friend的意思,因此您应该了解它的含义以及替代方法。如果有疑问或遇到编译器错误,请从Public开始,然后根据需要/首选放弃访问。(我总是将访问权限限制在你能逃脱的最低限度,例如
私有
受保护
受保护的朋友
朋友
公共
-我错过了什么吗?)。有关默认值,请参阅doco,例如未声明访问级别的
Class
(您应该始终声明访问权限,同样是IMHO)。(很明显,这比我在这里写的要多得多。)