我一直在网上四处寻找有关该主题的文章,但是我仍然无法弄清它们之间的区别。我有下面显示的代码,如果我从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/

10-13 07:03