User Controls
Consider utilizing the events property for better performance: http://www.singingeels.com/Articles/HandleYourEventsPerformBetter.aspx
Dynamically loading controls
MyUserControl myUserControl = (MyUserControl)LoadControl("MyUserControl.ascx");
form1.Controls.Add(myUserControl);
Templated User Control
//In the User Control
asp:PlaceHolder ID="PlaceHolderTemplate"
//Code behind
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(DataContainer))]
public ITemplate LayoutTemplate { get; set; }
public Data Data { get; set; }
Page_Init() {
PlaceHolderTemplate.Controls.Clear();
if (LayoutTemplate != null) {
DataContainer container = new DataContainer(this.Data)
LayoutTemplate.InstantiateIn(container);
PlaceHolderTemplate.Controls.Add(container);
}
}
//Naming container class
public class DataContainer : Control, INamingContainer
{
public Data Data { get; set; }
public DataContainer(Data data) {
Data = data;
}
}
//ASPX pages using the control then define:
uc1:MyTemplateControl
LayoutTemplate
asp:TextBox Text="<%#Container.Data.Field%>"
//Code behind
MyTemplateControl.Data.Field = "Value";
MyTemplateControl.DataBind();
Extending a Control
[assembly: TagPrefix("MyUserControls", "muc")]
[ToolboxBitmap(typeof(LabeledTextBox), "MyUserControls.LabeledTextBox.bmp")]
[DefaultProperty("Label")]
[ToolboxData(@"<{0}:LabeledTextBox runat="server" Label="My Label" />")] //Default values
[Designer("MyUserControls.LabeledTextBoxDesigner, MyUserControls")]
public class LabeledTextBox : TextBox
{
public string Label;
protected override void Render(HtmlTextWriter writer) {
writer.Write(Label);
base.Render(writer);
}
}
Custom Designer
public class LabeledTextBoxDesigner : ControlDesigner
{
private LabeledTextBox _labeledTextBoxControl;
public override void Initialize(IComponent component) {
_labeledTextBoxControl = (LabeledTextBox)component;
base.Initialise(component);
retur;
}
public override string GetDesignTimeHtml() {
if (_labeledTextBoxControl.Label == "My Label") {
return "Define label";
}
else {
return base.GetDesignTimeHtml();
}
}
}
Extending WebControl
Override render with your own stuff, basically.
protected override void Render(HtmlTextWriter writer) {
writer.WriteFullBeginTag("div");
writer.Write("Hello world");
writer.WriteFullEndTag("div");
}
Composite Control
public class MyCompositeControl : CompositeControl
{
public event System.EventHandler MyEvent;
public string MyProperty
{
get
{
return (TextBox)FindControl("MyTextBox").Text;
}
set
{
TextBox)FindControl("MyTextBox").Text = value;
}
}
protected override void CreateChildControls()
{
TextBox myTextBox = new TextBox();
myTextBox.ID = "MyTextBox";
Controls.Add(myTextBox);
}
}
Templated Custom Web Control
Similar to templated user control except override DataBind() and call EnsureChildControls() on the base control class.
Custom Server Control
public class MyTextBox : TextBox, IScriptControl
{
private ScriptManager sMgr;
protected override void OnPreRender(EventArgs e) {
if (!this.DesignMode) {
sMgr = ScriptManager.GetCurrent(Page);
if (sMgr != null) {
sMgr.RegisterScriptControl(this);
}
}
}
protected virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors() { }
protected virtual IEnumerable<ScriptReference> GetScriptReferences() { }
}
Extender Control
[TargetControlType(typeof(Control))]
public class MyExtender : ExtenderControl { //Implementation similar to above }
<ajaxEnabled: MyExtender runat="server" ID="MyExtender1" TargetControlID="Button1"/>