My Development Notes

By Haemoglobin
3/10/2010 (revision 2)

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"/>  

Comments

Powered by BlogEngine.NET 1.6.1.0 | Design by styleshout | Enhanced by GravityCube.net | 1.4.5 Changes by zembian.com | Adapted by HamishGraham.NET
(c) 2010 Hamish Graham. Banner Image (c) Chris Gin