为什么此复合控件不呈现其子控件

本文关键字:控件 复合控件 为什么 | 更新日期: 2023-09-27 17:56:09

IDE: Visual Studio 2010框架:.net 3.5WebServer:Visual Studio Dev Server

我正在尝试掌握自定义控件和复合控件。 下面的代码或多或少是直接从我在各种教程中找到的示例生成的。 我已经在我的页面和工具箱中注册了该控件。 我可以在页面上拖动控件,它正确显示 text 属性,但它不会呈现我的按钮、文本框或下拉列表。 有人可以查看此代码并告诉我为什么这些项目不呈现在我的页面上吗?

感谢您的阅读

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace HancockControls
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:PeoplePicker runat=server></{0}:PeoplePicker>")]
    public class PeoplePicker : CompositeControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        protected TextBox txtName = new TextBox();
        protected DropDownList ddlResults = new DropDownList();
        protected Button btnSearch = new Button();
        public string Text
        {
            get
            {
                EnsureChildControls();
                String s = (String)ViewState["Text"];
                return ((s == null) ? "[Text]" : s);
            }
            set
            {
                EnsureChildControls();
                ViewState["Text"] = value;
            }
        }
        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
            btnSearch.Text = "Search";
            this.Controls.Add(txtName);
            this.Controls.Add(ddlResults);
            this.Controls.Add(btnSearch);
        }
        public override void RenderControl(HtmlTextWriter writer)
        {
            base.RenderControl(writer);
        }
    }
}

为什么此复合控件不呈现其子控件

在这里回答我自己的问题,以防将来有人从中受益......

我上面的代码的问题显然是,当从 CompositeControl 类继承 Web 控制类时,我需要注释掉或删除 RenderControl 方法。 CompositeControl 似乎使用 CreateChildControls 方法来呈现自身,而 RenderControl 方法会导致它...我不知道。。。以某种方式渲染。

使用 CreateChildControls,可以通过定义和使用 LiteralControl 来添加需要添加到控件的任何文本或 html 元素。