我有一个用户控件,每次右键单击都会显示一个contextmenustrip。当用户在此菜单上选择一个项目时,我必须将此信息传递给父控件,以便它可以根据这个做出反应。
所以我需要父母强制订阅这个事件。有办法说出来吗?
如果没有办法做到这一点,我应该抛出一个异常还是只检查(值为事件处理程序)的空值而什么都不做?
感谢。
答案 0 :(得分:3)
在编译时无法强制执行此操作 - 这意味着.NET framework / C#语言中没有任何内容可以在编译时执行静态检查,以确保在您的代码中实现此逻辑。
在运行时,您可以执行必要的验证。例如,您可以检查委托的调用列表,以确保父级位于该列表中。
答案 1 :(得分:2)
您可以为用户控件创建一个特定的构造函数,以防止实例化,除非给出了事件处理程序,如下所示。
public partial class MyUserControl : UserControl {
public MyUserControl (ToolStripItemClickedEventHandler handler) {
InitializeComponent ();
myContextMenuStrip.ItemClicked += handler;
}
}
请注意:这对于Visual Studio的表单设计器来说效果不佳,因为表单设计者通常需要无参数构造函数。相反,您需要从代码手动创建控件实例。