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

Dee*_*ons 1 c# asp.net events user-controls delegates

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

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

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

该活动的签名如下:

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);
        }
Run Code Online (Sandbox Code Playgroud)

根据msdn文档,页面框架处理事件订阅和取消订阅.所以我需要做的就是在验证失败时调用事件.太棒了我很开心,但是,

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

  2. 凭啥我event invoker[InvokeOnValidating],event delegate[Validating]在智能感知列表中显示当我键入usercontrolid.与一起event[OnValidating].我只希望暴露事件.

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

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

Ped*_*sta 5

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

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

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

<uc:MyUserControl OnValidating="myhandlermethodinpage" />
Run Code Online (Sandbox Code Playgroud)
  1. VS不是100%准确的,有时控件的属性不会出现!Intelissence更可靠
  2. 因为它们没有被设置为私有,所以只有事件应该是公开的.
  3. 不确定是否可行,您需要捕获控件中文本框的事件并使其引发自己的新事件.

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

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