TemplateControlDesigner Example Code
I think I pulled this from an example somewhere, but I can't find the original.
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ResourcedControls
{
/// <summary>
/// Summary description for CustomTemplatedControl.
/// </summary>
[Designer(typeof(CustomTemplateControlDesigner))]
public class CustomTemplatedControl : WebControl, INamingContainer
{
private ITemplate _MyTemplate;
private CustomTemplate _CustomTemplate;
/* public CustomTemplatedControl()
{
}
*/
public virtual string Caption
{
get
{
String caption = (string)ViewState["Caption"];
return ((caption == null)? String.Empty : caption);
}
set
{
ViewState["Caption"] = value;
}
}
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(CustomTemplate))]
// [ReadOnly(true)]
[Browsable(false)]
public virtual ITemplate MyTemplate
{
get
{
return _MyTemplate;
}
set
{
_MyTemplate = value;
}
}
public override ControlCollection Controls
{
get
{
EnsureChildControls();
return base.Controls;
}
}
protected override void CreateChildControls ()
{
Controls.Clear();
_CustomTemplate = new CustomTemplate(Caption,this.Attributes);
ITemplate template = MyTemplate;
if (template == null)
{
//template = new DefaultTemplate();
}
if (template != null)
{
template.InstantiateIn(_CustomTemplate);
Controls.Add(_CustomTemplate);
}
}
protected override void Render(HtmlTextWriter output)
{
if(Site!=null)
{
foreach(Control control in this.Controls)
{
object temp = control.FindControl("Caption");
if(temp.GetType().GetProperty("Text")!=null)
{
temp.GetType().GetProperty("Text").SetValue(temp,this.Caption,null);
}
// switch(temp.GetType().ToString())
{
// case "System.Web.UI.WebControls.TextBox":
// ((TextBox)temp).Text=this.Caption;
// break;
}
}
}
EnsureChildControls();
RenderChildren(output);
// base.Render(output);
}
public override void DataBind()
{
EnsureChildControls();
base.DataBind();
}
private sealed class DefaultTemplate : ITemplate
{
// private static void CaptionLabel_DataBinding(object sender, EventArgs e)
// {
// Label captionLabel = (Label)sender;
// CustomTemplate container = (CustomTemplate)captionLabel.NamingContainer;
// captionLabel.Text = container.Caption;
// }
void ITemplate.InstantiateIn(Control container)
{
LiteralControl captionLabel = new LiteralControl();
// captionLabel.DataBinding += new EventHandler(CaptionLabel_DataBinding);
container.Controls.Add(captionLabel);
captionLabel.Text= "<!--" + container.GetType().Name + "-->";
}
}
}
}
using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Diagnostics;
using System.Web.UI;
using System.Web.UI.Design;
using System.Web.UI.WebControls;
namespace ResourcedControls
{
/// <summary>
/// Summary description for CustomTemplateControlDesigner.
/// </summary>
public class CustomTemplateControlDesigner: TemplatedControlDesigner
{
public CustomTemplateControlDesigner():base()
{
//
// TODO: Add constructor logic here
//
}
public override bool DesignTimeHtmlRequiresLoadComplete
{
get
{
return true;
}
}
public override string GetDesignTimeHtml()
{
CustomTemplatedControl control = (CustomTemplatedControl)Component;
if (control.MyTemplate == null)
{
return GetEmptyDesignTimeHtml();
}
string designTimeHtml = String.Empty;
try
{
control.DataBind();
designTimeHtml = base.GetDesignTimeHtml();
}
catch (Exception e)
{
designTimeHtml = GetErrorDesignTimeHtml(e);
}
return designTimeHtml;
}
protected override string GetEmptyDesignTimeHtml()
{
return CreatePlaceHolderDesignTimeHtml("Right-click to edit the ContactTemplate template property. "
+ "<br> If the ContactTemplate is not specified a default template is used at run time.");
}
protected override string GetErrorDesignTimeHtml(Exception e)
{
return CreatePlaceHolderDesignTimeHtml("There was an error rendering the ContactInfo control.");
}
TemplateEditingVerb[] _templateEditingVerbs;
protected override TemplateEditingVerb[] GetCachedTemplateEditingVerbs()
{
if (_templateEditingVerbs == null)
{
_templateEditingVerbs = new TemplateEditingVerb[1];
_templateEditingVerbs[0] = new TemplateEditingVerb("Custom Template", 0, this);
}
return _templateEditingVerbs;
}
public override void SetTemplateContent(ITemplateEditingFrame editingFrame, string templateName, string templateContent)
{
if ((_templateEditingVerbs != null) && (_templateEditingVerbs[0] == editingFrame.Verb))
{
CustomTemplatedControl control = (CustomTemplatedControl)Component;
ITemplate newTemplate = null;
if ((templateContent != null) && (templateContent.Trim().Length != 0))
{
// UITemplates.Utilities.MsgBox(templateContent);
newTemplate = GetTemplateFromText(templateContent);
control.MyTemplate = newTemplate;
}
}
}
protected override ITemplateEditingFrame CreateTemplateEditingFrame(TemplateEditingVerb verb)
{
ITemplateEditingFrame frame = null;
if ((_templateEditingVerbs != null) && (_templateEditingVerbs[0] == verb))
{
ITemplateEditingService teService = (ITemplateEditingService)GetService(typeof(ITemplateEditingService));
if (teService != null)
{
Style style = ((CustomTemplatedControl)Component).ControlStyle;
frame = teService.CreateFrame(this, verb.Text, new string[] { "ContactTemplate" }, style, null);
}
}
return frame;
}
private void DisposeTemplateEditingVerbs()
{
if (_templateEditingVerbs != null)
{
_templateEditingVerbs[0].Dispose();
_templateEditingVerbs = null;
}
}
public override string GetTemplateContent(ITemplateEditingFrame editingFrame, string templateName, out bool allowEditing)
{
string content = String.Empty;
allowEditing = true;
if ((_templateEditingVerbs != null) && (_templateEditingVerbs[0] == editingFrame.Verb))
{
ITemplate currentTemplate = ((CustomTemplatedControl)Component).MyTemplate;
if (currentTemplate != null)
{
content = GetTextFromTemplate(currentTemplate);
}
}
return content;
}
protected override void PreFilterProperties(IDictionary properties)
{
base.PreFilterProperties(properties);
System.ComponentModel.PropertyDescriptor pd = (PropertyDescriptor)properties["MyTemplate"];
// pd.IsReadOnly=true;
// UITemplates.Utilities.MsgBox(DataBindings.Count.ToString()) ;
// properties.Remove();
}
}
}