我一直在网上四处寻找有关该主题的文章,但是我仍然无法弄清它们之间的区别。我有下面显示的代码,如果我从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
实现INamingContainer
,而WebControls
不实现。
两者之间还有更多区别,但这就是为什么复合控件可以将事件路由到其子控件,而Web控件则不能。您可以通过将类声明更改为以下内容来查看:
public class TemplateControl : WebControl, INamingContainer
瞧,您的按钮事件现在将处理!
INamingContainer
只是一个标记接口(interface),它告诉ASP.NET一个控件包含可能需要独立于其父控件访问的子控件,因此子控件获得了我们ASP.NET开发人员已经认识并喜欢的那些额外的漂亮ID(例如ctl00$ctl00
)。如果
WebControl
没有实现INamingContainer
,则不能保证 child 的ID是唯一的,因此父对象不能可靠地标识它,也不能转发事件。关于c# - WebControl和CompositeControl之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1578413/