为什么这个复合控件不呈现其子控件?

时间:2015-06-12 18:49:12

标签: c# asp.net .net visual-studio-2010

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

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

感谢您阅读

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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

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

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

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