gpt4 book ai didi

c# - WebControl 和 CompositeControl 之间的区别?

转载 作者:太空狗 更新时间:2023-10-29 18:15:42 29 4
gpt4 key购买 nike

我一直在网上四处寻找,发现了一些关于该主题的文章,但我仍然无法弄清楚它们之间的区别。我有下面显示的代码,如果我从 CompositeControl 继承它完美地工作但如果我从 WebControl 继承则不是。 (它们都呈现代码,但只有 CompositeControl 处理事件)

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TestLibrary
{
public class TemplateControl : CompositeControl
{
TextBox txtName = new TextBox();
TextBox txtEmail = new TextBox();
Button btnSend = new Button();

private void SetValues()
{
btnSend.Text = "Skicka";
}

protected override void CreateChildControls()
{
SetValues();

this.Controls.Add(new LiteralControl("Namn: "));
this.Controls.Add(txtName);
this.Controls.Add(new LiteralControl("<br />"));
this.Controls.Add(new LiteralControl("Email: "));
this.Controls.Add(txtEmail);
this.Controls.Add(new LiteralControl("<br />"));
btnSend.Command += new CommandEventHandler(btnSend_Command);
this.Controls.Add(btnSend);
}

void btnSend_Command(object sender, CommandEventArgs e)
{
this.Page.Response.Write("Du har nu klickat på skicka-knappen! <br /><br />");
}
}
}

所以当我单击按钮并且控件呈现为 WebControl 时,没有任何反应。但是,如果我将 WebControl 更改为 CompositeControl,则会打印出文本。为什么?WebControl 和 CompositeControl 有什么区别?

最佳答案

CompositeControls 实现了 INamingContainerWebControls 没有。

两者之间有更多差异,但这就是复合控件可以将事件路由到其子控件而 Web 控件不能的原因。您可以通过将类声明更改为此来看到这一点:

public class TemplateControl : WebControl, INamingContainer

瞧,您的按钮事件现在将被处理!

INamingContainer只是一个标记接口(interface),它告诉 ASP.NET 一个控件包含可能需要独立于其父控件访问的子控件,因此子控件获得那些我们 ASP.NET 开发人员已经了解和喜爱的额外漂亮 ID(例如,ctl00$ctl00).

如果 WebControl 没有实现 INamingContainer, child 的 id 不能保证是唯一的,所以 parent 不能可靠地识别它,也不能转发事件。

关于c# - WebControl 和 CompositeControl 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1578413/

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