May 14, 2010 by Christoff Truter C# ASP.NET
What is a templated control exactly?
Its basically a control that provides us with greater control over the markup rendered by our controls, an
example of a templated control in .net is the ListView control.
<asp:ListView runat="server" ID="lv" ItemPlaceholderID="ph">
<LayoutTemplate>
<table>
<tr>
<td>
ID
</td>
<td>
Title
</td>
</tr>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td>
<%# Eval("ID") %>
</td>
<td>
<%# Eval("Title") %>
</td>
</tr>
</ItemTemplate>
</asp:ListView>
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 CustomControls
{
[ParseChildren(ChildrenAsProperties = true)]
[Designer(typeof(CustomTemplateDesigner))]
public class CustomTemplateControl : CompositeControl, INamingContainer
{
[Browsable(false)]
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(CustomTemplateControl))]
public ITemplate FirstTemplate
{
get;
set;
}
[Browsable(false)]
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(CustomTemplateControl))]
public ITemplate SecondTemplate
{
get;
set;
}
protected override void CreateChildControls()
{
if (FirstTemplate != null)
{
FirstTemplate.InstantiateIn(this);
}
if (SecondTemplate != null)
{
SecondTemplate.InstantiateIn(this);
}
base.CreateChildControls();
}
}
}
<cc:CustomTemplateControl ID="CustomTemplateControl1" runat="server">
<SecondTemplate>
2
</SecondTemplate>
<FirstTemplate>
1
</FirstTemplate>
</cc:CustomTemplateControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Design;
using System.Web.UI.Design;
using System.Web.UI;
using System.Web.UI.Design.WebControls;
using System.ComponentModel;
namespace CustomControls
{
public class CustomTemplateDesigner : CompositeControlDesigner
{
private CustomTemplateControl _Control;
public override void Initialize(IComponent component)
{
base.Initialize(component);
_Control = (CustomTemplateControl)component;
}
private EditableDesignerRegion GetEditableRegion(ITemplate template, string title, string index, StringBuilder sb)
{
IDesignerHost host = (IDesignerHost)GetService(typeof(IDesignerHost));
sb.Append(String.Format(@"<tr>
<td style=""font-family: Arial;background-color:#CCC"">
{0}
</td>
</tr>
<tr>
<td {1}='{2}'>
{3}
</td>
</tr>", title,
DesignerRegion.DesignerRegionAttributeName, index,
ControlPersister.PersistTemplate(template, host)));
return new EditableDesignerRegion(this, String.Concat(DesignerRegion.DesignerRegionAttributeName, index), false);
}
public override string GetDesignTimeHtml(DesignerRegionCollection regions)
{
StringBuilder sb = new StringBuilder();
sb.Append(@"<table style=""border:1px solid #CCC"">");
EditableDesignerRegion region = GetEditableRegion(_Control.FirstTemplate, "First", "0", sb);
EditableDesignerRegion region2 = GetEditableRegion(_Control.SecondTemplate, "Second", "1", sb);
sb.Append("</table>");
regions.Add(region);
regions.Add(region2);
return sb.ToString();
}
public override string GetEditableDesignerRegionContent(EditableDesignerRegion region)
{
IDesignerHost host = (IDesignerHost)Component.Site.GetService(typeof(IDesignerHost));
if (host != null)
{
ITemplate template = (region.Name == String.Concat(DesignerRegion.DesignerRegionAttributeName, "0")) ? _Control.FirstTemplate : _Control.SecondTemplate;
if (template != null)
return ControlPersister.PersistTemplate(template, host);
}
return String.Empty;
}
public override void SetEditableDesignerRegionContent(EditableDesignerRegion region, string content)
{
if (content == null)
return;
IDesignerHost host = (IDesignerHost)Component.Site.GetService(typeof(IDesignerHost));
if (host != null)
{
ITemplate template = ControlParser.ParseTemplate(host, content);
if (region.Name == String.Concat(DesignerRegion.DesignerRegionAttributeName, "0"))
_Control.FirstTemplate = template;
else
_Control.SecondTemplate = template;
}
}
}
}