WebControl和CompositeControl之间的区别?

时间:2009-10-16 14:31:49

标签: c# events composite web-controls composite-controls

我一直在网上浏览并找到一些关于这个主题的文章,但我仍然无法弄清楚它们之间的区别。我有下面的代码显示,如果我从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之间的区别?

2 个答案:

答案 0 :(得分:16)

CompositeControls实施INamingContainerWebControls则不实现。

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

来查看
public class TemplateControl : WebControl, INamingContainer

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

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

如果WebControl没有实现INamingContainer,则不保证孩子的ID是唯一的,因此父母无法可靠地识别它并且无法转发事件。

答案 1 :(得分:0)

What is the difference between UserControl, WebControl, RenderedControl and CompositeControl?

为什么一个人的行为与另一个人不同?因为他们是不同的类型。如果它们是相同的类型,则不会有两个。