将事件从asp.net用户控件公开到容器Web表单页面

如何实际将asp.net usercontrol [ascx文件]中的抽象事件暴露给容器webforms页面。 这是我的情景,

  1. 我创建了一个webforms usercontrol一个ascx文件,并将一个带有validation器的数据绑定复选框列表进行validation(我知道这可以完成webforms本身为什么用户控制你问,但这是一个场景)

  2. 现在我想将一个事件暴露给名为OnValidating的容器页面,该页面将产生validation结果

该活动的签名如下:

 public delegate void Validating(object source,EventArgs e); public event Validating OnValidating; public void InvokeOnValidating(EventArgs e) { Validating handler = OnValidating; if (handler != null) handler(this, e); } 

根据msdn文档,页面框架处理事件订阅和取消订阅。 所以我需要做的就是在validation失败时调用事件。 我很高兴,但是,

  1. 所有其他公共财产都没有在属性窗口中显示该事件

  2. 当我键入usercontrolid.时,为什么地狱是我的event invoker[InvokeOnValidating]event delegate[Validating]在intellisense列表中显示usercontrolid. 以及event[OnValidating] 。 我只希望暴露事件。

  3. 我还可以允许页面订阅在usercontrol中创建的事件TextboxChanged吗? 如果是这样,请给我代码。

注意:我希望看到更多的代码而不是冗长的解释

您正在混合概念,您不需要委托来注册事件,尝试此代码,我将解释更改并尝试在下面回答您的问题

  public event EventHandler Validating; private void OnValidating(EventArgs ea) { var e = Validating; if (e != null) e(this, ea); } 

在具有控件使用的页面上,注意On ,框架为所有事件添加此内容:

  
  1. VS不是100%准确的,有时控件的属性不会出现! Intelissence更可靠
  2. 因为它们没有被设置为私有,所以只有事件应该是公开的。
  3. 不确定是否可行,您需要捕获控件中文本框的事件并使其引发自己的新事件。

无法添加评论,但基本上如果你需要自定义事件args这样做:

  public event EventHandler Validating; private void OnValidating(CustomEventArgs ea) { var e = Validating; if (e != null) e(this, ea); } public class CustomEventArgs:EventArgs{ public int MyProperty { get; set; } }