gpt4 book ai didi

c# - 从动态添加的子控件分配委托(delegate)事件处理程序

转载 作者:太空宇宙 更新时间:2023-11-03 16:54:37 25 4
gpt4 key购买 nike

我有一个处理评论的控件。在此控件中,我设置了一个用于发送电子邮件的委托(delegate)事件处理程序。

然后我有各种类型的控件,例如博客、文章等,其中每一个都可能添加也可能不添加评论控件(这是在我不知道 id 的情况下动态完成的),即评论控件添加在此控件之外。这些控件中的每一个都以不同的方式处理它的电子邮件(因此事件)。

我要确定的是如何在父控件中分配事件。目前,我不得不递归地搜索页面上的所有控件,直到找到评论控件,然后将其设置为那样。下面的示例说明:

评论控制

public delegate void Commenting_OnSendEmail();

public partial class Commenting : UserControl
{
public Commenting_OnSendEmail OnComment_SendEmail();

private void Page_Load(object sender, EventArgs e)
{
if(OnComment_SendEmail != null)
{
OnComment_SendEmail();
}
}
}

家长控制

public partial class Blog : UserControl
{
private void Page_Load(object sender, EventArgs e)
{
Commenting comControl = (Commenting)this.FindControl<Commenting>(this);
if(comControl != null)
{
comCtrol.OnComment_SendEmail += new Commenting_OnSendMail(Blog_Comment_OnSendEmail);
}
}
}

有没有更简单的方法?

编辑:

我问的原因是,如果我从 this.Page 作为初始控件进行搜索,我担心向下搜索控件树以找到它所花费的时间。每种不同类型的页面在其拥有的控件数量方面都会有所不同。在某些测试中,它会很快返回结果。

最佳答案

您可以重写 Blog 类的 AddedControl 事件并检查添加的控件是否是 Commenting 类型的实例。像这样的东西:

public partial class Blog : UserControl { 

protected override void AddedControl(Control control, int index) {
base.AddedControl(control, index);

Commenting commentingControl = control as Commenting;
if (commentingControl == null) return;

commentingControl.OnComment_SendEmail += new Commenting_OnSendMail(Blog_Comment_OnSendEmail);
}
}

当然,您可以将此代码放在所有“可评论”用户控件的基类上,并使用一个抽象方法来实际处理事件。

只有一件事:AddControl 事件发生在 Page_Load 之后,所以要小心。

干杯,

安德烈

关于c# - 从动态添加的子控件分配委托(delegate)事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2634678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com