//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ namespace System.Web.UI.WebControls { using System.ComponentModel; using System.Web.Util; /// /// Base class for composite controls -- controls that contain other controls and reuse their functionality /// via class composition. See Chapter 12 in "Developing Microsoft ASP.NET Server Controls and Components." /// The following classes have copied code from this class (look for "Copied from CompositeControl" comment): /// - ChangePassword /// - Login /// - LoginView /// - SiteMapPath /// [ Designer("System.Web.UI.Design.WebControls.CompositeControlDesigner, " + AssemblyRef.SystemDesign) ] public abstract class CompositeControl : WebControl, INamingContainer, ICompositeControlDesignerAccessor { /// /// Ensure that the child controls have been created before returning the controls collection /// public override ControlCollection Controls { get { EnsureChildControls(); return base.Controls; } } public override bool SupportsDisabledAttribute { get { return RenderingCompatibility < VersionUtil.Framework40; } } /// /// Perform our own databinding, then perform our child controls' databinding. /// Does not call Base.DataBind(), since we need to call EnsureChildControls() between /// OnDataBinding() and DataBindChildren(). /// public override void DataBind() { OnDataBinding(EventArgs.Empty); EnsureChildControls(); DataBindChildren(); } protected virtual void RecreateChildControls() { ChildControlsCreated = false; EnsureChildControls(); } // Needed so the CompositeControl renders correctly in the designer, even when it does not have // an associated ControlDesigner (i.e. it is a child control of another CompositeControl). protected internal override void Render(HtmlTextWriter writer) { if (DesignMode) { EnsureChildControls(); } base.Render(writer); } #region ICompositeControlDesignerAccessor implementation void ICompositeControlDesignerAccessor.RecreateChildControls() { RecreateChildControls(); } #endregion } }