Listing 4: Customizing the HTML output

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Collections.Specialized;
     
namespace MyControls
{
  public class DateRange :WebControl,IPostBackDataHandler,IPostBackEventHandler
  {
      public event EventHandler Click; // define a public click event
      public virtual string BeginDate
      {
        get
        {
          return ((ViewState["BeginDate"]==null)?string.Empty:
            (string)ViewState["BeginDate"]);
        }
        set
        {
          ViewState["BeginDate"]=value;
        }
      }
      public virtual string EndDate
      {
        get
        {
          return ((ViewState["EndDate"]==null)?string.Empty:
            (string)ViewState["EndDate"]);
        }
        set
        {
          ViewState["EndDate"] = value;
        }
      }
      public DateRange()
      {
      }
      // Invoke all delegates subscribed to the Click event.
      protected virtual void OnClick(EventArgs e) 
      {
        if (Click != null) 
        {
          // handle events within try/catch blocks
          try
          {
            Click(this, e);
          }
          catch(Exception)
          {
          }
        } 
      }

      protected override void Render(HtmlTextWriter writer)
      {
        string beginDate = "Begin Date: ",endDate="End Date: ";
        writer.AddAttribute("border","0");
        writer.AddAttribute("cellspacing","2");
        writer.AddAttribute("cellpadding","2");
        writer.RenderBeginTag(HtmlTextWriterTag.Table);
        writer.RenderBeginTag(HtmlTextWriterTag.Tr);
        writer.AddAttribute(HtmlTextWriterAttribute.Valign,"top");
        writer.RenderBeginTag(HtmlTextWriterTag.Td);
        writer.Write(beginDate);
        writer.RenderEndTag();//end td
        writer.RenderBeginTag(HtmlTextWriterTag.Td);//start another td
        // set the size (width,height) of the input control.
        writer.AddAttribute(HtmlTextWriterAttribute.Value,BeginDate);
        writer.AddAttribute(HtmlTextWriterAttribute.Type,"Text");// the input ctrl's Type is Text
        // clients of your custom control will assign an id to your control
        // (i.e., <... id="uniqueid" runat="server">) use
        // that id to create ids for children of your control
        writer.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID+"1");
        writer.RenderBeginTag(HtmlTextWriterTag.Input);  
        writer.RenderEndTag(); // end input
        writer.RenderEndTag(); // end td
        writer.RenderEndTag(); // end tr
        writer.RenderBeginTag(HtmlTextWriterTag.Tr);
        writer.AddAttribute(HtmlTextWriterAttribute.Valign,"top");
        writer.RenderBeginTag(HtmlTextWriterTag.Td);
        writer.Write(endDate);
        writer.RenderEndTag();//end td
        writer.RenderBeginTag(HtmlTextWriterTag.Td);//start another td
        // set the size (width,height) of the input control.
        writer.AddAttribute(HtmlTextWriterAttribute.Value,EndDate);// set the input ctrl's value
        writer.AddAttribute(HtmlTextWriterAttribute.Type,"Text");// the input ctrl's Type is Text
        writer.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID);
        writer.RenderBeginTag(HtmlTextWriterTag.Input);  
        writer.RenderEndTag(); // end input
        writer.RenderEndTag(); // end td
        writer.RenderEndTag(); // end tr
        // add a submit button
        writer.RenderBeginTag(HtmlTextWriterTag.Tr);
        writer.RenderBeginTag(HtmlTextWriterTag.Td);
        writer.Write(" ");
        writer.RenderEndTag();//end td
        writer.RenderBeginTag(HtmlTextWriterTag.Td);
        // add button properties (e.g., handler)
        string name = this.UniqueID+"3";
        writer.AddAttribute(HtmlTextWriterAttribute.Name,name);
        writer.AddAttribute(HtmlTextWriterAttribute.Type,"submit");
        writer.AddAttribute(HtmlTextWriterAttribute.Onclick,"javascript:" + Page.GetPostBackEventReference(this));
        writer.RenderBeginTag(HtmlTextWriterTag.Button);
        writer.Write("Post Back End Date");
        writer.RenderEndTag(); // end button
        writer.RenderEndTag(); // end td
        writer.RenderEndTag(); // end tr
        writer.RenderEndTag(); // end table
      }
      // methods from IPostBackDataHandler
      public bool LoadPostData(string postDataKey, NameValueCollection values)
      {
        String oldValue = EndDate;
        String newValue = values[postDataKey];

        if (oldValue == null || !oldValue.Equals(newValue))
        {
          EndDate = newValue;
          return true;// so that RaisePostDataChangedEvent() is fired 
        }
        return false;
      }
      public void RaisePostDataChangedEvent()
      {
        // raise data changed event on the server here...
      }
      // methods from IPostBackEventHandler
      public void RaisePostBackEvent(string eventArgument)
      {
        OnClick(new EventArgs());//raise server event
      }
    }
  }