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
}
}
}