<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=ASP.NET_Tutorial%2FCustom_Controls%2FCompositeControl</id>
		<title>ASP.NET Tutorial/Custom Controls/CompositeControl - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=ASP.NET_Tutorial%2FCustom_Controls%2FCompositeControl"/>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=ASP.NET_Tutorial/Custom_Controls/CompositeControl&amp;action=history"/>
		<updated>2026-04-29T23:45:00Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://nfex.ru/index.php?title=ASP.NET_Tutorial/Custom_Controls/CompositeControl&amp;diff=3338&amp;oldid=prev</id>
		<title> в 15:30, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=ASP.NET_Tutorial/Custom_Controls/CompositeControl&amp;diff=3338&amp;oldid=prev"/>
				<updated>2010-05-26T15:30:57Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 15:30, 26 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://nfex.ru/index.php?title=ASP.NET_Tutorial/Custom_Controls/CompositeControl&amp;diff=3339&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=ASP.NET_Tutorial/Custom_Controls/CompositeControl&amp;diff=3339&amp;oldid=prev"/>
				<updated>2010-05-26T12:00:28Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Building Composite Controls==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Web.UI.WebControls;&lt;br /&gt;
namespace myControls&lt;br /&gt;
{&lt;br /&gt;
    public class RequiredTextBox : CompositeControl&lt;br /&gt;
    {&lt;br /&gt;
        private TextBox input;&lt;br /&gt;
        private RequiredFieldValidator validator;&lt;br /&gt;
        public string Text&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                return input.Text;&lt;br /&gt;
            }&lt;br /&gt;
            set&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                input.Text = value;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        protected override void CreateChildControls()&lt;br /&gt;
        {&lt;br /&gt;
            input = new TextBox();&lt;br /&gt;
            input.ID = &amp;quot;input&amp;quot;;&lt;br /&gt;
            this.Controls.Add(input);&lt;br /&gt;
            validator = new RequiredFieldValidator();&lt;br /&gt;
            validator.ID = &amp;quot;valInput&amp;quot;;&lt;br /&gt;
            validator.ControlToValidate = input.ID;&lt;br /&gt;
            validator.ErrorMessage = &amp;quot;(Required)&amp;quot;;&lt;br /&gt;
            validator.Display = ValidatorDisplay.Dynamic;&lt;br /&gt;
            this.Controls.Add(validator);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
File: Default.aspx&lt;br /&gt;
&lt;br /&gt;
&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; Trace=&amp;quot;true&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;%@ Register TagPrefix=&amp;quot;custom&amp;quot; Namespace=&amp;quot;myControls&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    protected void btnSubmit_Click(object sender, EventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
        lblResults.Text = txtUserName.Text;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;head id=&amp;quot;Head1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Show RequiredTextBox&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;asp:Label&lt;br /&gt;
        ID=&amp;quot;lblUserName&amp;quot;&lt;br /&gt;
        Text=&amp;quot;User Name:&amp;quot;&lt;br /&gt;
        AssociatedControlID=&amp;quot;txtUserName&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;custom:RequiredTextBox&lt;br /&gt;
        ID=&amp;quot;txtUserName&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;Server&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;asp:Button&lt;br /&gt;
        ID=&amp;quot;btnSubmit&amp;quot;&lt;br /&gt;
        Text=&amp;quot;Submit&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot; OnClick=&amp;quot;btnSubmit_Click&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;hr /&amp;gt;&lt;br /&gt;
    &amp;lt;asp:Label&lt;br /&gt;
        id=&amp;quot;lblResults&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== Building Hybrid Controls==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
File: Login.cs&lt;br /&gt;
using System;&lt;br /&gt;
using System.Web.UI;&lt;br /&gt;
using System.Web.UI.WebControls;&lt;br /&gt;
namespace myControls&lt;br /&gt;
{&lt;br /&gt;
    public class Login : CompositeControl&lt;br /&gt;
    {&lt;br /&gt;
        private TextBox txtUserName;&lt;br /&gt;
        private TextBox txtPassword;&lt;br /&gt;
        public string UserName&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                return txtUserName.Text;&lt;br /&gt;
            }&lt;br /&gt;
            set&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                txtUserName.Text = value;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public string Password&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                return txtPassword.Text;&lt;br /&gt;
            }&lt;br /&gt;
            set&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                txtPassword.Text = value;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        protected override void CreateChildControls()&lt;br /&gt;
        {&lt;br /&gt;
            txtUserName = new TextBox();&lt;br /&gt;
            txtUserName.ID = &amp;quot;txtUserName&amp;quot;;&lt;br /&gt;
            this.Controls.Add(txtUserName);&lt;br /&gt;
            txtPassword = new TextBox();&lt;br /&gt;
            txtPassword.ID = &amp;quot;txtPassword&amp;quot;;&lt;br /&gt;
            txtPassword.TextMode = TextBoxMode.Password;&lt;br /&gt;
            this.Controls.Add(txtPassword);&lt;br /&gt;
        }&lt;br /&gt;
        protected override void RenderContents(HtmlTextWriter writer)&lt;br /&gt;
        {&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Td);&lt;br /&gt;
            writer.AddAttribute(HtmlTextWriterAttribute.For, txtUserName.ClientID);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Label);&lt;br /&gt;
            writer.Write(&amp;quot;User Name:&amp;quot;);&lt;br /&gt;
            writer.RenderEndTag(); // Label&lt;br /&gt;
            writer.RenderEndTag(); // TD&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Td);&lt;br /&gt;
            txtUserName.RenderControl(writer);&lt;br /&gt;
            writer.RenderEndTag(); // TD&lt;br /&gt;
            writer.RenderEndTag();&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Td);&lt;br /&gt;
            writer.AddAttribute(HtmlTextWriterAttribute.For, txtPassword.ClientID);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Label);&lt;br /&gt;
            writer.Write(&amp;quot;Password:&amp;quot;);&lt;br /&gt;
            writer.RenderEndTag(); // Label&lt;br /&gt;
            writer.RenderEndTag(); // TD&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Td);&lt;br /&gt;
            txtPassword.RenderControl(writer);&lt;br /&gt;
            writer.RenderEndTag(); // TD&lt;br /&gt;
            writer.RenderEndTag(); // TR&lt;br /&gt;
        }&lt;br /&gt;
        protected override HtmlTextWriterTag TagKey&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                return HtmlTextWriterTag.Table;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== Creating a Default Template==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
File: ArticleWithDefault.cs&lt;br /&gt;
using System;&lt;br /&gt;
using System.Web;&lt;br /&gt;
using System.Web.UI;&lt;br /&gt;
using System.Web.UI.WebControls;&lt;br /&gt;
namespace myControls&lt;br /&gt;
{&lt;br /&gt;
    public class ArticleWithDefault : CompositeControl&lt;br /&gt;
    {&lt;br /&gt;
        private string _title;&lt;br /&gt;
        private string _author;&lt;br /&gt;
        private string _contents;&lt;br /&gt;
        private ITemplate _itemTemplate;&lt;br /&gt;
        public string Title&lt;br /&gt;
        {&lt;br /&gt;
            get { return _title; }&lt;br /&gt;
            set { _title = value; }&lt;br /&gt;
        }&lt;br /&gt;
        public string Author&lt;br /&gt;
        {&lt;br /&gt;
            get { return _author; }&lt;br /&gt;
            set { _author = value; }&lt;br /&gt;
        }&lt;br /&gt;
        public string Contents&lt;br /&gt;
        {&lt;br /&gt;
            get { return _contents; }&lt;br /&gt;
            set { _contents = value; }&lt;br /&gt;
        }&lt;br /&gt;
        [TemplateContainer(typeof(ArticleWithDefault))]&lt;br /&gt;
        [PersistenceMode(PersistenceMode.InnerProperty)]&lt;br /&gt;
        public ITemplate ItemTemplate&lt;br /&gt;
        {&lt;br /&gt;
            get { return _itemTemplate; }&lt;br /&gt;
            set { _itemTemplate = value; }&lt;br /&gt;
        }&lt;br /&gt;
        protected override void CreateChildControls()&lt;br /&gt;
        {&lt;br /&gt;
            if (_itemTemplate == null)&lt;br /&gt;
                _itemTemplate = new ArticleDefaultTemplate();&lt;br /&gt;
            _itemTemplate.InstantiateIn(this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public class ArticleDefaultTemplate : ITemplate&lt;br /&gt;
    {&lt;br /&gt;
        public void InstantiateIn(Control container)&lt;br /&gt;
        {&lt;br /&gt;
            Label lblTitle = new Label();&lt;br /&gt;
            lblTitle.DataBinding += new EventHandler(lblTitle_DataBinding);&lt;br /&gt;
            Label lblAuthor = new Label();&lt;br /&gt;
            lblAuthor.DataBinding += new EventHandler(lblAuthor_DataBinding);&lt;br /&gt;
            Label lblContents = new Label();&lt;br /&gt;
            lblContents.DataBinding += new EventHandler(lblContents_DataBinding);&lt;br /&gt;
            container.Controls.Add(lblTitle);&lt;br /&gt;
            container.Controls.Add(new LiteralControl(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;));&lt;br /&gt;
            container.Controls.Add(lblAuthor);&lt;br /&gt;
            container.Controls.Add(new LiteralControl(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;));&lt;br /&gt;
            container.Controls.Add(lblContents);&lt;br /&gt;
        }&lt;br /&gt;
        void lblTitle_DataBinding(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            Label lblTitle = (Label)sender;&lt;br /&gt;
            ArticleWithDefault container = (ArticleWithDefault)lblTitle. NamingContainer;&lt;br /&gt;
            lblTitle.Text = container.Title;&lt;br /&gt;
        }&lt;br /&gt;
        void lblAuthor_DataBinding(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            Label lblAuthor = (Label)sender;&lt;br /&gt;
            ArticleWithDefault container = (ArticleWithDefault)lblAuthor. NamingContainer;&lt;br /&gt;
            lblAuthor.Text = container.Author;&lt;br /&gt;
        }&lt;br /&gt;
        void lblContents_DataBinding(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            Label lblContents = (Label)sender;&lt;br /&gt;
            ArticleWithDefault container = (ArticleWithDefault)lblContents. NamingContainer;&lt;br /&gt;
            lblContents.Text = container.Contents;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
File: Default.aspx&lt;br /&gt;
&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;%@ Register TagPrefix=&amp;quot;custom&amp;quot; Namespace=&amp;quot;myControls&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    void Page_Load()&lt;br /&gt;
    {&lt;br /&gt;
        ArticleWithDefault1.Title = &amp;quot;Creating Templated Databound Controls&amp;quot;;&lt;br /&gt;
        ArticleWithDefault1.Author = &amp;quot;AAA&amp;quot;;&lt;br /&gt;
        ArticleWithDefault1.Contents = &amp;quot;content&amp;quot;;&lt;br /&gt;
        ArticleWithDefault1.DataBind();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;head id=&amp;quot;Head1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Show Article with Default Template&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;custom:ArticleWithDefault&lt;br /&gt;
        id=&amp;quot;ArticleWithDefault1&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== Creating Templated Databound Controls==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
File: DivView.cs&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
using System.Web;&lt;br /&gt;
using System.Web.UI;&lt;br /&gt;
using System.Web.UI.WebControls;&lt;br /&gt;
namespace MyNamespace&lt;br /&gt;
{&lt;br /&gt;
    public class DivView : CompositeDataBoundControl&lt;br /&gt;
    {&lt;br /&gt;
        private ITemplate _itemTemplate;&lt;br /&gt;
        [TemplateContainer(typeof(DivViewItem))]&lt;br /&gt;
        [PersistenceMode(PersistenceMode.InnerProperty)]&lt;br /&gt;
        public ITemplate ItemTemplate&lt;br /&gt;
        {&lt;br /&gt;
            get { return _itemTemplate; }&lt;br /&gt;
            set { _itemTemplate = value; }&lt;br /&gt;
        }&lt;br /&gt;
        protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding)&lt;br /&gt;
        {&lt;br /&gt;
            int counter = 0;&lt;br /&gt;
            foreach (object dataItem in dataSource)&lt;br /&gt;
            {&lt;br /&gt;
                DivViewItem contentItem = new DivViewItem(dataItem, counter);&lt;br /&gt;
                _itemTemplate.InstantiateIn(contentItem);&lt;br /&gt;
                Controls.Add(contentItem);&lt;br /&gt;
                counter++;&lt;br /&gt;
            }&lt;br /&gt;
            DataBind(false);&lt;br /&gt;
            return counter;&lt;br /&gt;
        }&lt;br /&gt;
        protected override HtmlTextWriterTag TagKey&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                return HtmlTextWriterTag.Div;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public class DivViewItem : WebControl, IDataItemContainer&lt;br /&gt;
    {&lt;br /&gt;
        private object _dataItem;&lt;br /&gt;
        private int _index;&lt;br /&gt;
        public object DataItem&lt;br /&gt;
        {&lt;br /&gt;
            get { return _dataItem; }&lt;br /&gt;
        }&lt;br /&gt;
        public int DataItemIndex&lt;br /&gt;
        {&lt;br /&gt;
            get { return _index; }&lt;br /&gt;
        }&lt;br /&gt;
        public int DisplayIndex&lt;br /&gt;
        {&lt;br /&gt;
            get { return _index; }&lt;br /&gt;
        }&lt;br /&gt;
        protected override HtmlTextWriterTag TagKey&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                return HtmlTextWriterTag.Div;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public DivViewItem(object dataItem, int index)&lt;br /&gt;
        {&lt;br /&gt;
            _dataItem = dataItem;&lt;br /&gt;
            _index = index;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
File: Default.aspx&lt;br /&gt;
&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;%@ Register TagPrefix=&amp;quot;custom&amp;quot; Namespace=&amp;quot;MyNamespace&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
   &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;head id=&amp;quot;Head1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
        .products&lt;br /&gt;
        {&lt;br /&gt;
            width:500px;&lt;br /&gt;
        }&lt;br /&gt;
        .products div&lt;br /&gt;
        {&lt;br /&gt;
            border:solid 1px black;&lt;br /&gt;
            padding:10px;&lt;br /&gt;
            margin:10px;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Show DivView&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;custom:DivView&lt;br /&gt;
        id=&amp;quot;lstProducts&amp;quot;&lt;br /&gt;
        DataSourceID=&amp;quot;srcProducts&amp;quot;&lt;br /&gt;
        CssClass=&amp;quot;products&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;Server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;&amp;lt;%# Eval(&amp;quot;Title&amp;quot;) %&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
        Director: &amp;lt;%# Eval(&amp;quot;Director&amp;quot;) %&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/custom:DivView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;asp:SqlDataSource&lt;br /&gt;
        id=&amp;quot;srcProducts&amp;quot;&lt;br /&gt;
        ConnectionString=&amp;quot;&amp;lt;%$ ConnectionStrings:Products %&amp;gt;&amp;quot;&lt;br /&gt;
        SelectCommand=&amp;quot;SELECT Title, Director FROM Products&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;asp:LinkButton&lt;br /&gt;
        id=&amp;quot;lnkReload&amp;quot;&lt;br /&gt;
        Text=&amp;quot;Reload&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== File: Product.cs==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Web;&lt;br /&gt;
using System.Web.UI;&lt;br /&gt;
using System.Web.UI.WebControls;&lt;br /&gt;
namespace myControls&lt;br /&gt;
{&lt;br /&gt;
    public class Product : CompositeControl&lt;br /&gt;
    {&lt;br /&gt;
        private ITemplate _itemTemplate;&lt;br /&gt;
        private ProductItem _item;&lt;br /&gt;
        public string Name&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                return _item.Name;&lt;br /&gt;
            }&lt;br /&gt;
            set&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                _item.Name = value;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public Decimal Price&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                return _item.Price;&lt;br /&gt;
            }&lt;br /&gt;
            set&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                _item.Price = value;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        [TemplateContainer(typeof(ProductItem))]&lt;br /&gt;
        [PersistenceMode(PersistenceMode.InnerProperty)]&lt;br /&gt;
        public ITemplate ItemTemplate&lt;br /&gt;
        {&lt;br /&gt;
            get { return _itemTemplate; }&lt;br /&gt;
            set { _itemTemplate = value; }&lt;br /&gt;
        }&lt;br /&gt;
        protected override void CreateChildControls()&lt;br /&gt;
        {&lt;br /&gt;
            _item = new ProductItem();&lt;br /&gt;
            _itemTemplate.InstantiateIn(_item);&lt;br /&gt;
            Controls.Add(_item);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public class ProductItem : WebControl, IDataItemContainer&lt;br /&gt;
    {&lt;br /&gt;
        private string _name;&lt;br /&gt;
        private decimal _price;&lt;br /&gt;
        public string Name&lt;br /&gt;
        {&lt;br /&gt;
            get { return _name; }&lt;br /&gt;
            set { _name = value; }&lt;br /&gt;
        }&lt;br /&gt;
        public decimal Price&lt;br /&gt;
        {&lt;br /&gt;
            get { return _price; }&lt;br /&gt;
            set { _price = value; }&lt;br /&gt;
        }&lt;br /&gt;
        public object DataItem&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                return this;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public int DataItemIndex&lt;br /&gt;
        {&lt;br /&gt;
            get { return 0; }&lt;br /&gt;
        }&lt;br /&gt;
        public int DisplayIndex&lt;br /&gt;
        {&lt;br /&gt;
            get { return 0; }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
File: Default.aspx&lt;br /&gt;
&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;%@ Register TagPrefix=&amp;quot;custom&amp;quot; Namespace=&amp;quot;myControls&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    void Page_Load()&lt;br /&gt;
    {&lt;br /&gt;
        Product1.Name = &amp;quot;Laptop Computer&amp;quot;;&lt;br /&gt;
        Product1.Price = 1254.12m;&lt;br /&gt;
        Product1.DataBind();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;head id=&amp;quot;Head1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Show Product&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;custom:Product&lt;br /&gt;
        id=&amp;quot;Product1&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;Server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;
        Name: &amp;lt;%# Eval(&amp;quot;Name&amp;quot;) %&amp;gt;&lt;br /&gt;
        &amp;lt;br /&amp;gt;&lt;br /&gt;
        Price: &amp;lt;%# Eval(&amp;quot;Price&amp;quot;, &amp;quot;{0:c}&amp;quot;) %&amp;gt;&lt;br /&gt;
        &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/custom:Product&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== Image Rotator==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
File: ImageRotator.cs&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
using System.Web.UI;&lt;br /&gt;
using System.Web.UI.WebControls;&lt;br /&gt;
using System.ruponentModel;&lt;br /&gt;
namespace myControls&lt;br /&gt;
{&lt;br /&gt;
    [ParseChildren(true, &amp;quot;ImageItems&amp;quot;)]&lt;br /&gt;
    public class ImageRotator : WebControl&lt;br /&gt;
    {&lt;br /&gt;
        private ArrayList _imageItems = new ArrayList();&lt;br /&gt;
        public ArrayList ImageItems&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                return _imageItems;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        protected override void RenderContents(HtmlTextWriter writer)&lt;br /&gt;
        {&lt;br /&gt;
            if (_imageItems.Count &amp;gt; 0)&lt;br /&gt;
            {&lt;br /&gt;
                Random rnd = new Random();&lt;br /&gt;
                ImageItem img = (ImageItem)_imageItems[rnd.Next (_imageItems.Count)];&lt;br /&gt;
                writer.AddAttribute(HtmlTextWriterAttribute.Src, img.ImageUrl);&lt;br /&gt;
                writer.AddAttribute(HtmlTextWriterAttribute.Alt, img.AlternateText);&lt;br /&gt;
                writer.RenderBeginTag(HtmlTextWriterTag.Img);&lt;br /&gt;
                writer.RenderEndTag();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public class ImageItem&lt;br /&gt;
    {&lt;br /&gt;
        private string _imageUrl;&lt;br /&gt;
        private string _alternateText;&lt;br /&gt;
        public string ImageUrl&lt;br /&gt;
        {&lt;br /&gt;
            get { return _imageUrl; }&lt;br /&gt;
            set { _imageUrl = value; }&lt;br /&gt;
        }&lt;br /&gt;
        public string AlternateText&lt;br /&gt;
        {&lt;br /&gt;
            get { return _alternateText; }&lt;br /&gt;
            set { _alternateText = value; }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
File: ShowImageRotator.aspx&lt;br /&gt;
&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; Trace=&amp;quot;true&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;%@ Register TagPrefix=&amp;quot;custom&amp;quot; Namespace=&amp;quot;myControls&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;head id=&amp;quot;Head1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Show ImageRotator&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;custom:ImageRotator&lt;br /&gt;
        id=&amp;quot;ImageRotator1&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;custom:ImageItem ImageUrl=&amp;quot;Image1.gif&amp;quot; AlternateText=&amp;quot;Image 1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;custom:ImageItem ImageUrl=&amp;quot;Image2.gif&amp;quot; AlternateText=&amp;quot;Image 2&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;custom:ImageItem ImageUrl=&amp;quot;Image3.gif&amp;quot; AlternateText=&amp;quot;Image 3&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/custom:ImageRotator&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== Item Rotator==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
File: ItemRotator.cs&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
using System.Web.UI;&lt;br /&gt;
using System.Web.UI.WebControls;&lt;br /&gt;
using System.ruponentModel;&lt;br /&gt;
namespace myControls&lt;br /&gt;
{&lt;br /&gt;
    [ParseChildren(true, &amp;quot;Items&amp;quot;)]&lt;br /&gt;
    public class ItemRotator : CompositeControl&lt;br /&gt;
    {&lt;br /&gt;
        private ArrayList _items = new ArrayList();&lt;br /&gt;
        [Browsable(false)]&lt;br /&gt;
        public ArrayList Items&lt;br /&gt;
        {&lt;br /&gt;
            get { return _items; }&lt;br /&gt;
        }&lt;br /&gt;
        protected override void CreateChildControls()&lt;br /&gt;
        {&lt;br /&gt;
            Random rnd = new Random();&lt;br /&gt;
            int index = rnd.Next(_items.Count);&lt;br /&gt;
            Control item = (Control)_items[index];&lt;br /&gt;
            this.Controls.Add(item);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public class Item : Control&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
File: Default.aspx&lt;br /&gt;
&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; Trace=&amp;quot;true&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;%@ Register TagPrefix=&amp;quot;custom&amp;quot; Namespace=&amp;quot;myControls&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;head id=&amp;quot;Head1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Show ItemRotator&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;custom:ItemRotator&lt;br /&gt;
        id=&amp;quot;ItemRotator1&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;custom:item ID=&amp;quot;Item1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
            First Item&lt;br /&gt;
        &amp;lt;/custom:item&amp;gt;&lt;br /&gt;
        &amp;lt;custom:item ID=&amp;quot;Item2&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
            Second Item&lt;br /&gt;
            &amp;lt;asp:Calendar&lt;br /&gt;
                id=&amp;quot;Calendar1&amp;quot;&lt;br /&gt;
                Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/custom:item&amp;gt;&lt;br /&gt;
        &amp;lt;custom:item ID=&amp;quot;Item3&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
            Third Item&lt;br /&gt;
        &amp;lt;/custom:item&amp;gt;&lt;br /&gt;
    &amp;lt;/custom:ItemRotator&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== Performing layout with an HTML table.==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
File: LoginStandards.cs&lt;br /&gt;
using System;&lt;br /&gt;
using System.Web.UI;&lt;br /&gt;
using System.Web.UI.WebControls;&lt;br /&gt;
namespace myControls&lt;br /&gt;
{&lt;br /&gt;
    public class LoginStandards : CompositeControl&lt;br /&gt;
    {&lt;br /&gt;
        private TextBox txtUserName;&lt;br /&gt;
        private TextBox txtPassword;&lt;br /&gt;
        public string UserName&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                return txtUserName.Text;&lt;br /&gt;
            }&lt;br /&gt;
            set&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                txtUserName.Text = value;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public string Password&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                return txtPassword.Text;&lt;br /&gt;
            }&lt;br /&gt;
            set&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                txtPassword.Text = value;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        protected override void CreateChildControls()&lt;br /&gt;
        {&lt;br /&gt;
            txtUserName = new TextBox();&lt;br /&gt;
            txtUserName.ID = &amp;quot;txtUserName&amp;quot;;&lt;br /&gt;
            this.Controls.Add(txtUserName);&lt;br /&gt;
            txtPassword = new TextBox();&lt;br /&gt;
            txtPassword.ID = &amp;quot;txtPassword&amp;quot;;&lt;br /&gt;
            txtPassword.TextMode = TextBoxMode.Password;&lt;br /&gt;
            this.Controls.Add(txtPassword);&lt;br /&gt;
        }&lt;br /&gt;
        protected override void RenderContents(HtmlTextWriter writer)&lt;br /&gt;
        {&lt;br /&gt;
            writer.AddStyleAttribute(&amp;quot;float&amp;quot;, &amp;quot;left&amp;quot;);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Div);&lt;br /&gt;
            writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, &amp;quot;3px&amp;quot;);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Div);&lt;br /&gt;
            writer.AddAttribute(HtmlTextWriterAttribute.For, txtUserName.ClientID);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Label);&lt;br /&gt;
            writer.Write(&amp;quot;User Name:&amp;quot;);&lt;br /&gt;
            writer.RenderEndTag();&lt;br /&gt;
            writer.RenderEndTag();&lt;br /&gt;
            writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, &amp;quot;3px&amp;quot;);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Div);&lt;br /&gt;
            writer.AddAttribute(HtmlTextWriterAttribute.For, txtPassword.ClientID);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Label);&lt;br /&gt;
            writer.Write(&amp;quot;Password:&amp;quot;);&lt;br /&gt;
            writer.RenderEndTag();&lt;br /&gt;
            writer.RenderEndTag();&lt;br /&gt;
            writer.RenderEndTag();&lt;br /&gt;
            writer.AddStyleAttribute(&amp;quot;float&amp;quot;, &amp;quot;left&amp;quot;);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Div);&lt;br /&gt;
            writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, &amp;quot;3px&amp;quot;);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Div);&lt;br /&gt;
            txtUserName.RenderControl(writer);&lt;br /&gt;
            writer.RenderEndTag();&lt;br /&gt;
            writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, &amp;quot;3px&amp;quot;);&lt;br /&gt;
            writer.RenderBeginTag(HtmlTextWriterTag.Div);&lt;br /&gt;
            txtPassword.RenderControl(writer);&lt;br /&gt;
            writer.RenderEndTag();&lt;br /&gt;
            writer.RenderEndTag();&lt;br /&gt;
            writer.Write(&amp;quot;&amp;lt;br style=&amp;quot;clear:left&amp;quot; /&amp;gt;&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        protected override HtmlTextWriterTag TagKey&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                return HtmlTextWriterTag.Div;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== Supporting Two-Way Databinding==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
Two-way databinding enables you to extract values from a template. &lt;br /&gt;
You can use a two-way databinding expression not only to display the value of a data item, but also to update the value of a data item.&lt;br /&gt;
File: ProductForm.cs&lt;br /&gt;
using System;&lt;br /&gt;
using System.Web;&lt;br /&gt;
using System.Web.UI;&lt;br /&gt;
using System.Web.UI.WebControls;&lt;br /&gt;
using System.ruponentModel;&lt;br /&gt;
using System.Collections.Specialized;&lt;br /&gt;
namespace myControls&lt;br /&gt;
{&lt;br /&gt;
    public class ProductForm : CompositeControl&lt;br /&gt;
    {&lt;br /&gt;
        public event EventHandler ProductUpdated;&lt;br /&gt;
        private IBindableTemplate _editItemTemplate;&lt;br /&gt;
        private ProductFormItem _item;&lt;br /&gt;
        private IOrderedDictionary _results;&lt;br /&gt;
        public IOrderedDictionary Results&lt;br /&gt;
        {&lt;br /&gt;
            get { return _results; }&lt;br /&gt;
        }&lt;br /&gt;
        public string Name&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                return _item.Name;&lt;br /&gt;
            }&lt;br /&gt;
            set&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                _item.Name = value;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public decimal Price&lt;br /&gt;
        {&lt;br /&gt;
            get&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                return _item.Price;&lt;br /&gt;
            }&lt;br /&gt;
            set&lt;br /&gt;
            {&lt;br /&gt;
                EnsureChildControls();&lt;br /&gt;
                _item.Price = value;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        [TemplateContainer(typeof(ProductFormItem), BindingDirection.TwoWay)]&lt;br /&gt;
        [PersistenceMode(PersistenceMode.InnerProperty)]&lt;br /&gt;
        public IBindableTemplate EditItemTemplate&lt;br /&gt;
        {&lt;br /&gt;
            get { return _editItemTemplate; }&lt;br /&gt;
            set { _editItemTemplate = value; }&lt;br /&gt;
        }&lt;br /&gt;
        protected override void CreateChildControls()&lt;br /&gt;
        {&lt;br /&gt;
            _item = new ProductFormItem();&lt;br /&gt;
            _editItemTemplate.InstantiateIn(_item);&lt;br /&gt;
            Controls.Add(_item);&lt;br /&gt;
        }&lt;br /&gt;
        protected override bool OnBubbleEvent(object source, EventArgs args)&lt;br /&gt;
        {&lt;br /&gt;
            _results = _editItemTemplate.ExtractValues(_item);&lt;br /&gt;
            if (ProductUpdated != null)&lt;br /&gt;
                ProductUpdated(this, EventArgs.Empty);&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public class ProductFormItem : WebControl, IDataItemContainer&lt;br /&gt;
    {&lt;br /&gt;
        private string _name;&lt;br /&gt;
        private decimal _price;&lt;br /&gt;
        public string Name&lt;br /&gt;
        {&lt;br /&gt;
            get { return _name; }&lt;br /&gt;
            set { _name = value; }&lt;br /&gt;
        }&lt;br /&gt;
        public decimal Price&lt;br /&gt;
        {&lt;br /&gt;
            get { return _price; }&lt;br /&gt;
            set { _price = value; }&lt;br /&gt;
        }&lt;br /&gt;
        public object DataItem&lt;br /&gt;
        {&lt;br /&gt;
            get { return this; }&lt;br /&gt;
        }&lt;br /&gt;
        public int DataItemIndex&lt;br /&gt;
        {&lt;br /&gt;
            get { return 0; }&lt;br /&gt;
        }&lt;br /&gt;
        public int DisplayIndex&lt;br /&gt;
        {&lt;br /&gt;
            get { return 0; }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
File: Default.aspx&lt;br /&gt;
&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;%@ Register TagPrefix=&amp;quot;custom&amp;quot; Namespace=&amp;quot;myControls&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    void Page_Load()&lt;br /&gt;
    {&lt;br /&gt;
        if (!Page.IsPostBack)&lt;br /&gt;
        {&lt;br /&gt;
            ProductForm1.Name = &amp;quot;Laptop&amp;quot;;&lt;br /&gt;
            ProductForm1.Price = 433.12m;&lt;br /&gt;
            ProductForm1.DataBind();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    protected void ProductForm1_ProductUpdated(object sender, EventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
        lblName.Text = ProductForm1.Results[&amp;quot;Name&amp;quot;].ToString();&lt;br /&gt;
        lblPrice.Text = ProductForm1.Results[&amp;quot;Price&amp;quot;].ToString();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;head id=&amp;quot;Head1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Show ProductForm&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;custom:ProductForm&lt;br /&gt;
        id=&amp;quot;ProductForm1&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot; OnProductUpdated=&amp;quot;ProductForm1_ProductUpdated&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;EditItemTemplate&amp;gt;&lt;br /&gt;
        &amp;lt;asp:Label&lt;br /&gt;
            id=&amp;quot;lblName&amp;quot;&lt;br /&gt;
            Text=&amp;quot;Product Name:&amp;quot;&lt;br /&gt;
            AssociatedControlID=&amp;quot;txtName&amp;quot;&lt;br /&gt;
            Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;asp:TextBox&lt;br /&gt;
            id=&amp;quot;txtName&amp;quot;&lt;br /&gt;
            Text=&amp;quot;&amp;lt;%# Bind(&amp;quot;Name&amp;quot;) %&amp;gt;&amp;quot;&lt;br /&gt;
            Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
        &amp;lt;asp:Label&lt;br /&gt;
            id=&amp;quot;lblPrice&amp;quot;&lt;br /&gt;
            Text=&amp;quot;Product Price:&amp;quot;&lt;br /&gt;
            AssociatedControlID=&amp;quot;txtPrice&amp;quot;&lt;br /&gt;
            Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;asp:TextBox&lt;br /&gt;
            id=&amp;quot;txtPrice&amp;quot;&lt;br /&gt;
            Text=&amp;quot;&amp;lt;%# Bind(&amp;quot;Price&amp;quot;) %&amp;gt;&amp;quot;&lt;br /&gt;
            Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
        &amp;lt;asp:Button&lt;br /&gt;
            id=&amp;quot;btnUpdate&amp;quot;&lt;br /&gt;
            Text=&amp;quot;Update&amp;quot;&lt;br /&gt;
            Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/EditItemTemplate&amp;gt;&lt;br /&gt;
    &amp;lt;/custom:ProductForm&amp;gt;&lt;br /&gt;
    &amp;lt;hr /&amp;gt;&lt;br /&gt;
    New Product Name:&lt;br /&gt;
    &amp;lt;asp:Label&lt;br /&gt;
        id=&amp;quot;lblName&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    New Product Price:&lt;br /&gt;
    &amp;lt;asp:Label&lt;br /&gt;
        id=&amp;quot;lblPrice&amp;quot;&lt;br /&gt;
        Runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>