Summary
You get this error message when adding controls to a custom control in ASPX: CS1729: 'System.Web.UI.ControlCollection' does not contain a constructor that takes 0 arguments
Solution: Make the ControlCollection property readonly. For example:
public ControlCollection Rows { get; private set; }
Background
In ASP.NET you can make your own controls and initialize them using XML in the ASPX page:
<atl:LinkTable runat="server">
<Rows>
<asp:HyperLink runat="server" NavigateUrl="~/Hello.aspx">Hello</asp:HyperLink>
<asp:HyperLink runat="server" NavigateUrl="~/World.aspx">World</asp:HyperLink>
</Rows>
</atl:LinkTable>
The contents of Rows are converted to a control collection and passed to the LinkTable. The LinkTable looks like this:
[ParseChildren(typeof(Control), DefaultProperty = "Rows", ChildrenAsProperties = true)]
public class LinkTable : CompositeControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
public ControlCollection Rows { get; private set; }
...
}
If you have a publicly settable ControlCollection, .NET will try to create a new ControlCollection. Because ControlCollection does not have a default constructor, it will fail with this error message:
CS1729: 'System.Web.UI.ControlCollection' does not contain a constructor that takes 0 arguments
To solve this, make sure you have private set on your ControlCollection property.