Skip to main content

Custom Server Controls Vs Entirely Custom Controls

Sometimes you find yourself writing custom controls which uses server control provided by Microsoft.

These controls include TextBox, GridView and Button. With these control you don't have to implement IPostBackDataHandler (unless you're doing something customization) as you can wire the event shown here.

protected override void CreateChildControls()


_txtBox = new TextBox();

_txtBox.Text = _defaultText;

System.Web.UI.WebControls.Button _txtBtn = new Button();

_txtBtn.Click += new EventHandler(_txtBtn_Click);
_txtBtn.Text = _cmdText;


void _txtBtn_Click(object sender, EventArgs e)

////// triggerring take place here /////////


If you need to customized your control above to implement IPostBackDataHandler for your custom server control, then just register your component. Beware if you do that, your existing wired EVENT will no longer work.

//////////////////////// Fully Custom Server Control ////////////////////////

But when you're writing a server control whereby you have full control over the rendering of entire html codes, then you have to implement IPostBackDataHandler.

Just put these into your aspx file (registering the control):


In your custom server code you probably have such code implementation-

public virtual bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection values)

string _previousValue = defaultText;
string _ctlValue = values[postDataKey];

if (string.IsNullOrEmpty(_previousValue) || !_previousValue.Equals(_ctlValue))
this.defaultText = _ctlValue;
return true;
return false;


public virtual void RaisePostDataChangedEvent()

WebCtlEvent e = new WebCtlEvent();
e.Text = Page.Request.Form[this.ClientID + "_input"];


public virtual void OnSearching(WebCtlEvent e)
if (searching != null)
searching(this, e);


Just needed a place of put life cycle of a control for my own record......... :)

Stage 1
CreateChildControls -----> EnsureChildControls ----> Render ----> RenderControl

Stage 2 (Recylce itself depending on how many times user click on the page)
LoadPostData ---> Page_Load (check for wired events ---> RaisePostDataChangedEvent

---> RaisePostBackEvent ----> EnsureChildControls ----> force CreateChildControls

--->Render ----> RenderControls;


Popular posts from this blog

Android Programmatically apply style to your view

Applying style to your view (button in this case) dynamically is pretty easy. All you have to do is place the following in your layout folder (res/layout)
Let's call this file : buttonstyle.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android=""> <item android:state_pressed="true" > <shape> <solid android:color="#449def" /> <stroke android:width="1dp" android:color="#2f6699" /> <corners android:radius="3dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> </item> <item> <shape> <gradient android:startColor="#449def" a…

DataTable does not have AsEnumerable

I have problem locating my AsEnumerable extension method in my DataTabe (System.Data). Thank god for this post by Angel

I was able to find this method once i have added reference to the following assembly.

C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll

Try to do a dummy Build and you should be able to get it.

OpenCover code coverage for .Net Core

I know there are many post out there getting code coverage for .dotnetcore. I'm using opencover to address this needs.

In case, you do no want to use opencover and wanted to stick with vs2015 code coverage, you can try to copy Microsoft.VisualStudio.CodeCoverage.Shim.dll from C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Dynamic Code Coverage Tools\coreclr\ and drop it into your project "bin\Debug\netcoreapp1.0" folder.  Please note : you need to be on VS2015 Enterprise to do this. 

To get started, I guess we need to add OpenCover and ReportGenerator for our test projects, as shown in diagram below :-

When nuget packge gets restored, we will have some binaries downloaded to our machine and we going to use this to generate some statistics. I think the biggest issue is to getting those command lines work.

In dotnetcore, we run test project using "dotnet test" (assuming you are in the test project folder - if not please go there)  So we add this …