<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:brett="http://www.brettresources.net/xml/articles.xsd"><channel><title>www.brettresources.net</title><link>http://www.brettresources.net/dotnet/rss.aspx</link><atom:link href="http://www.brettresources.net/dotnet/rss.aspx" rel="self" type="application/rss+xml" /><description>Articles from www.brettresources.net about .Net development.</description><copyright>(c) 2005, www.brettresources.net - All rights reserved.</copyright><language>en-US</language><managingEditor>brett@brettresources.net (Brett Burch)</managingEditor><ttl>10080</ttl><generator>www.brettresources.net</generator><image><title>www.brettresources.net</title><url>http://www.brettresources.net/favicon.ico</url><link>http://www.brettresources.net/</link><width>62</width><height>53</height><description>Articles from www.brettresources.net about .Net development.</description></image><item><dc:creator>Brett Burch</dc:creator><title>Creating a asp:HyperlinkColumn for your DataList or Repeater</title><description>					
							&lt;p&gt;The HyperlinkColumn is an effective way of generating a column of links for the DataGrid, but is not accessible in other templated ListControls such as the DataList or Repeater.  There are several methods for adding this capability onto your web forms.  I'll show 2 methods here.&lt;/p&gt;
							&lt;p&gt;	The first is to use a standard anchor tag and the DataBinder.Eval method.  You can use this method when you don't need the server control to quickly generate a link, which potentially reduces ViewState. Pass the data source, field, and format string into the DataBinder.Eval method on your web form.  For example:&lt;/p&gt;
							&lt;pre&gt;&amp;lt;a href='&amp;lt;%# DataBinder.Eval(Container.DataItem,&amp;quot;product_id&amp;quot; , &amp;quot;/product_detail.aspx?id={0}&amp;quot;) %&amp;gt;'&amp;gt;&amp;lt;img align=&amp;quot;right&amp;quot; border=&amp;quot;0&amp;quot; src='&amp;lt;%# DataBinder.Eval(Container.DataItem,&amp;quot;image_url_sm&amp;quot; , &amp;quot;/ShowImage.aspx?img={0}&amp;w=150&amp;h=150&amp;quot;) %&amp;gt;'&amp;gt;&amp;lt;/a&amp;gt;&lt;/pre&gt;
							&lt;p&gt;An advantage here is that you can specify whatever you wish as the display item for the link.  In the example above, I set the href element of my anchor tag to the product_detail.aspx page, with my product_id from the database in the QueryString.You could set the display for the link as static text, or text from another database field, or in the sample above, a thumbnail with its source set in the same manner as the href of the anchor tag.  The html generated from the above sample is shown below, for product 67 having an image url string &amp;quot;67_small.gif&amp;quot; in the database.&lt;/p&gt;
							&lt;pre&gt;&amp;lt;a href='/product_detail.aspx?id=67'&amp;gt;&amp;lt;img align=&amp;quot;right&amp;quot; border=&amp;quot;0&amp;quot; src='/ShowImage.aspx?img=67_small.gif&amp;amp;w=150&amp;h=150' /&amp;gt;&amp;lt;/a&amp;gt;&lt;/pre&gt;						
								&lt;b&gt;A note of advice on this method&lt;/b&gt;
								&lt;br /&gt;The DataBinder.Eval method can be costly because of late binding overhead. As quoted from ASPAlliance:
								&lt;blockquote&gt;
									&lt;p&gt;&lt;b&gt;CAUTION:&lt;/b&gt;
									&lt;br /&gt;Since this method is called at runtime, it can cause performance to noticeably slow compared to standard ASP.NET databinding syntax. Use this method judiciously, particularly when string formatting is not required.&lt;/p&gt;
								&lt;/blockquote&gt;
								DataBinder.Eval resources:
								&lt;ul&gt;
									&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebUIDataBinderClassEvalTopic.asp"&gt;MSDN page: DataBinder.Eval Method&lt;/a&gt;&lt;/li&gt;
									&lt;li&gt;&lt;a href="http://authors.aspalliance.com/aspxtreme/sys/Web/UI/DataBinderClassEval2.aspx"&gt;ASP Alliance page: DataBinder.Eval Method&lt;/a&gt;&lt;/li&gt;
								&lt;/ul&gt;
								&lt;p&gt;	Another option is to simply return the url for the href element of an anchor tag via a public function in your code-behind class.  When using this method, be sure to pass your url database field item as type object into the function.  This simplifies dealing with NULL database values (passing a NULL as a string into your function will throw an exception).  An example of this in use on an aspx page is shown with the returnUrl function below.&lt;/p&gt;
								&lt;pre&gt;Click &amp;lt;a href='&amp;lt;%# returnUrl(Container.DataItem(&amp;quot;product_id&amp;quot;)) %&amp;gt;'&amp;gt;here&amp;lt;/a&amp;gt; to view detail about this product.&lt;/pre&gt;
								&lt;p&gt;The public function to return this information is:&lt;/p&gt;
								&lt;pre&gt;Public Function returnURL(ByVal id As Object) As String
	If IsDBNull(id) Or (id Is String.Empty) Then
		Return &amp;quot;&amp;quot;
	Else
		Return &amp;quot;/product_detail.aspx?id=&amp;quot; &amp;amp; id  
	End If 
End Function&lt;/pre&gt;	
							&lt;p&gt;You could also set the NavigateUrl of a asp:Hyperlink item during the onItemDataBound event of the DataList.  Use the e.Item.FindControl method to find your asp:Hyperlink and then set properties accordingly. I recommend avoiding this except when the server control is absolutely necessary.  I am uncertain, however, of the advantages gained with this method, and therefore have not elaborated.&lt;/p&gt;
							&lt;p&gt;In summary, you can still easily have templated hyperlinks without the asp:HyperlinkColumn in your DataLists and Repeaters.  The fastest and least expensive way to develop this capability is to use a simple old anchor tag and use either the DataBinder.Eval method or a public function to return strings to build the link.I am sure there are other methods as well that I have not mentioned. 
									Test it out, and &lt;a href="/contact.aspx"&gt;contact me &lt;/a&gt; with suggestions / comments.&lt;/p&gt;							
				</description><link>http://www.brettresources.net/dotnet/article.aspx?id=1</link><category>.Net Application Development</category><guid isPermaLink="true">http://www.brettresources.net/dotnet/article.aspx?id=1</guid><dc:date>2004-05-07</dc:date></item><item><dc:creator>Brett Burch</dc:creator><title>An Overview of Web Application Architecture Best Practices</title><description>
						&lt;p&gt;#1, 3, 4, 5 and 8 have information that is pertinent only to .Net application development.  However, the same basic generals apply, regardless of the underlying technology used.&lt;/p&gt;
						&lt;ol&gt;
							&lt;li&gt;Use a tiered architecture for your server-side code (C#, VB.Net, PHP, JSP, etc).  Tiered architectures contain a business layer, data layer, and wrappers for either (or both).  
										Separating the UI from the business layer can allow the same code to be used from different UI's, such as a database call returning a SqlDataReader to either a Web form or a Windows form.  
										Separating the business logic from the data layer can allow code that returns the same data type to be re-used extensively.
							&lt;/li&gt;
							&lt;li&gt;De-couple each piece of the application as much as possible.  Keep database code in the database (via stored procedures*), UI components on the web / windows forms, JavaScript in .js files, and style information in CSS files. 
										Think of these different pieces of the application just as a data store (xml file, SQL Server, Oracle, MySql, etc), where the data exists separately from the web files.  For example, database information cannot possibly be stored in a CSS file.  
										In the same way I recommend CSS and JavaScript information should not be stored on the UI files.
										&lt;p&gt;* Due to the recent discussions about the actual performance gains of stored procedures, I am not recommending stored procedures for performance purposes, but as a way to store the database access information in the database and separately from web site files.  Taking advantage of stored procedure permission control is also a great way to lock down and restrict data access.&lt;/p&gt;
							&lt;/li&gt;
							&lt;li&gt;Use server controls only where necessary, but don't under-use.  There's no need to re-invent the wheel.  The balance here can be the difference between fast and horribly slow pages.  Check ViewState in a browser and try to keep this as small as possible.  Turn off view state for items that don't change based on user interaction.							
							&lt;/li&gt;
							&lt;li&gt;Implement a custom error page, and an application level error event to be notified of exceptions.  Use these to email or log errors for QA and support purposes.
							&lt;/li&gt;
							&lt;li&gt;Database connection strings, secure information and static variables should be kept in the web.config file (or relevant j2ee config.xml file).  Web.config cannot be served to a browser, and does not require a re-compile when changes are made.  
									For example, a database server going down would require a re-compile of all applications using an Application level variable for a database connection string, set in the global.asax file.  A web.config file simply requires the file to be re-saved (the web application has a listener on this file and restarts when changes are made).
							&lt;/li&gt;
							&lt;li&gt;Include style information for cross-browser support.  For example, all tables should have cellpadding, cellspacing, and border set (even if 0).  All elements with height of 100% should have the height attribute set, and on a style tag for that item.  
									Images should always have height, width, and alt text set so they load separately from the page's text (speeding up the display to the browser).
							&lt;/li&gt;
							&lt;li&gt;Use div tags and style sheets to create navigation bars (and wherever else possible as well).  Textual items are much less bandwidth-costly, and can be changed / updated easier faster than images.
							&lt;/li&gt;
							&lt;li&gt;Decide carefully when to bind data bound objects.  Use the Page.IsPostBack property to avoid rebinding on each page viewing.  On items that are bound with different data on each posting, reduce ViewState as much as possible to avoid storing the data in ViewState, only to bind with different data on the next PostBack.
							&lt;/li&gt;
						&lt;/ol&gt;
					</description><link>http://www.brettresources.net/dotnet/article.aspx?id=2</link><category>.Net Application Development</category><guid isPermaLink="true">http://www.brettresources.net/dotnet/article.aspx?id=2</guid><dc:date>2004-07-20</dc:date></item><item><dc:creator>Brett Burch</dc:creator><title>Creating Web Parts for SharePoint Portal Server 2003 with ASP.Net User Controls</title><description>
							&lt;p&gt;Have you ever needed to create a server control, but found yourself having trouble rendering the HTML in traditional code-behind methods?  Have you ever found yourself needing to create a Web Part for your Intranet but could not afford to take the time to test and debug a web part when HTML must be rendered on a line-by-line basis using the HtmlTextWriter?  In a traditional web application, User Controls simplify the process of adding &amp;quot;snap-in&amp;quot; web page parts.  I'll show you how to use these here with SharePoint Web Part development to drastically reduce Web Part development time.&lt;/p&gt;
							&lt;ol&gt;
								&lt;li&gt;Create a new Web Part Library VS.Net project.  To get the Web Part Library template, go to &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=CAC3E0D2-BEC1-494C-A74E-75936B88E3B5&amp;displaylang=en"&gt;MSDN page: SharePoint Products and Technologies Templates: Web Part Templates for Visual Studio .NET&lt;/a&gt;.  For further directions, see &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odc_sp2003_ta/html/sharepoint_webparttemplates.asp"&gt;MSDN page: Web Part Templates for Microsoft Visual Studio .NET&lt;/a&gt;.  Add a separate CAB Setup and Deployment project to the solution with all the content, documentation and primary output from the web part library project.  I named mine &amp;quot;WebParts&amp;quot; and the default namespace was thus &amp;quot;WebParts.&amp;quot;&lt;/li&gt;
								&lt;li&gt;Create an additional VS.Net solution, first containing a Web Application project, such as http://devbox/yoursite.  If you already have a VS.Net solution you wish to create your web parts with, this is not required.&lt;/li&gt;
								&lt;li&gt;Add a separate Web Application project to the solution created in step 2, which is a sub-folder of the existing project (ex: http://devbox/yoursite/web_parts).  This ensures that each project in the solution has a separate /bin folder and will produce a unique .dll file.  Use the second web project to create the user controls, which will act as your web part content, once deployed.  Add a web form in this project to test.  Be sure to not use Page.IsPostBack, because SharePoint pages post back more frequently than traditionally expected.  
										&lt;p&gt;To work around this, I set the visible property of my container web control to &amp;quot;false&amp;quot; and checked for that in my user control's Page_Load event.  When false, I knew the page had not yet posted back yet.  I then set the visible property to &amp;quot;true&amp;quot; in my code-behind and continued from there.  Specifically, I used a DataList.  Every post back caused the DataList to be re-DataBound, so the only time I had to check to DataBind to the original data was when the visible property of my DataList was &amp;quot;false.&amp;quot;&lt;/p&gt;
&lt;pre&gt;private void Page_Load(object sender, System.EventArgs e)
	{
		// Put user code to initialize the page here 
		//set DataList to invisible for starters... that will be
		//similar to testing PostBack, then set it to visible and bind			
		if (dlPages.Visible == false)
		{				
			dlPages.Visible = true;
				//...do any other setup tasks here as well
			BindDataList();
		}
	}&lt;/pre&gt;
								&lt;p&gt;Also be certain that any web.config appSettings also are created in the Portal server's web.config file, because this is the location that your User Controls will look to for appSettings when deployed to the SharePoint server.&lt;/p&gt;&lt;/li&gt;
							&lt;li&gt;Create a folder on the Portal server to contain user controls (ex: \\sps2k3\c$\Inetpub\wwwroot\wpUserControls).  Add the .ascx file from the second web project (created in step 2) in this folder.  Add the .dll from the \bin folder of the second project to the \bin folder of the Portal (ex: \\sps2k3\c$\Inetpub\wwwroot\bin).&lt;/li&gt;
							&lt;li&gt;Use the web part library project (created in step 1) to render the user controls.  For the code on how to do this, I highly recommend &lt;a href="http://www.reflectionit.nl/WebPart1.aspx"&gt;Fons Sonnemans' article titled &amp;quot;User Control Container Web Part&amp;quot;&lt;/a&gt;.  Rather than creating one individual user control container web part where SharePoint users select a user control to work with, I simply created an individual web part for each user control by setting the value of _userControl in the code.  This is less flexible, but does allow more granular access to properties of each web part.  Make sure that each web part has a .dwp, and that the Build Action property of that .dwp file is set to &amp;quot;Content.&amp;quot;&lt;/li&gt;
							&lt;li&gt;Add each web part's information in the web part library's manifest.xml file, as shown below.  Note that the first SafeControl element is the WebParts namespace.  This is the root namespace for all the created web parts in this project.  Each individual web part's declaration follows.
&lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;!-- You need only one manifest per CAB project for Web Part Deployment.--&amp;gt;
&amp;lt;!-- This manifest file can have multiple assembly nodes.--&amp;gt;
&amp;lt;WebPartManifest xmlns=&amp;quot;http://schemas.microsoft.com/WebPart/v2/Manifest&amp;quot;&amp;gt;
  &amp;lt;Assemblies&amp;gt;
    &amp;lt;Assembly FileName=&amp;quot;WebParts.dll&amp;quot;&amp;gt;
	&amp;lt;!-- Use the &amp;lt;ClassResource&amp;gt; tag to specify resources like image files or JScript files that your Web Parts use. --&amp;gt;
    &amp;lt;!-- Note that you must use relative paths when specifying resource files. --&amp;gt;
      &amp;lt;!--
      &amp;lt;ClassResources&amp;gt;
        &amp;lt;ClassResource FileName=&amp;quot;Resource.jpg&amp;quot;/&amp;gt;
      &amp;lt;/ClassResources&amp;gt;
      --&amp;gt;
      &amp;lt;SafeControls&amp;gt;
        &amp;lt;SafeControl Namespace=&amp;quot;WebParts&amp;quot; TypeName=&amp;quot;*&amp;quot; /&amp;gt;      
        &amp;lt;SafeControl Namespace=&amp;quot;webpart1_uc&amp;quot; TypeName=&amp;quot;*&amp;quot; /&amp;gt;
        &amp;lt;SafeControl Namespace=&amp;quot;webpart2_uc&amp;quot; TypeName=&amp;quot;*&amp;quot; /&amp;gt;
        ...
      &amp;lt;/SafeControls&amp;gt;
    &amp;lt;/Assembly&amp;gt;
  &amp;lt;/Assemblies&amp;gt;
  &amp;lt;DwpFiles&amp;gt;     
    &amp;lt;DwpFile FileName=&amp;quot;webpart1_uc.dwp&amp;quot;/&amp;gt;
    &amp;lt;DwpFile FileName=&amp;quot;webpart2_uc.dwp&amp;quot;/&amp;gt;
    ...
  &amp;lt;/DwpFiles&amp;gt;
&amp;lt;/WebPartManifest&amp;gt;
&lt;/pre&gt;	
						&lt;/li&gt;
						&lt;li&gt;Build the Web Part Library project.&lt;/li&gt;
						&lt;li&gt;Copy the Cab file created in the previous step over to the Sharepoint server's IIS 6.0 \bin folder (ex: \\sps2k3t\c$\Program Files\Common Files\Microsoft Shared\web server extensions\60\BIN).&lt;/li&gt; 
						&lt;li&gt;On the Portal server, use stsadm.exe from the command prompt to install the web part package, where webpartcab.cab is the name of the file just copied over:
&lt;pre&gt;C:\Documents and Settings\Administrator&gt;cd c:\program files\common files\microsoft shared\web server extensions\60\bin

C:\Program Files\Common Files\Microsoft Shared\web server extensions\60\BIN&gt;stsadm.exe -o addwppack -filename webpartcab.cab -force

webpartcab.cab: Deploying to http://sps2k3/.
Operation completed successfully.&lt;/pre&gt;
							You can now use your Web Parts on your SharePoint site.&lt;/li&gt;
				&lt;/ol&gt;
			&lt;b&gt;Notes&lt;/b&gt;&lt;br /&gt;
			&lt;p&gt;Any re-build of the user control requires the second web project's .dll to be re-copied over, as well as the .ascx file, but only if that was also modified.  However, this does NOT require the web parts to be re-deployed 
					as well because the user control's &amp;quot;container&amp;quot; has not changed.  This simplifies the process of debugging and deploying fixes because you can test your changes in a UI sandbox environment on your web site before deploying.  
					The exception to this is when you need to test SharePoint specific functionality, such as reading a file collection within your SharePoint site.  When you have finished your QA process, the .dll just 
					needs to be copied over to your folder on the Portal server that contains user controls (ex: \\sps2k3\c$\Inetpub\wwwroot\wpUserControls) as mentioned above.&lt;/p&gt;
			&lt;p&gt;This article does not mention using strong named assemblies, which may be more desirable when working with SharePoint, as Full Trust scenarios, and security in general, are dealt with in a much stricter manner.  This will be discussed in a future article.&lt;/p&gt;
			&lt;b&gt;Additional Resources&lt;/b&gt;&lt;br /&gt;
			&lt;ul&gt;
				&lt;li&gt;&lt;a href="http://www.reflectionit.nl/WebPart1.aspx"&gt;http://www.reflectionit.nl/WebPart1.aspx&lt;/a&gt;&lt;/li&gt;
				&lt;li&gt;&lt;a href="http://www.microsoft.com/belux/nl/msdn/community/columns/tisseghem/webparts2.mspx"&gt;http://www.microsoft.com/belux/nl/msdn/community/columns/tisseghem/webparts2.mspx&lt;/a&gt;&lt;/li&gt;
				&lt;li&gt;&lt;a href="http://www.15seconds.com/issue/040427.htm"&gt;http://www.15seconds.com/issue/040427.htm&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
		</description><link>http://www.brettresources.net/dotnet/article.aspx?id=3</link><category>.Net Application Development</category><guid isPermaLink="true">http://www.brettresources.net/dotnet/article.aspx?id=3</guid><dc:date>2004-08-12</dc:date></item><item><dc:creator>Brett Burch</dc:creator><title>Injection-Safe Inline SQL with LIKE in the WHERE Clause</title><description>
        		&lt;p&gt;This is something that might be obvious, but I thought I would mention this because it wasn't obvious to me.  As I have mentioned earlier, &lt;a title="brettresources.net article: An Overview of Web Application Architecture Best Practices" href="/dotnet/article.aspx?id=2"&gt;I prefer stored procedures&lt;/a&gt;, but recently 
        		found myself in a scenario where I had to use inline SQL.  I will avoid the &amp;quot;why&amp;quot; discussion and get to the point.  I wanted to use the '%partial_term%' wildcard syntax in order to retrieve partial matches on a search page (so that FName, First_Name, Name, 
        		nameF, etc. would all be returned when inputting &amp;quot;name&amp;quot;, for example).  To prevent &lt;a href="http://www.google.com/search?hl=en&amp;q=sql+injection" title="Google search for SQL Injection"&gt;SQL Injection&lt;/a&gt;, however, I wasn't about to just use string concatenation for my search term.  
        		Googling for an example using inline SqlParameters with = (EQUALS operand) in the WHERE clause gets you what you need, but I couldn't find an example with LIKE in the WHERE clause.&lt;/p&gt;
				&lt;p&gt;&lt;b&gt;The Solution&lt;/b&gt;&lt;/p&gt;
				&lt;p&gt;Add the % wildcard(s) before / after the partial search string when creating the SqlParameter object.  The example below lives in an object helper class and uses a function in my DAL class (which acts more or less like a wrapper around the 
				&lt;a  title="MSDN page: Data Access Application Block for .Net" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daab-rm.asp"&gt;Data Access Application Block for .Net&lt;/a&gt;).&lt;/p&gt;
				&lt;pre&gt;string sql = &amp;quot;SELECT &amp;lt;columns&amp;gt; FROM &amp;lt;table&amp;gt;&amp;quot;;
if (search_string != string.Empty)
{
	sql += &amp;quot; WHERE &amp;lt;column&amp;gt; LIKE @searchstring&amp;quot;;
	SqlParameter[] sqlParams = new SqlParameter[1];
	sqlParams[0] = new SqlParameter(&amp;quot;@searchstring&amp;quot;,&amp;quot;%&amp;quot; + search_string + &amp;quot;%&amp;quot;);
	return DAL.GetDataTableWithText(sql,sqlParams);
}
else
{
	return DAL.GetDataTableWithText(sql,null);
}&lt;/pre&gt;
        </description><link>http://www.brettresources.net/dotnet/article.aspx?id=4</link><category>.Net Application Development</category><guid isPermaLink="true">http://www.brettresources.net/dotnet/article.aspx?id=4</guid><dc:date>2004-10-19</dc:date></item><item><dc:creator>Brett Burch</dc:creator><title>Handling the Client-Side onblur event of an asp:TextBox wth Server-Side code</title><description>
    		&lt;p&gt;A recent project required me to handle more client-side events than the usual click, onchange and submit events that are easily wired up with the .Net framework.  
        	Here's a way to handle additional client-side events with server-side code.  WARNING: This does involve what I would consider a hack, but does solve the business problem.&lt;/p&gt;
        	&lt;p&gt;What I had to do was add a button to the page, and then wire up an event (as usual) for that button's click event.  This is as easy as drag, drop, and double-click
    		in Visual Studio.  To display this, I have added an aspx web form to a project called &amp;quot;testing.aspx&amp;quot;...  Here is my .cs code:&lt;/p&gt;
    		&lt;pre&gt;public class testing : System.Web.UI.Page
	{
		protected System.Web.UI.WebControls.TextBox txt1;
		protected System.Web.UI.WebControls.Button btnBlur;
	
		private void Page_Load(object sender, System.EventArgs e)
		{
			// Put user code to initialize the page here
			string eventHandler = this.GetPostBackEventReference(this.btnBlur, &amp;quot;&amp;quot;); 
			this.txt1.Attributes.Add(&amp;quot;onblur&amp;quot;,eventHandler);
		}

		private void btnBlur_Click(object sender, System.EventArgs e)
		{
			Response.Write(&amp;quot;btnBlur_Click fired from txt1's onblur event.  I can do anything server-side here.&amp;quot;);
		}
		
		//the rest of your code-behind class
		...
				
		private void InitializeComponent()
		{    
			this.btnBlur.Click += new System.EventHandler(this.btnBlur_Click);
		}
	&lt;/pre&gt;&lt;p&gt;What we have essentially done in the above code is hijack the button's server-side Click event.  This is dangerous, because if the button were to be displayed, 
				clicking it would cause our asp:TextBox's onblur server-side code to run.  We would obviously not want that to happen.  The best way I have found 
				to prevent the button from being clicked is to hide it from our users.  I set the Visible property of my button (btnBlur) to False, and additionally
				wrapped it in a div HTML element with a style tag on the div including &amp;quot;display:none&amp;quot; just to be safe.  Call it paranoia, since the Visible=&amp;quot;False&amp;quot; on the asp:Button
				tag will prevent it from being rendered on the form, but I felt it important to include.  The critical piece of my testing.aspx code is below.&lt;/p&gt;
				&lt;pre&gt;&amp;lt;asp:TextBox Runat=&amp;quot;server&amp;quot; ID=&amp;quot;txt1&amp;quot;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;
&amp;lt;div style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;asp:Button ID=&amp;quot;btnBlur&amp;quot; Text=&amp;quot;&amp;quot; Runat=&amp;quot;server&amp;quot; Visible=&amp;quot;False&amp;quot;&amp;gt;&amp;lt;/asp:Button&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;
			&lt;p&gt;Exiting your asp:Textbox now will cause server-side code to fire.&lt;/p&gt;
			&lt;p&gt;
				&lt;b&gt;Taking It a Step Further&lt;/b&gt;&lt;br /&gt;
				So what if we want to do this in a DataList, DataGrid, or Repeater?  Not a problem.  My business requirement led me to use a DataList.
					Our asp:Button's click event is going to get bubbled to the DataList's ItemCommand event.  Some sample DataList code shows how we set this up.&lt;/p&gt;
					&lt;pre&gt;&amp;lt;asp:DataList Runat=&amp;quot;server&amp;quot; ...
	&amp;lt;ItemTemplate&amp;gt;
		&amp;lt;!-- txt onblur stuff --&amp;gt;
		&amp;lt;asp:TextBox Runat=&amp;quot;server&amp;quot; ID=&amp;quot;txt1&amp;quot; Width=&amp;quot;225px&amp;quot;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;
		&amp;lt;div style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;asp:Button ID=&amp;quot;btnBlur&amp;quot; CommandName=&amp;quot;Blur&amp;quot; Text=&amp;quot;&amp;quot; Runat=&amp;quot;server&amp;quot; Visible=&amp;quot;False&amp;quot;&amp;gt;&amp;lt;/asp:Button&amp;gt;&amp;lt;/div&amp;gt;
		&amp;lt;!-- end txt onblur stuff --&amp;gt;
	&amp;lt;/ItemTemplate&amp;gt;&lt;/pre&gt;
		&lt;p&gt;This is no different than the previous snippet, except that we don't explicitly set up a Click event for the Button.  Instead, we set a CommandName for the Button, which
		we can use in the DataList's ItemCommand event.  To see this, review the code below.&lt;/p&gt;
		&lt;pre&gt;private void DataList_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
	if (e.Item.ItemType == ListItemType.Item ||
		e.Item.ItemType == ListItemType.AlternatingItem)
	{
		// the next 4 lines are required to handle the textbox's onblur event with server-side code...
		Button btn = (Button)e.Item.FindControl(&amp;quot;btnBlur&amp;quot;);
		string eventHandler = this.GetPostBackEventReference(btn, &amp;quot;&amp;quot;);
		TextBox txt = (TextBox)e.Item.FindControl(&amp;quot;txt1&amp;quot;);
		txt.Attributes.Add(&amp;quot;onblur&amp;quot;,eventHandler);
		//end onblur code
	}
}

private void DataList_ItemCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
{
	switch (e.CommandName)
	{
		case &amp;quot;Blur&amp;quot;:
			//do whatever you like here to handle the onblur event
			break;
	...
		&lt;/pre&gt;
		&lt;p&gt;As you can see, I used the ItemDataBound event of the DataList to set up the onblur hijack rather that Page_Load.
			This is because the TextBox lives in a different place in the Page's control tree (and is more easily accessible here).  As you can also see, 
			setting up the code to handle our Blur command is just like setting up any othe DataList command.  Hopefully this helps others in future
			endeavors.  It stands to reason that any JavaScript event could be handled in this way.&lt;/p&gt;
		&lt;p&gt;My question is, will future ASP.Net controls have 
			this functionality built-in?  Just for experimentation purposes, I think I'll create a server control that is capable of handling any client-side event
			for an HTML input control.  More about that later...
		&lt;/p&gt;
		</description><link>http://www.brettresources.net/dotnet/article.aspx?id=5</link><category>.Net Application Development</category><guid isPermaLink="true">http://www.brettresources.net/dotnet/article.aspx?id=5</guid><dc:date>2004-12-10</dc:date></item><item><dc:creator>Brett Burch</dc:creator><title>Using the new ASP.Net 2.0 XmlDataSource</title><description>
      &lt;p&gt;
      I previously used a custom collection to display the article titles and summaries on my /dotnet landing page.  This involved reading the XML file, hydrating a business object for each article, returning the business object to the page, explicitly setting the data source for the DataList, and finally calling DataBind for the DataList.  Since I had my XSD schema I was able to use xsd.exe and generate the business object, but the whole process still required quite a bit of code.  Just the business object hydration (upgraded to the .Net 2.0 version using a Generic implementation) might include code like the following:
      &lt;/p&gt;&lt;hr class="article_separator" /&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: teal;"&gt;List&lt;/span&gt;&lt;&lt;span style="color: teal;"&gt;ArticleType&lt;/span&gt;&gt; GetAllArticles()&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.ValidateUrls();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;List&lt;/span&gt;&lt;&lt;span style="color: teal;"&gt;ArticleType&lt;/span&gt;&gt; articles = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;List&lt;/span&gt;&lt;&lt;span style="color: teal;"&gt;ArticleType&lt;/span&gt;&gt;();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;XmlTextReader&lt;/span&gt; xtr = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;XmlTextReader&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.XmlDataFileUrl);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.MoveToContent();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//read the file&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt; (xtr.Read())&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (xtr.LocalName == &lt;span style="color: maroon;"&gt;"article"&lt;/span&gt; &amp;&amp; xtr.NodeType == &lt;span style="color: teal;"&gt;XmlNodeType&lt;/span&gt;.Element)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.Read();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//move past the article element to id&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt; (xtr.NodeType != &lt;span style="color: teal;"&gt;XmlNodeType&lt;/span&gt;.Element)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.Read();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//get the id value&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;ArticleType&lt;/span&gt; article = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ArticleType&lt;/span&gt;();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; article.id = xtr.ReadString();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//move to date text element&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt; (xtr.NodeType != &lt;span style="color: teal;"&gt;XmlNodeType&lt;/span&gt;.Element)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.Read();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; article.date = &lt;span style="color: teal;"&gt;Convert&lt;/span&gt;.ToDateTime(xtr.ReadString());&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; article.dateSpecified = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.Read();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//move to title text element&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt; (xtr.NodeType != &lt;span style="color: teal;"&gt;XmlNodeType&lt;/span&gt;.Element)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.Read();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; article.title = xtr.ReadString();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.Read();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//move to description text element&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt; (xtr.NodeType != &lt;span style="color: teal;"&gt;XmlNodeType&lt;/span&gt;.Element)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.Read();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; article.description = xtr.ReadString();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.Read();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//move to content text element&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt; (xtr.NodeType != &lt;span style="color: teal;"&gt;XmlNodeType&lt;/span&gt;.Element)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.Read();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; article.content = xtr.ReadString();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; articles.Add(article);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;finally&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xtr.Close();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; articles;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;/div&gt;
      &lt;hr class="article_separator" /&gt;
      &lt;p&gt;
      Since my data's original source is XML, it seemed silly to translate the XML to an in-memory object when I could bind the DataList directly to the XML file.  I didn't mind not having to write the code either...  So how do we use the XmlDataSource?  Simply specify a URL where the data comes from, a URL for any XSLT transformation, and the XPath query to grab the records of choice from the data file.  For example:
      &lt;/p&gt;
      &lt;pre&gt;&amp;lt;asp:XmlDataSource ID=&amp;quot;xds&amp;quot; runat=&amp;quot;server&amp;quot; DataFile=&amp;quot;~/xml/articles.xml&amp;quot; TransformFile=&amp;quot;~/xml/articles_adapter.xsl&amp;quot; XPath=&amp;quot;Articles/article&amp;quot;&amp;gt;&amp;lt;/asp:XmlDataSource&amp;gt;&lt;/pre&gt;
      &lt;p&gt;
      Note that due to the fact that my XSD schema defines the properties of each article as an element rather than an attribute, I transform the data coming from &lt;a href="http://www.brettresources.net/xml/articles.xml"&gt;http://www.brettresources.net/xml/articles.xml&lt;/a&gt; so that for each article, the elements are transformed to attributes.  The transformation is shown below.
      &lt;/p&gt;
      &lt;hr class="article_separator" /&gt;
      
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: maroon;"&gt;xml&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;version&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;encoding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color: blue;"&gt;?&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;version&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns:xsl&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://www.w3.org/1999/XSL/Transform&lt;/span&gt;"&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns:brett&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://www.brettresources.net/xml/articles.xsd&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;match&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Articles&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:for-each&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;brett:Articles/brett:article&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;article&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;id&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;./brett:id&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;date&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;./brett:date&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;title&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;./brett:title&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;description&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;./brett:description&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;article&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:for-each&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Articles&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

      &lt;hr class="article_separator" /&gt;
      &lt;p&gt;
      Finally we get to our XPath query.  I use "Articles/article" because I'm pulling back all the articles in the file.
      &lt;/p&gt;
      &lt;p&gt;Let's discuss the syntax to actually display this data in the DataList.  Instead of using the Container.DataItem methodology, such as
      &lt;/p&gt;
      &lt;pre&gt;&lt;%# DataBinder.Eval(Container.DataItem, "date", "{0:d}") %&gt;&lt;/pre&gt;
      &lt;p&gt;
      (shown with a format string), we use a new XPath function call.  For example,
      &lt;p&gt;
      &lt;pre&gt;&lt;%# XPath("@id", "/dotnet/article.aspx?id={0}")%&gt;&lt;/pre&gt;
      &lt;p&gt;
      (shown again with a format string).  Note the @ symbol in front of the attribute name, as this is XPath syntax for an attribute.  My DataList now has a DataSourceId attribute with the ID of the XmlDataSource associated with it.  The ItemTemplate now looks like the following:
      &lt;/p&gt;
      &lt;pre&gt;&amp;lt;asp:DataList ID=&amp;quot;dlArticles&amp;quot; runat=&amp;quot;server&amp;quot; DataSourceID=&amp;quot;xds&amp;quot;&amp;gt;
    &amp;lt;ItemTemplate&amp;gt;
        &amp;lt;a href=&amp;quot;&amp;lt;%# XPath(&amp;quot;@id&amp;quot;,&amp;quot;/dotnet/article.aspx?id={0}&amp;quot;)%&amp;gt;&amp;quot; title=&amp;quot;&amp;lt;%# XPath(&amp;quot;@title&amp;quot;)%&amp;gt;&amp;quot;&amp;gt;&amp;lt;%# XPath(&amp;quot;@title&amp;quot;)%&amp;gt;&amp;lt;/a&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;%# XPath(&amp;quot;@description&amp;quot;)%&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;/ItemTemplate&amp;gt;&lt;/pre&gt;
      &lt;p&gt;This by no means reduces the necessity for business objects when doing CRUD functions with your data, obviously, but this is a nice and easy way to present XML in ASP.Net 2.0 applications.  It's also worth noting that caching comes out of the box with the XmlDataSource, so that's additional code which you don't have to write.
      &lt;/p&gt;
      &lt;p&gt;
      I really like what I see so far from ASP.Net 2.0 so far.  The amount of code we as developers have to write to present data in applications has been greatly reduced, and this is just one example.
      &lt;/p&gt;
      &lt;p&gt;
      &lt;b&gt;Additional Resources&lt;/b&gt;
      &lt;/p&gt;
      &lt;ul&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/rajbk/articles/431322.aspx"&gt;Using XSLT files with the new XMLDataSource control&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://beta.asp.net/QUICKSTART/aspnet/doc/ctrlref/data/xmldatasource.aspx"&gt;MS QuickStart Tutorial&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="http://www.developersupply.com/aspnet/XMLDataSource.asp"&gt;The Code Project: Introduction to XMLDataSource control in ASP.NET 2.0&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    </description><link>http://www.brettresources.net/dotnet/article.aspx?id=6</link><category>.Net Application Development</category><guid isPermaLink="true">http://www.brettresources.net/dotnet/article.aspx?id=6</guid><dc:date>2006-02-04</dc:date></item><item><dc:creator>Brett Burch</dc:creator><title>A Quick Exploration of the Atlas UpdatePanel control</title><description>
      &lt;p&gt;
      I've been messing around with &lt;a href="http://beta.asp.net/default.aspx?tabindex=9&amp;tabid=47" title="Atlas home"&gt;Atlas&lt;/a&gt; a bit and think the &lt;a href="http://atlas.asp.net/quickstart/atlas/doc/controls/default.aspx#updatepanel" title="Atlas Update Panel server control"&gt; Update Panel server control &lt;/a&gt; is what I'm looking forward to most.  This article is a brief introduction to the Update Panel control, and only touches the most basic aspects of the Update Panel and Atlas.
      &lt;/p&gt;
      &lt;p&gt;
      Essentially I want to show how easy it was for me to set up an AJAX enabled page that swaps UserControls in a Placeholder control by clicking a LinkButton.  The sample shows a prototype that could be built into a tabbed (Yahoo-esque?) interface for viewing data about a customer by your favorite customer service representative.  The actual web form itself is very simple.  The code below shows the web form.
      &lt;/p&gt;
      &lt;hr class="article_separator" /&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;form&lt;/span&gt; &lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="form1"&lt;/span&gt; &lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;="server"&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;atlas&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;ScriptManager&lt;/span&gt; &lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;="server"&lt;/span&gt; &lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;="ScriptManager1"&lt;/span&gt; &lt;span style="color: red;"&gt;EnablePartialRendering&lt;/span&gt;&lt;span style="color: blue;"&gt;="true"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;atlas&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;UpdatePanel&lt;/span&gt; &lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;="server"&lt;/span&gt; &lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;="UpdatePanel1"&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;uc1&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;TabbedAccountDashboard&lt;/span&gt; &lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;="TabbedAccountDashboard1"&lt;/span&gt; &lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;="server"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;atlas&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;form&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
      &lt;hr class="article_separator" /&gt;
      &lt;p&gt;
      The only code on the actual page of relevance is the Update Panel which has my "Sales Dashboard" user control in it and the ScriptManager server control, which adds the Atlas JavaScript file references to the HTML output delivered to the browser.
      &lt;/p&gt;
      &lt;p&gt;
      The User Control itself contains the "tabs" and the content-swapping code.  There are a set of LinkButtons on the top which would become the tabs.  A placeholder below is the container for the UserControls which are then swapped out based on the currently viewed tab.
      &lt;/p&gt;
      &lt;pre style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;div&gt;&lt;p&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt; &lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="primary-nav"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;ul&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt; &lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="acctsum"&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;LinkButton&lt;/span&gt; &lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;="server"&lt;/span&gt; &lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;="lbAccountSummary"&lt;/span&gt; &lt;span style="color: red;"&gt;CommandArgument&lt;/span&gt;&lt;span style="color: blue;"&gt;="AccountSummary.ascx"&lt;/span&gt; &lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="Account Summary"&lt;/span&gt; &lt;span style="color: red;"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue;"&gt;="lbAccountSummary_Click"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;LinkButton&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;nbsp;&lt;/span&gt;|&lt;span style="color: red;"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt; &lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="act"&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;LinkButton&lt;/span&gt; &lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;="server"&lt;/span&gt; &lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;="lbActivities"&lt;/span&gt; &lt;span style="color: red;"&gt;CommandArgument&lt;/span&gt;&lt;span style="color: blue;"&gt;="Activities.ascx"&lt;/span&gt; &lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="Activities"&lt;/span&gt; &lt;span style="color: red;"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue;"&gt;="lbActivities_Click"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;LinkButton&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;nbsp;&lt;/span&gt;|&lt;span style="color: red;"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt; &lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="notes"&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;LinkButton&lt;/span&gt; &lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;="server"&lt;/span&gt; &lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;="lbNotes"&lt;/span&gt; &lt;span style="color: red;"&gt;CommandArgument&lt;/span&gt;&lt;span style="color: blue;"&gt;="Notes.ascx"&lt;/span&gt; &lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="Notes"&lt;/span&gt; &lt;span style="color: red;"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue;"&gt;="lbNotes_Click"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;LinkButton&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;nbsp;&lt;/span&gt;|&lt;span style="color: red;"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt; &lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="tix"&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;LinkButton&lt;/span&gt; &lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;="server"&lt;/span&gt; &lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;="lbTickets"&lt;/span&gt; &lt;span style="color: red;"&gt;CommandArgument&lt;/span&gt;&lt;span style="color: blue;"&gt;="Tickets.ascx"&lt;/span&gt; &lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="Tickets"&lt;/span&gt; &lt;span style="color: red;"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue;"&gt;="lbTickets_Click"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;LinkButton&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;ul&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
...
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt; &lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;="padding:3px;"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;PlaceHolder&lt;/span&gt; &lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;="placeholder"&lt;/span&gt; &lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;="server"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;PlaceHolder&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;
      &lt;p&gt;
      I use the LinkButton CommandArgument property to declare the UserControl of choice to render in the Placeholder.  The server-side events that are called when a user clicks a LinkButton are shown below.
      &lt;/p&gt;
      &lt;hr class="article_separator" /&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;partial&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;dotnet_atlas_TabbedAccountDashboard&lt;/span&gt; : System.Web.UI.&lt;span style="color: teal;"&gt;UserControl&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: teal;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!&lt;span style="color: blue;"&gt;this&lt;/span&gt;.IsPostBack) &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LoadPlaceholderWithContent(&lt;span style="color: maroon;"&gt;"AccountSummary.ascx"&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; lbAccountSummary_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: teal;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LoadPlaceholderWithContent(((&lt;span style="color: teal;"&gt;LinkButton&lt;/span&gt;)sender).CommandArgument);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; lbActivities_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: teal;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LoadPlaceholderWithContent(((&lt;span style="color: teal;"&gt;LinkButton&lt;/span&gt;)sender).CommandArgument);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; lbNotes_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: teal;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LoadPlaceholderWithContent(((&lt;span style="color: teal;"&gt;LinkButton&lt;/span&gt;)sender).CommandArgument);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; lbTickets_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: teal;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LoadPlaceholderWithContent(((&lt;span style="color: teal;"&gt;LinkButton&lt;/span&gt;)sender).CommandArgument);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param name="SenderCommandArgument"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; LoadPlaceholderWithContent(&lt;span style="color: blue;"&gt;string&lt;/span&gt; SenderCommandArgument)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal;"&gt;Control&lt;/span&gt; ctrl = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LoadControl(SenderCommandArgument);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.placeholder.Controls.Add(ctrl);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;	
      &lt;hr class="article_separator" /&gt;
      &lt;p&gt;
      All the above code can be written and executed on the server, but the client does not have to PostBack and refresh the entire page in order to be updated.  To compare the difference, &lt;a href="http://www.brettresources.net/dotnet/atlas/UpdatePanelSample.aspx" title="Atlas UpdatePanel sample"&gt;view the side-by-side comparison&lt;/a&gt;.  The content user controls merely contain static HTML in this example, so the performance difference is negligible.  If, however, there was code in each of the User Controls that queried a database and dynamically generated their content, the difference would be quite noticeable to the end user.
      &lt;/p&gt;
    </description><link>http://www.brettresources.net/dotnet/article.aspx?id=7</link><category>.Net Application Development</category><guid isPermaLink="true">http://www.brettresources.net/dotnet/article.aspx?id=7</guid><dc:date>2006-02-09</dc:date></item><item><dc:creator>Brett Burch</dc:creator><title>Testing Custom Server Control Code That Depends On Its Container / Parent (the Page Object)</title><description>
      &lt;p&gt;
      The issue of faking the Page object cropped up recently for me when building a server control library.  I added client-side event attributes to my controls and wanted to write a test that essentially verified the expected html had been added to the HttpResponse.  I hit a roadblock when I got object reference errors for the control's Page object.  Note that I am not simply testing ASP.Net API - I will gladly give the ASP.Net team the credit they deserve and regard their API as capable code.  I wanted to test scenarios that were intertwined with that code, however.  Verifying a client-side event name in a collection was added or removed from both the Attributes collection and my custom collection, or verifying what the Attributes collection contained are examples.  To explain, consider the following code, where I attempt to add an Attribute to a TextBox control, which ultimately invokes a PostBack to be handled server-side:
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Attributes[ClientSideEvent]))&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; eventHandler = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Page.ClientScript.GetPostBackEventReference(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, eventArgPrefix + ClientSideEvent, &lt;span style="color: blue;"&gt;false&lt;/span&gt;);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Attributes.Add(ClientSideEvent, eventHandler);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      Calling this code from NUnit will throw an error for the Page object when trying to get the PostBackEventReference string.  The first and arguably easiest way to skirt this is to simply check whether this.Page is null.  Temporarily shelving the &lt;a href="http://en.wikipedia.org/wiki/KISS_principle" title="KISS principle"&gt;KISS principle&lt;/a&gt;, I'll continue the discussion.  Looking at the second code sample shows that I have extracted the implementation of retrieving the eventHandler string.
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; GetPostBackEventReference(&lt;span style="color: blue;"&gt;string&lt;/span&gt; ClientSideEvent)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ret_val = &lt;span style="color: maroon;"&gt;""&lt;/span&gt;;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; ((&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Page == &lt;span style="color: blue;"&gt;null&lt;/span&gt;) || &lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Page.Form == &lt;span style="color: blue;"&gt;null&lt;/span&gt;))&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ret_val = eventArgPrefix + ClientSideEvent;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ret_val = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Page.ClientScript.GetPostBackEventReference(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, eventArgPrefix + ClientSideEvent, &lt;span style="color: blue;"&gt;false&lt;/span&gt;);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; ret_val;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      This is all well and good, but what about when checking for if the current browser supports JavaScript?  The ASP.Net 2.0 method for performing this check is no longer checking Browser.JavaScript.  If you try to build your server control solution using Browser.JavaScript, you'll notice this property is now deprecated.  Clicking to the definition of this property gets you the following:
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;Obsolete&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"The recommended alternative is the EcmaScriptVersion property. A Major version value greater than or equal to 1 implies JavaScript support. http://go.microsoft.com/fwlink/?linkid=14202"&lt;/span&gt;)]&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; JavaScript { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; }&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      So then, now we have to do something like the following:
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;Boolean&lt;/span&gt; BrowserSupportsJavascript&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context != &lt;span style="color: blue;"&gt;null&lt;/span&gt; &amp;&amp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context.Request != &lt;span style="color: blue;"&gt;null&lt;/span&gt; &amp;&amp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context.Request.Browser != &lt;span style="color: blue;"&gt;null&lt;/span&gt; &amp;&amp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context.Request.Browser.EcmaScriptVersion != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context.Request.Browser.EcmaScriptVersion.Major &gt;= 1);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//for testing...&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      That looks like a lot of fun!  This no longer seems the simplest solution, so we can throw those KISS principles out the window.  Can we just assume that if the Page or Context object exists, then all of its properties and sub-properties are going to be there for us?  My assumption is yes, but assuming doesn't sound like the best solution.  After all, I want to write a test as the skeptical code-tester, right?  I'd like to mention now that it is a shame the &lt;a href="http://msdn2.microsoft.com/en-us/library/a9ewz1aa(vs.80).aspx" title="Page.VerifyRenderingInServerForm"&gt;Page.VerifyRenderingInServerForm&lt;/a&gt; or comparable method does not return a Boolean.  Not only that, but it would also be much appreciated if the ClientScriptManager class would implement an interface I could create a test helper from.  So what are our better options?  I decided that it may be best to add an isTest private flag to check when dealing with these scenarios.  The GetPostBackEventReference function now looks like:
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; isTest = &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;
      &lt;/div&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; GetPostBackEventReference(&lt;span style="color: blue;"&gt;string&lt;/span&gt; ClientSideEvent)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ret_val = &lt;span style="color: maroon;"&gt;""&lt;/span&gt;;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.isTest)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ret_val = eventArgPrefix + ClientSideEvent;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ret_val = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Page.ClientScript.GetPostBackEventReference(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, eventArgPrefix + ClientSideEvent, &lt;span style="color: blue;"&gt;false&lt;/span&gt;);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; ret_val;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      If this isTest flag is private, then I'll need to set it via Reflection in my unit test, and hope that nobody using my control library messes with it.  The unit test SetUp code then becomes:
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: teal;"&gt;BindingFlags&lt;/span&gt; bindingFlags = &lt;span style="color: teal;"&gt;BindingFlags&lt;/span&gt;.Instance | &lt;span style="color: teal;"&gt;BindingFlags&lt;/span&gt;.NonPublic;&lt;/p&gt;
      &lt;/div&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;ClientSideMadnessTextBox&lt;/span&gt; ctrl;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;SetUp&lt;/span&gt;]&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; SetUp()&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctrl = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ClientSideMadnessTextBox&lt;/span&gt;();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: teal;"&gt;ClientSideMadnessTextBox&lt;/span&gt;).GetField(&lt;span style="color: maroon;"&gt;"isTest"&lt;/span&gt;, bindingFlags).SetValue(ctrl, &lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      You could take this a step further if you liked and have a utility class which contains all the methods you need to fake (such as GetPostBackEventReference or GetWebResourceUrl), pass a type to this utility class, and then use reflection to call the method on the type specified (be it MyClientScriptManager or the real ClientScriptManager) but you would still be dependent upon the isTest private member, so this seems overly complex.  Just a thought, though...
      &lt;/p&gt;
      &lt;p&gt;
      Has anyone else come across this?  This looks like a Dependency Injection scenario to me, and I'm wondering what others have done.  Surely the ASP.Net team tests their code, so I'm curious how they did this.  Any advice is appreciated. &lt;/p&gt;
      &lt;p&gt;
      &lt;b&gt;Additional Resources&lt;/b&gt;
      &lt;/p&gt;
      &lt;ul&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/stevencohn/archive/2004/06/08/151235.aspx" title="PrivateObject Unit Tester"&gt;PrivateObject Unit Tester&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    </description><link>http://www.brettresources.net/dotnet/article.aspx?id=8</link><category>.Net Application Development</category><guid isPermaLink="true">http://www.brettresources.net/dotnet/article.aspx?id=8</guid><dc:date>2006-03-05</dc:date></item><item><dc:creator>Brett Burch</dc:creator><title>A Custom DropDownList Control With Autocomplete for ASP.NET 2.0</title><description>
      &lt;p&gt;
      In this article I'll show you how to easily create a DropDownList control in ASP.Net 2.0 that solves the same problem as a previous version solved in ASP.Net 1.* (seen at &lt;a href="http://www.dotnetjohn.com/articles.aspx?articleid=132" title="Previous article titled A Custom DropDownList Control With Autocomplete for ASP.NET"&gt;http://www.dotnetjohn.com/articles.aspx?articleid=132&lt;/a&gt;).  This problem is commonly known to ASP.Net developers.  As stated in the previous article, the problem is
      &lt;/p&gt;
      &lt;blockquote&gt;&lt;i&gt;
      The [DropDownList / html select list] control responds only to the first character you type. For example, if you wanted to find "Brown" in a list of names you would first type the letter 'b'. The default control will take you to the first 'b' in the list. If you then type in 'r' instead of taking you to the first item beginning with 'br', it takes you to the first item beginning with an 'r'. Every character you type will take you to the first item beginning with that character. This behavior is not very useful.
      &lt;/i&gt;&lt;/blockquote&gt;
      &lt;p&gt;
      Our first task is to create a new Web Control Library project, which is under the Windows section of your language of choice.
      &lt;/p&gt;
      &lt;p&gt;&lt;img src="/images/web_ctrl_library_setup.jpg" alt="web_ctrl_library_setup" /&gt;&lt;/p&gt;
      &lt;p&gt;
      Once your project is created you can begin by deleting the default WebCustomControl1 file in the project and add a reference to the System.Design namespace.  Start with a new item of type WebCustomControl called AutoCompleteDropDownList.  For simplicity of adding a little design-time richness, add using declarations for the  System.Web.UI.Design and System.Drawing.Design namespaces.  Instead of deriving from the WebControl class, derive directly from the DropDownList class instead.  Clear out the generated code so that your class is essentially bare:
      &lt;/p&gt;
      
				&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; BrettResources.ServerControls&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: teal;"&gt;ToolboxData&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"&amp;lt;{0}:AutoCompleteDropDownList runat=server&amp;gt;&amp;lt;/{0}:AutoCompleteDropDownList&amp;gt;"&lt;/span&gt;)]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: teal;"&gt;Description&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"HTML Select list derived from the DropDownList control which enables auto-complete selection of items in the DropDownList as the user types in the control"&lt;/span&gt;)]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;AutoCompleteDropDownList&lt;/span&gt; : &lt;span style="color: teal;"&gt;DropDownList&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
				&lt;/div&gt; 
      &lt;p&gt;
      The JavaScript used for this example is the essentially the same as in the previous article, with a single method named KeySortDropDownList_onkeypress taking two parameters (the dropdownlist object and the boolean caseSensitive).  This function is shown below.
      &lt;/p&gt;
      &lt;pre&gt;function KeySortDropDownList_onkeypress (dropdownlist,caseSensitive) {
      // check the keypressBuffer attribute is defined on the dropdownlist
      var undefined;
      if (dropdownlist.keypressBuffer == undefined) {
      dropdownlist.keypressBuffer = '';
      }
      // get the key that was pressed
      var key = String.fromCharCode(window.event.keyCode);
      dropdownlist.keypressBuffer += key;
      if (!caseSensitive) {
      // convert buffer to lowercase
      dropdownlist.keypressBuffer = dropdownlist.keypressBuffer.toLowerCase();
      }
      // find if it is the start of any of the options
      var optionsLength = dropdownlist.options.length;
      for (var n=0; n &lt; optionsLength; n++) {
      var optionText = dropdownlist.options[n].text;
      if (!caseSensitive) {
      optionText = optionText.toLowerCase();
      }
      if (optionText.indexOf(dropdownlist.keypressBuffer,0) == 0) {
      dropdownlist.selectedIndex = n;
      return false; // cancel the default behavior since
      // we have selected our own value
      }
      }
      // reset initial key to be inline with default behavior
      dropdownlist.keypressBuffer = key;
      return true; // give default behavior
      }&lt;/pre&gt;
      &lt;div&gt;
      &lt;p&gt;
      &lt;img align="right" style="padding:3px;" src="/images/embed_resource_propety.jpg" alt="embed_resource_propety.jpg" /&gt;
      A new feature in ASP.Net v2.0 allows us to compile resources such as JavaScript files directly into our DLLs to be pulled out later at runtime.  Add a file called AutoComplete.js to the project and set the Build Action property to Embedded Resource.  This will be the default location for our JavaScript in the case that developers choose not to write their own implementation of this functionality.&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      Now for the actual DropDownList code.  I'll start by adding three virtual properties to allow the developer to control the behavior of the control.  The first allows the user to turn off the AutoComplete feature.  The second allows the developer to supply the caseSensitive parameter to the JavaScript function from the control.  The last of these allows the user to provide an external JavaScript file where their version of KeySortDropDownList_onkeypress function exists.  The Editor and UrlProperty attributes aid the design time experience when selecting a custom JavaScript file.
      &lt;/p&gt;
      
				&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#region&lt;/span&gt; Public Virtual Properties&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; When set to true, javascript enabling auto-complete selection of items&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; in the DropDownList as the user types in the control is added&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;Category&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"Behavior"&lt;/span&gt;)]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;DefaultValue&lt;/span&gt;(&lt;span style="color: blue;"&gt;true&lt;/span&gt;)]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;Description&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"When set to true, javascript enabling auto-complete selection of items in the DropDownList as the user types in the control is added"&lt;/span&gt;)]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: teal;"&gt;Boolean&lt;/span&gt; AutoCompleteEnabled&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; ((ViewState[&lt;span style="color: maroon;"&gt;"AutoCompleteEnabled"&lt;/span&gt;] == &lt;span style="color: blue;"&gt;null&lt;/span&gt;) ? &lt;span style="color: blue;"&gt;true&lt;/span&gt; : (&lt;span style="color: teal;"&gt;Boolean&lt;/span&gt;)ViewState[&lt;span style="color: maroon;"&gt;"AutoCompleteEnabled"&lt;/span&gt;]);&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState[&lt;span style="color: maroon;"&gt;"AutoCompleteEnabled"&lt;/span&gt;] = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;Category&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"Behavior"&lt;/span&gt;)]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;DefaultValue&lt;/span&gt;(&lt;span style="color: blue;"&gt;false&lt;/span&gt;)]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: teal;"&gt;Boolean&lt;/span&gt; CaseSensitiveKeySort&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; ((ViewState[&lt;span style="color: maroon;"&gt;"CaseSensitiveKeySort"&lt;/span&gt;] == &lt;span style="color: blue;"&gt;null&lt;/span&gt;) ? &lt;span style="color: blue;"&gt;false&lt;/span&gt; : (&lt;span style="color: teal;"&gt;Boolean&lt;/span&gt;)ViewState[&lt;span style="color: maroon;"&gt;"CaseSensitiveKeySort"&lt;/span&gt;]);&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState[&lt;span style="color: maroon;"&gt;"CaseSensitiveKeySort"&lt;/span&gt;] = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Ex: "~/clientscript/AutoComplete.js"&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;Category&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"Behavior"&lt;/span&gt;)]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;Description&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"Ex: ~/clientscript/AutoComplete.js"&lt;/span&gt;)]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;Editor&lt;/span&gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(System.Web.UI.Design.UrlEditor), &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(UITypeEditor))]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;UrlProperty&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"*.js"&lt;/span&gt;)]&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ExternalScriptSourceRelativeUrl&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; ((&lt;span style="color: blue;"&gt;string&lt;/span&gt;)ViewState[&lt;span style="color: maroon;"&gt;"ExternalScriptSourceRelativeUrl"&lt;/span&gt;] == &lt;span style="color: blue;"&gt;null&lt;/span&gt;) ? &lt;span style="color: teal;"&gt;String&lt;/span&gt;.Empty : (&lt;span style="color: blue;"&gt;string&lt;/span&gt;)ViewState[&lt;span style="color: maroon;"&gt;"ExternalScriptSourceRelativeUrl"&lt;/span&gt;];&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState[&lt;span style="color: maroon;"&gt;"ExternalScriptSourceRelativeUrl"&lt;/span&gt;] = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
				&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#endregion&lt;/span&gt;&lt;/p&gt;
				&lt;/div&gt;
      &lt;p&gt;
      You can set the AutoCompleteEnabled property as the default property by adding an additional attribute to your class declaration like the following:
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;DefaultProperty&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"AutoCompleteEnabled"&lt;/span&gt;)]&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      These properties are useless until we override a method to inject our additional JavaScript reference to the control's Page and add the onkeypress attribute to select HTML element which our DropDownList ultimately renders on the browser as.  I've done this with the following code:
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#region&lt;/span&gt; Overridden Events&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; AddAttributesToRender(&lt;span style="color: teal;"&gt;HtmlTextWriter&lt;/span&gt; writer)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.AddAttributesToRender(writer);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.BrowserSupportsJavascript &amp;&amp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.AutoCompleteEnabled)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; writer.AddAttribute(&lt;span style="color: maroon;"&gt;"onkeypress"&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetOnKeyPressAttributeValue());&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnPreRender(&lt;span style="color: teal;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.OnPreRender(e);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.BrowserSupportsJavascript &amp;&amp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.AutoCompleteEnabled)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.RegisterAutoCompleteJavaScript();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#endregion&lt;/span&gt;&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      The BrowserSupportsJavascript and AutoCompleteEnabled properties are referenced in both of these methods so that our AutoComplete additions are only added to the response stream when both conditions are met.  The BrowserSupportsJavascript is declared below.
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;Boolean&lt;/span&gt; BrowserSupportsJavascript&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context != &lt;span style="color: blue;"&gt;null&lt;/span&gt; &amp;&amp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context.Request != &lt;span style="color: blue;"&gt;null&lt;/span&gt; &amp;&amp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context.Request.Browser != &lt;span style="color: blue;"&gt;null&lt;/span&gt; &amp;&amp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context.Request.Browser.EcmaScriptVersion != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context.Request.Browser.EcmaScriptVersion.Major &gt;= 1);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//for testing...&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      If you're not using a unit test framework to test you can shorten the above code to the following:
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;Boolean&lt;/span&gt; BrowserSupportsJavascript&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Context.Request.Browser.EcmaScriptVersion.Major &gt;= 1); }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;/div&gt;
      &lt;p&gt;
      The GetOnKeyPressAttributeValue and RegisterAutoCompleteJavaScript methods are also referenced in the overridden methods.  They are defined as shown below.  You'll also see additional code referencing CustomSettings.  I'll leave exploration of this as an excersize for the reader, but hopefully the source code will provide the needed details.
      &lt;/p&gt;
      &lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#region&lt;/span&gt; Private Methods&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterAutoCompleteJavaScript()&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.UseCustomSettings)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.ValidateCustomSettings();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.CustomSettings.ExternalScriptSourceRelativeUrl))&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.RegisterClientScriptBlock(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.CustomSettings.ScriptBlock);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.RegisterClientScriptInclude(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.CustomSettings.ExternalScriptSourceRelativeUrl);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.ExternalScriptSourceRelativeUrl))&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.RegisterClientScriptInclude(&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Page.ClientScript.GetWebResourceUrl(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: teal;"&gt;AutoCompleteDropDownList&lt;/span&gt;), &lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: maroon;"&gt;"BrettResources.ServerControls.AutoComplete.js"&lt;/span&gt;));&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.RegisterClientScriptInclude(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.ExternalScriptSourceRelativeUrl);&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterClientScriptBlock(&lt;span style="color: teal;"&gt;String&lt;/span&gt; script)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Page.ClientScript.IsClientScriptBlockRegistered(&lt;span style="color: maroon;"&gt;"AutoCompleteDropDownListBlock"&lt;/span&gt;))&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Page.ClientScript.RegisterClientScriptBlock(&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetType(),&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: maroon;"&gt;"AutoCompleteDropDownListBlock"&lt;/span&gt;,&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; script&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterClientScriptInclude(&lt;span style="color: teal;"&gt;String&lt;/span&gt; relativeUrl)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Page.ClientScript.IsClientScriptIncludeRegistered(&lt;span style="color: maroon;"&gt;"AutoCompleteDropDownListInclude"&lt;/span&gt;))&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Page.ClientScript.RegisterClientScriptInclude(&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: maroon;"&gt;"AutoCompleteDropDownListInclude"&lt;/span&gt;,&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.ResolveClientUrl(relativeUrl)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;String&lt;/span&gt; GetOnKeyPressAttributeValue()&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; AttributeValue = &lt;span style="color: maroon;"&gt;""&lt;/span&gt;;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.UseCustomSettings)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.ValidateCustomSettings();&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AttributeValue = &lt;span style="color: maroon;"&gt;"return "&lt;/span&gt; + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.CustomSettings.FunctionName + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.CustomSettings.FunctionSignature + &lt;span style="color: maroon;"&gt;";"&lt;/span&gt;;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AttributeValue = &lt;span style="color: maroon;"&gt;"return KeySortDropDownList_onkeypress(this,"&lt;/span&gt; + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.CaseSensitiveKeySort.ToString().ToLower() + &lt;span style="color: maroon;"&gt;");"&lt;/span&gt;;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; AttributeValue;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ValidateCustomSettings()&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.CustomSettings == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
      &lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"