完成基本复合控件基本呈现
(1)首先你要熟悉以下的属性和方法
Control.CreateChildControls 方法用于创建子控件
Control.EnsureChildControls 方法用于确认是否已创建子控件,如果未创建完成的话则调用CreateChildControls 方法创建子控件
Control.ChildControlsCreated 属性 获取一个值,是否已创建子控件
(2)了解并实现INamingContainer接口
用户控件UserControl类则继承了INamingContainer接口,确包保子控件具有唯一的ID名称,那复合控件也需要实现这个接口达到一样的目的,这个是值得注意的地方.复合控件以类撰写的方法来添加控件即CreateChildControls 方法
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.ComponentModel;

namespace ComponentControl


{
public class Ctrl9:WebControl,INamingContainer

{
private Label m_NameLabel = new Label();
private Label m_PwdLabel = new Label();
private TextBox m_NameTextBox = new TextBox();
private TextBox m_PwdTextBox = new TextBox();
private Button m_Button = new Button();
private RequiredFieldValidator m_NameValidator = new RequiredFieldValidator();
private RequiredFieldValidator m_PwdValidator = new RequiredFieldValidator();



/**//// <summary>
/// 重写Controls的get属性,保证在访问复合控件的子控件时子控件已经被创建
/// EnsureChildControls()方法检查子控件是否被创建,如果没有被创建,
/// 将自动调用CreateChildControls()方法来创建子控件
/// </summary>
public override ControlCollection Controls

{
get

{
EnsureChildControls();
return base.Controls;
}
}


CreateChildControls#region CreateChildControls

protected override void CreateChildControls()

{
Controls.Clear();

m_NameLabel.ID = "NameLabelID";
m_NameLabel.Text = "Label1";

m_PwdLabel.ID = "PwdLabelID";
m_PwdLabel.Text = "Label2";

m_NameTextBox.ID = "NameTextBoxID";

m_PwdTextBox.TextMode = TextBoxMode.Password;
m_PwdTextBox.ID = "PwdTextBoxID";

m_Button.ID = "ButtonID";
m_Button.Text = "Button1";

m_NameValidator.ID = "Validator1";
m_NameValidator.ErrorMessage = "请输入用户名";
m_NameValidator.ControlToValidate = m_NameTextBox.ID;
m_NameValidator.Text = "*";

m_PwdValidator.ID = "Validator2";
m_PwdValidator.ErrorMessage = "请输入密码";
m_PwdValidator.ControlToValidate = m_PwdTextBox.ID;
m_PwdValidator.Text = "*";

Controls.Add(m_NameLabel);
Controls.Add(m_PwdLabel);
Controls.Add(m_NameTextBox);
Controls.Add(m_PwdTextBox);
Controls.Add(m_Button);
Controls.Add(m_NameValidator);
Controls.Add(m_PwdValidator);
}

#endregion


Properties#region Properties

[Description("Button显示的文本")]
public string ButtonText

{
get

{
return m_Button.Text;
}
set

{
m_Button.Text = value;
}
}

[Description("NameLabel显示的文本")]
public string NameLabelText

{
get

{
return m_NameLabel.Text;
}
set

{
m_NameLabel.Text = value;
}
}

[Description("PwdLabel显示的文本")]
public string PwdLabelText

{
get

{
return m_PwdLabel.Text;
}
set

{
m_PwdLabel.Text = value;
}
}

[Description("用户名")]
public string Name

{

get
{ return m_NameTextBox.Text; }

set
{ m_NameTextBox.Text = value; }
}

[Description("密码")]
public string Pwd

{

get
{ return m_PwdTextBox.Text; }
}

#endregion


Render#region Render

protected override void Render(HtmlTextWriter writer)

{
writer.RenderBeginTag(HtmlTextWriterTag.Table);

writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
m_NameLabel.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
m_NameTextBox.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
m_NameValidator.RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();

writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
m_PwdLabel.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
m_PwdTextBox.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
m_PwdValidator.RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();

writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.AddAttribute(HtmlTextWriterAttribute.Cols, "3");
writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
m_Button.RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();

writer.RenderEndTag();
}

#endregion
}
}
