首页 > 解决方案 > 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 在这种情况下无法访问,因为它是朋友。

用户控件自定义事件是否仅在同一项目上创建的用户控件才有效?

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

如果您能就如何创建自定义事件处理程序给出一些指示,或者我只是在同一个项目上创建用户控件以使其工作,我将不胜感激。

谢谢你。

标签: vb.netwinforms

解决方案


虽然简单的解决方案是只声明子控件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每个事件处理程序中的,而不是单个子控件。


推荐阅读