Skip to main content
 首页 » 编程设计

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

2024年02月03日28飞鱼

实际上如何将来自 asp.net usercontrol[ascx 文件] 的抽象事件公开到容器 webforms 页面。这是我的场景,

  1. 我创建了一个 webforms usercontrol 一个 ascx 文件,并放置了一个带有验证器的数据绑定(bind)复选框列表来验证它(我知道这可以通过 webforms 本身完成,为什么你问一个 usercontrol,但这是一个场景)

  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); 
        } 

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

  1. 当所有其他公共(public)属性显示时,我无法在属性窗口中显示该事件

  2. 为什么是我的event invoker[InvokeOnValidating] , event delegate[Validating]当我输入 usercontrolid. 时显示在智能感知列表中连同 event[OnValidating] .我只想公开事件。

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

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

请您参考如下方法:

你在混合概念,你不需要委托(delegate)来注册事件,试试这段代码,我会在下面解释这些变化并尝试回答你的问题

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

在使用控件的页面上,注意On,框架为所有事件添加了这个:

<uc:MyUserControl OnValidating="myhandlermethodinpage" /> 
  1. VS 对此不是 100% 准确,有时控件的属性不会显示!智能更可靠
  2. 因为他们没有设置为私有(private),所以只有事件应该是公开的。
  3. 不确定是否可行,您需要捕获控件中文本框的事件并使其引发自己的新事件。

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

    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; } 
}