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();}
}
}