<?xml version="1.0" encoding="UTF-8" ?>

<rss version="2.0"
  xmlns:ent="http://www.purl.org/NET/ENT/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
  <title>PGCodeWorks</title>
  <link>http://blog.peter.goodman.ms/blog</link>
  <description>Blog about .Net and geek-ware</description>
  <language>en-us</language>
  <lastBuildDate>Sat, 08 Nov 2008 03:15:21 +0000</lastBuildDate>
  <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
  <generator>Blogware</generator>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Moved my blog</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2008/11/7/3967335.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2008/11/7/3967335.html</guid>
    <pubDate>Sat, 08 Nov 2008 03:11:23 +0000</pubDate>
    <description>&lt;p&gt;So...I have bought my own domain and have decided to move my blog and email.&lt;/p&gt; &lt;p&gt;My new blog is at &lt;a href=&quot;http://blog.petegoo.com&quot;&gt;http://blog.petegoo.com&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Thanks to &lt;a target=&quot;_blank&quot; href=&quot;http://www.mafoo.com.au/&quot;&gt;Matt&lt;/a&gt;&lt;/p&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>T4 Editor update from Clarius coming soon</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2008/4/17/3644160.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2008/4/17/3644160.html</guid>
    <pubDate>Thu, 17 Apr 2008 10:18:08 +0100</pubDate>
    <description>&lt;p&gt;Just after I&#39;d &lt;a title=&quot;T4 Templating in C#3.0 / .Net 3.5 and its uses in DSL development&quot; href=&quot;http://blog.peter.goodman.ms/blog/_archives/2008/4/16/3642061.html&quot; target=&quot;_blank&quot;&gt;gone and mentioned&lt;/a&gt; that the &lt;a title=&quot;T4 Editor from Clarius Consulting&quot; href=&quot;http://www.t4editor.net/&quot; target=&quot;_blank&quot;&gt;T4 editor&lt;/a&gt; from Clarius Consulting doesn&#39;t give you intellisense, Victor Garcia Aprea &lt;a title=&quot;Victor Apreas announcement on T4 Editor&quot; href=&quot;http://weblogs.asp.net/vga/archive/2008/04/16/t4-editor-some-teasing-pictures.aspx&quot; target=&quot;_blank&quot;&gt;announces&lt;/a&gt; that they&#39;re working on an update which does exactly that. Looks really nice too.&lt;/p&gt; &lt;p&gt;Pete&lt;/p&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog/VS2008">VS2008</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>T4 Templating in C#3.0 / .Net 3.5 and its uses in DSL development</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2008/4/16/3642061.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2008/4/16/3642061.html</guid>
    <pubDate>Wed, 16 Apr 2008 10:31:03 +0100</pubDate>
    <description>&lt;h3&gt;Cut to the chase&lt;/h3&gt;OK. So you just want to know how to do it? Modify your template directives to the following.  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;lt;#@ template inherits=&quot;Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation&quot; language=&quot;C#v3.5&quot; #&amp;gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;h3&gt;What?..Why?&lt;/h3&gt; &lt;p&gt;Recently I have been doing a lot of work in Microsoft&#39;s &lt;a title=&quot;MSDN DSL Tools&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/bb126235.aspx&quot; target=&quot;_blank&quot;&gt;Domain Specific Language Tools for Visual Studio&lt;/a&gt;. In fact for the past 8 months this has pretty much been my main focus. I&#39;ve learned a lot of things on the way and it occurred to me that the development of T4 templates used in DSL tools would be made a lot easier with the use of extension methods. To understand why, you need to understand the concepts behind DSL tools and the development process involved in creating a model to define your problem domain and templating to create the desired output.&lt;/p&gt; &lt;p&gt;One of the problems that becomes apparent in the latter stages of developing a DSL tools implementation is that templating can become quite messy. In DSL tools you create a model of the API which will allow you to interact with the visual elements and this generates code containing the classes you defined in the pattern necessary for these visual elements to be able to use them. After you are happy with the model you move on to generating your output. Typically this takes the form of T4 templates which will generate C# classes. &lt;/p&gt; &lt;p&gt;T4 templating, despite the fact that the engine is now built into Visual Studio 2008, does not get any designer support. It is an ASP-like syntax which compiles at template-transform-time into C# class files used to generate the output into files in your solution. Even using editors like Clarius Consulting&#39;s &lt;a title=&quot;Clarius T4 Editor&quot; href=&quot;http://www.t4editor.net/&quot; target=&quot;_blank&quot;&gt;T4 Editor&lt;/a&gt; does not give you the intellisense you are used to in ordinary C# (well not yet anyway....&lt;a title=&quot;T4 Editor update from Clarius coming soon&quot; href=&quot;http://blog.peter.goodman.ms/blog/_archives/2008/4/17/3644160.html&quot;&gt;see here&lt;/a&gt;). What tends to happen is that developers make extensions to the model API classes generated by the DSL tools using partial classes to support common scenarios in templating (don&#39;t even go down the path of static helper classes.....eek). This seems a good idea at first but after some time your API classes tend to suffer from explosion of methods and properties. These methods and properties are not helpful in defining your domain and do not make sense in &lt;a title=&quot;DomainDrivenDesign.org&quot; href=&quot;http://www.domaindrivendesign.org/&quot; target=&quot;_blank&quot;&gt;Domain Driven Design&lt;/a&gt; concepts, they have no place in the ubiquitous language of the domain, they only make sense to the text transformation process employed in your T4 templates.&lt;/p&gt; &lt;p&gt;The solution can be to add common base templates which are included in your task specific templates using an ASP-like &lt;strong&gt;&lt;em&gt;include&lt;/em&gt;&lt;/strong&gt; directive. An issue with this is you typically create new class structures to encapsulate the functionality you want to perform. This has an obvious overhead in setup and maintenance, also the code in the include template is compiled into the same class as the task specific template which simply adds to the issues.&lt;/p&gt; &lt;p&gt;No wonder then that I was interested in the possibility of using &lt;a title=&quot;Developer.com usage of Extension Methods&quot; href=&quot;http://www.developer.com/net/csharp/article.php/3592216&quot; target=&quot;_blank&quot;&gt;Extension Methods&lt;/a&gt; to extend the DSL generated API with templating specific methods. After asking &lt;a title=&quot;MSDN Forums thread on C#3.0 in T4&quot; href=&quot;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3166859&amp;amp;SiteID=1&quot; target=&quot;_blank&quot;&gt;the question&lt;/a&gt; in the &lt;a title=&quot;MSDN VSX forum&quot; href=&quot;http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=57&amp;amp;SiteID=1&quot; target=&quot;_blank&quot;&gt;VSX forum&lt;/a&gt; I submitted a &lt;a title=&quot;Microsoft Connect issue on C#3.0 in T4&quot; href=&quot;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=338022&quot; target=&quot;_blank&quot;&gt;Microsoft Connect issue&lt;/a&gt; and got the answer of the above undocumented feature in a reply email. Basically this undocumented (AFAIK) feature allows you to add &quot;v3.5&quot; to the language definition in a template directive and it can be used, it seems like a bit of an after-thought but it does work. &lt;/p&gt; &lt;p&gt;One thing to note is that you can&#39;t specify extension method classes inside nested classes so it won&#39;t work in template include file, but you could externalise them to another assembly if required. So now you can add a class like the following to your code.&lt;/p&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: blue&quot;&gt;namespace&lt;/span&gt; PGCodeWorks.Dsl.Test.TestDsl.TemplatingExtensions {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ExampleElementExtensions&lt;/span&gt; {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;string&lt;/span&gt; LowerCaseName(&lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ExampleElement&lt;/span&gt; element) {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&lt;/span&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=&quot;color: blue&quot;&gt;return&lt;/span&gt; element.Name.ToLower();&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7&lt;/span&gt; }&lt;/p&gt;&lt;/div&gt; &lt;p&gt;And from your template code you can do the following.&lt;/p&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;&amp;nbsp;&amp;nbsp; 14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;#= element.LowerCaseName() #&amp;gt;&lt;/p&gt;&lt;/div&gt; &lt;p&gt;How nice is that? Should make templating a lot easier in VS2008.&lt;/p&gt; &lt;p&gt;Pete&lt;/p&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/VS2008">VS2008</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>WCF Exceptions and Fault Contracts</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2008/4/15/3641646.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2008/4/15/3641646.html</guid>
    <pubDate>Wed, 16 Apr 2008 03:27:02 +0100</pubDate>
    <description>&lt;p&gt;I ran across an issue recently trying to get a custom exception across a WCF boundary. The trouble is, WCF does not like to tell you what the problem was, and for good reason. I was thinking about exceptions the wrong way. In reality we do not want to pass exceptions across a WCF service boundary, instead we want to pass a Fault back to the caller.&lt;/p&gt; &lt;p&gt;An exception is a CLR concept, it does not make sense to expose this outside of the CLR, despite the fact that an exception contains potentially dangerous information (like the stack trace) which we do not want to expose. If your service does not handle an exception, it will fault. Hence a lot of the time we implement a try-catch handler and raise a &lt;a title=&quot;FaultException article in MSDN&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/ms576199.aspx&quot; target=&quot;_blank&quot;&gt;FaultException&lt;/a&gt; which gets sent across the boundary.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;p style=&quot;margin: 0px&quot;&gt;[&lt;span style=&quot;color: #2b91af&quot;&gt;OperationContract&lt;/span&gt;]&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;[&lt;span style=&quot;color: #2b91af&quot;&gt;FaultContract&lt;/span&gt;(&lt;span style=&quot;color: blue&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: #2b91af&quot;&gt;DivideByZeroException&lt;/span&gt;))]&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;void&lt;/span&gt; MyServiceMethod() {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;try&lt;/span&gt; {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green&quot;&gt;// Do some actual stuff&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;catch&lt;/span&gt;(&lt;span style=&quot;color: #2b91af&quot;&gt;DivideByZeroException&lt;/span&gt; ex) {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;FaultException&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af&quot;&gt;DivideByZeroException&lt;/span&gt;&amp;gt;(ex, &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;FaultReason&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&quot;DivisionByZero&quot;&lt;/span&gt;));&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;Then on your proxy side you will typically recreate this exception and throw it.&lt;/p&gt; &lt;p&gt;This approach sometimes has problems when your exception has some extra data in it. Consider the following custom exception type:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;MyDivideByZeroException&lt;/span&gt; : &lt;span style=&quot;color: #2b91af&quot;&gt;DivideByZeroException&lt;/span&gt;, &lt;span style=&quot;color: #2b91af&quot;&gt;ISerializable&lt;/span&gt; {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;protected&lt;/span&gt; MyDivideByZeroException(&lt;span style=&quot;color: #2b91af&quot;&gt;SerializationInfo&lt;/span&gt; info, &lt;span style=&quot;color: #2b91af&quot;&gt;StreamingContext&lt;/span&gt; context)&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style=&quot;color: blue&quot;&gt;base&lt;/span&gt;(info, context) {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numerator = (&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;)info.GetValue(&lt;span style=&quot;color: #a31515&quot;&gt;&quot;numerator&quot;&lt;/span&gt;, &lt;span style=&quot;color: blue&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;));&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; denominator = (&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;)info.GetValue(&lt;span style=&quot;color: #a31515&quot;&gt;&quot;denominator&quot;&lt;/span&gt;, &lt;span style=&quot;color: blue&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;));&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; numerator;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; Numerator {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; numerator; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;set&lt;/span&gt;{ numerator = &lt;span style=&quot;color: blue&quot;&gt;value&lt;/span&gt;;}&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; denominator;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; Denominator {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; denominator; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;set&lt;/span&gt; { denominator = &lt;span style=&quot;color: blue&quot;&gt;value&lt;/span&gt;; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; MyDivideByZeroException(&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; numerator, &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; denominator) : &lt;span style=&quot;color: blue&quot;&gt;base&lt;/span&gt;() {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;.numerator = numerator;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;.denominator = denominator;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;ISerializable&lt;/span&gt;.GetObjectData(&lt;span style=&quot;color: #2b91af&quot;&gt;SerializationInfo&lt;/span&gt; info, &lt;span style=&quot;color: #2b91af&quot;&gt;StreamingContext&lt;/span&gt; context) {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; info.AddValue(&lt;span style=&quot;color: #a31515&quot;&gt;&quot;numerator&quot;&lt;/span&gt;, numerator, &lt;span style=&quot;color: blue&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;));&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; info.AddValue(&lt;span style=&quot;color: #a31515&quot;&gt;&quot;denominator&quot;&lt;/span&gt;, denominator, &lt;span style=&quot;color: blue&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt;));&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;base&lt;/span&gt;.GetObjectData(info, context);&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;}&lt;/p&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;When you try this with the FaultException you may get an exception like the following: &lt;br&gt;&lt;strong&gt;&lt;em&gt;The underlying secure session has faulted before the reliable session fully completed. The reliable session was faulted. The reliable messaging channel threw an exception because the reliable session was broken. &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;In this case you can create a Fault class. Your fault class is simply a Data Contract serializable type containing the information you require to create your exception on the other side. e.g.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;p style=&quot;margin: 0px&quot;&gt;[&lt;span style=&quot;color: #2b91af&quot;&gt;DataContract&lt;/span&gt;]&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;DivideByZeroFault&lt;/span&gt; {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; DivideByZeroFault(&lt;span style=&quot;color: #2b91af&quot;&gt;MyDivideByZeroException&lt;/span&gt; exception) {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;.numerator = exception.Numerator;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;.denominator = exception.Denominator;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;MyDivideByZeroException&lt;/span&gt; GetException() {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;MyDivideByZeroException&lt;/span&gt;(numerator, denominator);&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style=&quot;color: #2b91af&quot;&gt;DataMember&lt;/span&gt;]&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; numerator;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; Numerator {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; numerator; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;set&lt;/span&gt; { numerator = &lt;span style=&quot;color: blue&quot;&gt;value&lt;/span&gt;; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style=&quot;color: #2b91af&quot;&gt;DataMember&lt;/span&gt;]&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; denominator;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;int&lt;/span&gt; Denominator {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: blue&quot;&gt;return&lt;/span&gt; denominator; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;set&lt;/span&gt; { denominator = &lt;span style=&quot;color: blue&quot;&gt;value&lt;/span&gt;; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Therefore your service code in the first example will change to be:&lt;/p&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;p style=&quot;margin: 0px&quot;&gt;[&lt;span style=&quot;color: #2b91af&quot;&gt;OperationContract&lt;/span&gt;]&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;[&lt;span style=&quot;color: #2b91af&quot;&gt;FaultContract&lt;/span&gt;(&lt;span style=&quot;color: blue&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;color: #2b91af&quot;&gt;DivideByZeroFault&lt;/span&gt;))]&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;void&lt;/span&gt; MyServiceMethod() {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;try&lt;/span&gt; {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: green&quot;&gt;// Do some actual stuff&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;catch&lt;/span&gt;(&lt;span style=&quot;color: #2b91af&quot;&gt;MyDivideByZeroException&lt;/span&gt; ex) {&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;FaultException&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af&quot;&gt;DivideByZeroFault&lt;/span&gt;&amp;gt;(&lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;DivideByZeroFault&lt;/span&gt;(ex), &lt;span style=&quot;color: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af&quot;&gt;FaultReason&lt;/span&gt;(&lt;span style=&quot;color: #a31515&quot;&gt;&quot;DivisionByZero&quot;&lt;/span&gt;));&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style=&quot;margin: 0px&quot;&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&lt;/p&gt;&lt;/div&gt; &lt;div style=&quot;font-size: 10pt; background: white; color: black; font-family: courier new&quot;&gt; &lt;p style=&quot;margin: 0px&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;This will allow WCF to send across the relevant information without compromising the applications security by sending a stack trace etc. &lt;p&gt;Pete&lt;/p&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/WCF">WCF</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>What is a comfortable office temperature?</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2008/1/13/3463802.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2008/1/13/3463802.html</guid>
    <pubDate>Mon, 14 Jan 2008 01:24:06 +0000</pubDate>
    <description>&lt;p&gt;Its 27 degrees Celsius today in our office and it feels like an oven. One of the guys has hooked up a digital multi-meter as a thermometer, you have to love geeks.&lt;/p&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>NHibernate - Custom User Types and Collections</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2008/1/10/3458642.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2008/1/10/3458642.html</guid>
    <pubDate>Thu, 10 Jan 2008 22:18:17 +0000</pubDate>
    <description>&lt;P&gt;NHibernate is an extremely powerful ORM but sometimes its quite difficult to find information on how to do certain things and why other things are the way they are. Recently I&#39;ve been working on generating NHibernate mapping files and a domain model with its classes using Visual Studio DSL tools. Below are some of the difficulties I came across and their solutions.&lt;/P&gt;
&lt;H4&gt;Mapping Enums to string database representations&lt;/H4&gt;
&lt;P&gt;Sometimes you have a database schema which requires you to provide things like &quot;M&quot; for male and &quot;F&quot; for female. It does not make sense to force your users to use a string for the gender. We simply want an enum. On the other hand we cannot simply put an integer in the database as it then requires the domain to have any context and is not self-describing. What we really want is enums in our domain and single char fields in our db.&lt;/P&gt;
&lt;P&gt;Obviously we need some custom mapping. This is where the IUserType interface from NHibernate comes into play. You can implement this type on a converter class and specify the converter type in the type attribute in your NHibernate mapping instead of the actual enum type. &lt;/P&gt;
&lt;P&gt;More Info at the following links:&lt;BR&gt;&lt;A href=&quot;http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/mapping.html#mapping-types-custom&quot; target=_blank&gt;NHibernate Documentation - Custom value types&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://codebetter.com/blogs/jeremy.miller/archive/2006/02/20/138732.aspx&quot; target=_blank&gt;Jeremy D. Miller&#39;s blog - Mapping Enumerations with NHibernate - and hooray for open source unit tests&lt;/A&gt;&lt;/P&gt;
&lt;H4&gt;Generic Identifiers and Generators&lt;/H4&gt;
&lt;P&gt;Sometimes you have a mix of identifier types in your database schema, we may have guids, ints and even strings (eh? strings? what were you thinking?). You could implement a generic identifier type which hides these three types as you never really care about the content of the identifier, only that the ORM can use it to query etc. The problem is how do we tell NHibernate to convert this type and how do we allow a generator to build the e.g. guid before sending to the database? &lt;/P&gt;
&lt;P&gt;First, your identifier type needs to implement a Identifier.Empty as default and allow it to always return default(T) as a non-instantiated version when you new-up an object in your domain. NHibernate will detect this equality and differentiate between new instances and instances which need to be updated instead of inserted.&lt;/P&gt;
&lt;P&gt;Secondly, you need to implement an IUserType as above for each schema type. This will be the type specified in your HBM file and will convert between db type and your all-encompassing Identifier type.&lt;/P&gt;
&lt;P&gt;Now we have a problem, the standard id generators in NHibernate no longer work as they want to generate the new id in the domain class before persisting, this will cause a type cast failure between the expected db type output from the generator and your custom identifier type. This time you need to create a custom identifier using a new class which implements &lt;STRONG&gt;NHibernate.Id.IPersistentIdentifierGenerator&lt;/STRONG&gt; and &lt;STRONG&gt;NHibernate.Id.IConfigurable&lt;/STRONG&gt;. This can detect the type of the real db schema and generate the correct type. You can also pass params to allow this to be configurable.&lt;/P&gt;
&lt;H4&gt;ISet&amp;lt;T&amp;gt; and IList&amp;lt;T&amp;gt; - sets, bags etc&lt;/H4&gt;
&lt;P&gt;NHibernate requires the usage of a set to allow the tracking of items added and removed on a collection. Unfortunately there is no concept of a set in the .Net Framework. The implementation of a set is provided in the Iesi.Collections dll which is shipped with NHibernate. 
&lt;P&gt;At runtime NHibernate tries to wrap the collection on a property which is defined in the HBM as a set with a collection which derives from &lt;em&gt;&lt;strong&gt;Iesi.Collections.Generic.ISet&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; it can use to track changes in the collection. This allows NHibernate to only issue updates to changed members rather than deleting and recreating the entire collection. Normally the collection &lt;em&gt;&lt;strong&gt;Iesi.Collections.Generic.HashedSet&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; is used in the domain class and this is then wrapped by NHibernate at runtime in a &lt;em&gt;&lt;strong&gt;NHibernate.Collection.Generic.PersistentGenericSet&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; which allows the tracking of changes. This wrapping happens when a transient collection is saved or when a persisted collection is returned from the database. 
&lt;P&gt;This means that we cannot have purely CLR types in our domain model because we need to have an implementation of the &lt;em&gt;&lt;strong&gt;ISet&lt;/strong&gt;&lt;/em&gt; for transient and persisted collections. To protect the domain model in the possible future event of replacing NHibernate as a persistence strategy (and cos we don&#39;t want persistence creeping into our domain), new collection types have to be created. Create your own interface e.g. &lt;em&gt;&lt;strong&gt;ISet&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt;. This &lt;em&gt;&lt;strong&gt;ISet&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; implements &lt;em&gt;&lt;strong&gt;IList&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;Iesi.Collections.Generic.ISet&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; allowing us to use standard &lt;em&gt;&lt;strong&gt;IList&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;ICollection&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; methods while keeping compatibility with NHibernate. The transient version of the set is called &lt;em&gt;&lt;strong&gt;e.g. Set&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt;, this also implements &lt;em&gt;&lt;strong&gt;IUserCollectionType&lt;/strong&gt;&lt;/em&gt; which defines the contract for NHibernate specific wrapping to persistent collection etc. The persisted version is called &lt;em&gt;&lt;strong&gt;e.g. PersistentSet&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; and this inherits from &lt;em&gt;&lt;strong&gt;NHibernate.Collection.Generic.PersistentGenericSet&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; to give NHibernate the change tracking it requires. 
&lt;P&gt;To use the new Sets in a domain, the following implementation is necessary. 
&lt;UL&gt;
&lt;LI&gt;The private fields and public properties for collections are defined as IList&amp;lt;T&amp;gt;. This allows standard interaction with the collection for domain consumption. 
&lt;LI&gt;The actual implementation when the domain needs to instantiate a collection is of type &lt;em&gt;&lt;strong&gt;MyNamespace.Set&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt; to allow NHibernate to cast properly at runtime. 
&lt;LI&gt;In the case of readonly collections, one of the two readonly collections is created from the constructor passing in the IList&amp;lt;T&amp;gt; as part of the get accessor of the property 
&lt;LI&gt;In the HBM mapping file the &lt;em&gt;&lt;strong&gt;collection-type&lt;/strong&gt;&lt;/em&gt; attribute is added to the set declaration with the generic type name of the transient collection e.g. &lt;STRONG&gt;collection-type=&quot;&lt;em&gt;&lt;em&gt;MyNamespace&lt;/em&gt;.Set`1[[&lt;em&gt;MyNamespace.MyDomain&lt;/em&gt;.MyDomainClass]]&quot;&lt;/em&gt;&lt;/STRONG&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Once this is done you should be able to save and retrieve your collections without issues. Notice that when you save a transient collection, it is automatically cast to your persistent collection using the Wrap method of IUserCollectionType and this type is also used when retrieving from the db. Nice!&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog/C">C#</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/PatternsPractices">Patterns &amp; Practices</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/NHibernate">NHibernate</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="ORM" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=ORM">ORM</ent:topic>
    
    <ent:topic ent:id="Data" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=Data">Data</ent:topic>
    
    <ent:topic ent:id="NHibernate" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=NHibernate">NHibernate</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Concatenating Delimited Strings with Generic Delegates</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/12/4/3391928.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/12/4/3391928.html</guid>
    <pubDate>Wed, 05 Dec 2007 00:00:25 +0000</pubDate>
    <description>&lt;p&gt;I knew this must be possible through generic delegates and eventually found &lt;a href=&quot;http://haacked.com/archive/2006/11/24/concatenating_delimited_strings_with_generic_delegates.aspx&quot; target=&quot;_blank&quot;&gt;this really useful post&lt;/a&gt; by Phil Haack which describes using a generic delegate Join method to concatenate strings. Saves a lot of ugly code if you are using T4 or A-N-Other templating language to produce code from a&amp;nbsp; Dsl or schema.&lt;/p&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Windows Live Writer</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/11/19/3364333.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/11/19/3364333.html</guid>
    <pubDate>Mon, 19 Nov 2007 21:06:02 +0000</pubDate>
    <description>&lt;p&gt;Finally the latest version of windows live writer seems to work with my blogging engine. Seems they have made some updates to allow blogware engine support for categories etc. Or maybe I just missed these on previous releases. Anyhoo, looks good.&lt;/p&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Visual Studio 2008 RTM&#39;d</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/11/19/3364215.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/11/19/3364215.html</guid>
    <pubDate>Mon, 19 Nov 2007 19:57:29 +0000</pubDate>
    <description>&lt;P&gt;....and commence downloading.&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx&quot; target=_blank&gt;http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://blogs.msdn.com/somasegar/archive/2007/11/19/visual-studio-2008-and-net-framework-3-5-shipped.aspx&quot; target=_blank&gt;http://blogs.msdn.com/somasegar/archive/2007/11/19/visual-studio-2008-and-net-framework-3-5-shipped.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/TeamFoundationServer">Team Foundation Server</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/VisualStudio">Visual Studio</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/VS2008">VS2008</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="VS2008" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=VS2008">VS2008</ent:topic>
    
    <ent:topic ent:id="tfs" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=tfs">tfs</ent:topic>
    
    <ent:topic ent:id="net" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=net">net</ent:topic>
    
    <ent:topic ent:id="msdn" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=msdn">msdn</ent:topic>
    
    <ent:topic ent:id="microsoft" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=microsoft">microsoft</ent:topic>
    
    <ent:topic ent:id="2008" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=2008">2008</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>TFS: Work Item Search</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/11/5/3336374.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/11/5/3336374.html</guid>
    <pubDate>Mon, 05 Nov 2007 22:54:16 +0000</pubDate>
    <description>&lt;P&gt;I&#39;ve been using this plugin now for the past few months. You would not believe the difference it makes.&lt;/P&gt;
&lt;P&gt;&lt;SPAN lang=EN&gt;&lt;EM&gt;This plugin puts a little search box right into Visual Studio to make it easy to find work items.&amp;nbsp; It is an addin for Team Foundation Client (Team Explorer) and is accessible from the Team menu when you&#39;re connected to a Team Foundation Server and is also avalible from a VS Toolbar.&amp;nbsp; You just type in some search text and it runs a work item query for you showing you results across the work item store.&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;IMG src=&quot;http://blog.peter.goodman.ms/blogImages/searchWorkItems.gif&quot;&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;&lt;SPAN lang=EN&gt;Source: &lt;A href=&quot;http://www.codeplex.com/searchworkitems/&quot; target=_blank&gt;Codeplex project &quot;Search Work Items&quot;&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/TeamFoundationServer">Team Foundation Server</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/VisualStudio">Visual Studio</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="work" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=work">work</ent:topic>
    
    <ent:topic ent:id="items" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=items">items</ent:topic>
    
    <ent:topic ent:id="visual" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=visual">visual</ent:topic>
    
    <ent:topic ent:id="tfs" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=tfs">tfs</ent:topic>
    
    <ent:topic ent:id="studio" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=studio">studio</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>HeadMelter of the week - Self-Constrained Generic Base Classes</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/11/5/3334622.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/11/5/3334622.html</guid>
    <pubDate>Mon, 05 Nov 2007 02:55:06 +0000</pubDate>
    <description>&lt;P&gt;Melted my own brain for a few hours with this one today. Essentially a self-constrained generic base class looks like the following.&lt;/P&gt;
&lt;DIV style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;class&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;MyEntity&lt;/SPAN&gt; : &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;EntityBase&lt;/SPAN&gt;&amp;lt;&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;MyEntity&lt;/SPAN&gt;&amp;gt; {&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;This allows me to put some generic implementations in a base class for code that I would simply duplicate otherwise. For example:&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;class&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;EntityBase&lt;/SPAN&gt;&amp;lt;T&amp;gt; : &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;IEquatable&lt;/SPAN&gt;&amp;lt;T&amp;gt;, &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;IComparable&lt;/SPAN&gt;&amp;lt;T&amp;gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt; CompareTo(T other) {&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: green&quot;&gt;// Insert compare code here&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;bool&lt;/SPAN&gt; Equals(T other) {&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: green&quot;&gt;// Insert Equality Code Here&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;Enjoy!&lt;/P&gt;&lt;!--EndFragment--&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/HeadMelter">Head Melter</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="generics" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=generics">generics</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>WCF: Custom Collections with Extra Payload</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/10/31/3326121.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/10/31/3326121.html</guid>
    <pubDate>Wed, 31 Oct 2007 23:53:36 +0000</pubDate>
    <description>&lt;P&gt;I came across a pretty annoying problem to solve in WCF today. Suppose you have a custom collection of items you wish to use in a WCF contract but it also has extra properties that you have added, for example change tracking.&lt;/P&gt;
&lt;P&gt;
&lt;DIV style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;Serializable&lt;/SPAN&gt;]&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;class&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;DtoCollection&lt;/SPAN&gt;&amp;lt;T&amp;gt; : &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;List&lt;/SPAN&gt;&amp;lt;T&amp;gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;private&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;List&lt;/SPAN&gt;&amp;lt;T&amp;gt; addedItems;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;private&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;List&lt;/SPAN&gt;&amp;lt;T&amp;gt; removedItems;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It will serialize the collection fine but your added properties and fields will not appear. The&amp;nbsp;[CollectionDataContract] attribute will not help you.&amp;nbsp;If you look at &lt;A href=&quot;http://blogs.msdn.com/sowmy/archive/2006/02/22/536747.aspx&quot; target=&#39;_blank&quot;&#39;&gt;this really great post&lt;/A&gt; from Sowmy Srinivasan&#39;s blog you can see the order of preference for WCF serialization markup. So in the case above you can implement IXmlSerializable to customize the serialization and deserialization of your custom collection. I originally found this solution on David Foderick&#39;s blog - OnMaterialize(), but the link seems to be down at the moment. I&#39;ll not repost the code here but google cache should still have it at &lt;A href=&quot;http://72.14.253.104/search?q=cache:qTfNNcNbjI0J:netknowledgenow.com:81/CS/blogs/onmaterialize/archive/2007/01/18/Control-WCF-Serialization-of-Collections-with-IXmlSerializable.aspx+WCF+%22custom+collections%22&amp;amp;hl=en&amp;amp;ct=clnk&amp;amp;cd=3&quot; target=&#39;_blank&quot;&#39;&gt;this link&lt;/A&gt;.&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/WCF">WCF</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="properties" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=properties">properties</ent:topic>
    
    <ent:topic ent:id="wcf" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=wcf">wcf</ent:topic>
    
    <ent:topic ent:id="collections" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=collections">collections</ent:topic>
    
    <ent:topic ent:id="payload" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=payload">payload</ent:topic>
    
    <ent:topic ent:id="custom" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=custom">custom</ent:topic>
    
    <ent:topic ent:id="microsoft" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=microsoft">microsoft</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Useful macro for creating Visual Studio 2005 dependent (nested) items</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/9/13/3226448.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/9/13/3226448.html</guid>
    <pubDate>Thu, 13 Sep 2007 10:14:46 +0100</pubDate>
    <description>Check out this useful macro for visual studio 2005 dependent (nested) items. Useful for breaking up large classes into partials when refactoring doesn&#39;t make sense. I found it useful when you want, for example one integration test class per implementation class and the test class is getting a bit large.&lt;br /&gt;&lt;br /&gt; &lt;img height=&quot;211&quot; style=&quot;margin: 5px&quot; width=&quot;307&quot; alt=&quot;&quot; src=&quot;http://blog.peter.goodman.ms/dependentitems.gif&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Source: &lt;a href=&quot;http://www.delarou.net/weblog/PermaLink,guid,a81a2d9d-02de-4fe1-ad8d-ee2fee97cf20.aspx&quot; target=&quot;_blank&quot;&gt;http://www.delarou.net/weblog/PermaLink,guid,a81a2d9d-02de-4fe1-ad8d-ee2fee97cf20.aspx&lt;/a&gt;
&lt;blockquote&gt;
    &lt;p&gt;Visual Studio .NET Macro for nesting project items&lt;br /&gt;&lt;br /&gt;This macro enables you to nest project items inside Visual Studio .NET. Until now, there is no easy way to nest project items through the Visual Studio IDE, you can only do it by manipulating the project (.csproj or .vbproj) file and adding the DependentUpon element.&lt;br /&gt;&lt;br /&gt;Inside the IStaySharp.vsmacros file there is a macro called &#39;Create Dependency&#39; which allows you to nest two selected items. I have even created a video (672,18 KB) to illustrate how to configure and use the macro.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/VisualStudio">Visual Studio</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Visual Studio Unit Test and the evil vsmdi</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/9/13/3226341.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/9/13/3226341.html</guid>
    <pubDate>Thu, 13 Sep 2007 09:45:20 +0100</pubDate>
    <description>&lt;p align=&quot;left&quot;&gt;&lt;span&gt;During a recent project we found a recurring problem where the test view of the unit (&amp;amp; integration) test projects would not load and we could not run tests. This was typically seen by the Test View load progress bar sitting at around 99%. This just adds to the list of &amp;quot;features&amp;quot; of VSTS Unit Test that make life oh so irritating&lt;br /&gt;&lt;br /&gt;It is due to the corruption of the *.vsmdi files in the visual studio solution which is caused by auto-merging the content of the file or having the test view property window open when getting the latest version.&lt;br /&gt;&lt;br /&gt; The problem is outlined in this blog post (also note the comments for possible workarounds)&lt;br /&gt;&lt;br /&gt;Source: &lt;a href=&quot;http://kjellsj.blogspot.com/2006/04/vsmdi-file-weak-spot-of-vsts-test.html&quot; target=&quot;_blank&quot;&gt;http://kjellsj.blogspot.com/2006/04/vsmdi-file-weak-spot-of-vsts-test.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/VisualStudio">Visual Studio</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>I am 70% Optimus Prime....oh yes</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/8/17/3163737.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/8/17/3163737.html</guid>
    <pubDate>Fri, 17 Aug 2007 06:53:23 +0100</pubDate>
    <description>&lt;p&gt;&lt;a href=&quot;http://www.funflip.com/&quot; style=&quot;color:white;text-decoration:none;font:normal normal bold 9px/normal Tahoma;padding:70px 0px 0px 21px;text-align:left;display:block;width:268px;height:73px;background:url(&#39;http://www.funflip.com/_images/quiz/transformers/btns/289x143_optimus.jpg&#39;) no-repeat;&quot;&gt;I AM&lt;br /&gt;&lt;span style=&quot;font-size:24px;&quot;&gt;70%&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size:12px;line-height:20px;&quot;&gt;OPTIMUS PRIME&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;http://www.funflip.com/&quot;&gt;Take the Transformers Quiz&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;&lt;i&gt;Optimus Prime is the heroic leader of the Autobots. He is the personification of courage, strength, and integrity. His personal motto is that “Freedom is the right of all sentient beings.”
&lt;br/&gt;&lt;br/&gt;
Like Optimus Prime, you are good by nature. But beware because mischievous thoughts sometimes tempt you. You are inspiring, confident, and a natural leader. The Autobots have chosen well. In addition, you enjoy being one step ahead of your friends as far as trends and technology. 
&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Hmmmm.....Not sure I filled that one out right.&lt;/p&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Visual Studio 2008 Beta 2 Released</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/7/27/3122461.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/7/27/3122461.html</guid>
    <pubDate>Fri, 27 Jul 2007 12:29:17 +0100</pubDate>
    <description>&lt;P&gt;First impressions are really good. The install went fine on a dual core laptop in parallel&amp;nbsp;with VS 2005 already installed. The first thing I notice is that the performance is good (no worse than 2005)&amp;nbsp;and the XAML designer is much improved over the cider CTPs.&lt;/P&gt;
&lt;P&gt;Had a quick play with LINQ on a generic list and the intellisense support seems spot on.&lt;/P&gt;
&lt;P&gt;Must sleep now.&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/VS2008">VS2008</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/WPF">WPF</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="VS2008" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=VS2008">VS2008</ent:topic>
    
    <ent:topic ent:id="2008" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=2008">2008</ent:topic>
    
    <ent:topic ent:id="visual" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=visual">visual</ent:topic>
    
    <ent:topic ent:id="studio" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=studio">studio</ent:topic>
    
    <ent:topic ent:id="wpf" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=wpf">wpf</ent:topic>
    
    <ent:topic ent:id="net" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=net">net</ent:topic>
    
    <ent:topic ent:id="microsoft" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=microsoft">microsoft</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>WPF Routed Commands</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/7/22/3110077.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/7/22/3110077.html</guid>
    <pubDate>Sun, 22 Jul 2007 04:51:58 +0100</pubDate>
    <description>&lt;P&gt;Working in WPF, it&#39;s not very long before you come across Routed Commands. The idea of allowing events to bubble and tunnel up and down the UI tree has always been around but the ICommand, RoutedCommand and RoutedUICommand features of WPF have made it a lot easier.&lt;/P&gt;
&lt;P&gt;Here are some useful resources for finding out more if you are stuck.&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wpf_commandpattern.mspx&quot; target=_blank&gt;Jelle Druyts Article &quot;The Command Pattern in Windows Presentation Foundation&quot;&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://www.samspublishing.com/articles/article.asp?p=688529&amp;amp;seqNum=4&amp;amp;rl=1&quot; target=_blank&gt;Adam Nathan&#39;s sample chapter on &quot;Important New Concepts in WPF&amp;gt;Commands&quot;&lt;/A&gt;&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/WPF">WPF</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="wpf" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=wpf">wpf</ent:topic>
    
    <ent:topic ent:id="net" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=net">net</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Re-Throwing Exceptions</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/4/27/2908541.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/4/27/2908541.html</guid>
    <pubDate>Fri, 27 Apr 2007 10:05:03 +0100</pubDate>
    <description>&lt;P&gt;I was going over some old code recently to try to resolve a production issue. The log of the stack trace was not providing enough information on the thrown exception and it reminded me of a good tip for throwing and specifically re-throwing exceptions.&lt;/P&gt;
&lt;P&gt;Consider the following code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=codeBlock&gt;
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;try&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;{&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;&amp;nbsp; int&lt;/SPAN&gt; x = 0;&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;&amp;nbsp; int&lt;/SPAN&gt; y =&amp;nbsp;5 / x;&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;}&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;catch&lt;/SPAN&gt; (&lt;SPAN style=&quot;COLOR: teal&quot;&gt;Exception&lt;/SPAN&gt; ex)&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;{&lt;BR&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;throw&lt;/SPAN&gt; ex;&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;} &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;The stack trace at the time that the DivisionByZero is thrown will be different from the rethrow in the catch block. This is because the &quot;throw ex&quot; will create a new exception and throw it. Instead, you should try to use the code below.&lt;/P&gt;
&lt;DIV class=codeBlock&gt;
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;try&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;{&lt;BR&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt; x = 0;&lt;BR&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt; y = x / 5;&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;}&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;catch&lt;/SPAN&gt; (&lt;SPAN style=&quot;COLOR: teal&quot;&gt;Exception&lt;/SPAN&gt; ex)&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;{&lt;BR&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;throw&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;&quot;&gt;} &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;In this case the original exception will be thrown with the correct stack trace. Of course wrapping the exception before it is thrown will also preserve the stack trace.&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Creating a custom AJAX control - DateTimePicker</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/4/19/2891939.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/4/19/2891939.html</guid>
    <pubDate>Thu, 19 Apr 2007 23:11:27 +0100</pubDate>
    <description>&lt;P&gt;Lately I decided to see how easy was to create AJAX custom controls specifically using the included javascript libraries. I thought it might be useful to try to use the included javascript libraries to enable client side access to the selected value from a custom control.&lt;/P&gt;
&lt;P&gt;The example I will use is a date time picker which uses the calendar extender from the ajax control toolkit for the date and a simple drop down for the time. Much like outlook, the date is pickable from a textbox and the time in a list of 15 minute intervals. The goal is to allow the client and server side code to have access to the same DateTime type without having to do any work parsing the strings in the HTML elements on the page.&lt;/P&gt;
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;Usage Pattern&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The control on the client page looks like the following.&lt;/P&gt;
&lt;DIV class=codeBlock&gt;
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: #0000ff; FONT-FAMILY: Courier New&quot;&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: Courier New&quot;&gt;pgc&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: #0000ff; FONT-FAMILY: Courier New&quot;&gt;:&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: Courier New&quot;&gt;DateTimePicker&lt;/SPAN&gt; &lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: Courier New&quot;&gt;&lt;SPAN style=&quot;COLOR: #ff0000&quot;&gt;ID&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;=&quot;dtpMyDate&quot;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #ff0000&quot;&gt;runat&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;=&quot;server&quot;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #ff0000&quot;&gt;TimeInterval&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;=&quot;15&quot;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #ff0000&quot;&gt;Format&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;=&quot;dd/MM/yyyy&quot;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; COLOR: #0000ff&quot;&gt;&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;The client script needed to get the value from the control is as follows&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: Courier New&quot;&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;function&lt;/SPAN&gt; displayClientDate()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert( $find( &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;dtpMyDate&quot;&lt;/SPAN&gt; ).get_selectedDateTime().format(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;dddd dd MMMM yyyy HH:mm&quot;&lt;/SPAN&gt;) );&lt;BR&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;P&gt;....and that&#39;s it! The screenshot below shows the output.&lt;/P&gt;
&lt;P&gt;&lt;IMG style=&quot;MARGIN: 5px&quot; alt=&quot;&quot; src=&quot;http://blog.peter.goodman.ms/blogImages/AJAXDateTimePicker/ClientScreenshot.gif&quot;&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;The Implementation&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;To implement the custom control described above we have to implement the &lt;STRONG&gt;IScriptControl&lt;/STRONG&gt; interface from the AJAX Extensions as well as the standard &lt;STRONG&gt;CompositeControl&lt;/STRONG&gt;. This requires that we implement a few methods on our control above and beyond the standard control methods, these are the &lt;STRONG&gt;GetScriptReferences&lt;/STRONG&gt; and the &lt;STRONG&gt;GetScriptDescriptors&lt;/STRONG&gt; methods.&lt;/P&gt;
&lt;P&gt;GetScriptReferences allows us to add in the client script files to the output sent to the user. This tells the ScriptManager on the page to send down our client script file.&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: Courier New&quot;&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;protected&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;virtual&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;ScriptReference&lt;/SPAN&gt;&amp;gt; GetScriptReferences()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;ScriptReference&lt;/SPAN&gt; ProtoReference = &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;ScriptReference&lt;/SPAN&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProtoReference.Path = Page.ClientScript.GetWebResourceUrl(&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/SPAN&gt;.GetType(), &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;PGCodeWorks.AjaxControls.DateTimePicker.DateTimePicker.js&quot;&lt;/SPAN&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;ScriptReference&lt;/SPAN&gt;[] { ProtoReference };&lt;BR&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;P&gt;GetScriptDescriptors allows us to tell the control which variables to pass through to the client script. These variables are set on the client when the page is sent down and allow us to use the same javascript object to represent multiple controls on one page with different instances and properties.&lt;/P&gt;
&lt;DIV class=codeBlock&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: Courier New&quot;&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;protected&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;virtual&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;ScriptDescriptor&lt;/SPAN&gt;&amp;gt; GetScriptDescriptors()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;ScriptBehaviorDescriptor&lt;/SPAN&gt; descriptor = &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;ScriptBehaviorDescriptor&lt;/SPAN&gt;(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;PGCodeWorks.DateTimePicker&quot;&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/SPAN&gt;.ClientID);&lt;/SPAN&gt;&lt;/SPAN&gt; 
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: Courier New&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; descriptor.AddProperty(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;textBoxClientID&quot;&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/SPAN&gt;.txtDate.ClientID);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; descriptor.AddProperty(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;dropDownClientID&quot;&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/SPAN&gt;.ddlTime.ClientID);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; descriptor.AddProperty(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;selectedDateTime&quot;&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/SPAN&gt;._selectedDateTime);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; descriptor.AddProperty(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;dateFormat&quot;&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/SPAN&gt;.ceCalExtender.Format);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; descriptor.AddProperty(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;timeFormat&quot;&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/SPAN&gt;._timeFormat);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; descriptor.AddProperty(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;timeInterval&quot;&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/SPAN&gt;._timeInterval);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: Courier New&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;ScriptDescriptor&lt;/SPAN&gt;[] { descriptor };&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: Courier New&quot;&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;Then, after implementing the rest of our control we need to add the client script .js file to the solution and mark it as an embedded resource. To make the file embed itself within the DLL select the file in solution explorer and change the &quot;Build Action&quot; in the properties window. Also you must add a reference to it in the AssemblyInfo.cs file.&lt;/P&gt;
&lt;P&gt;The actual file follows the object-oriented javascript approach to allow properties etc on the &lt;STRONG&gt;prototype&lt;/STRONG&gt; model. Below is the structure of the .js file (some code has been cut-out to save space).&lt;/P&gt;
&lt;DIV class=codeBlock&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: green; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;// Register the namespace for the control&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;Type.registerNamespace(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;PGCodeWorks&#39;&lt;/SPAN&gt;);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: green; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;//&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: green; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;// Define the control properties&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: green; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;//&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;PGCodeWorks.DateTimePicker = &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;(element) {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; PGCodeWorks.DateTimePicker.initializeBase(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;, [element]);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;// Set properties to null&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._textBoxClientID = &lt;SPAN style=&quot;COLOR: blue&quot;&gt;null&lt;/SPAN&gt;;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._dropDownClientID = &lt;SPAN style=&quot;COLOR: blue&quot;&gt;null&lt;/SPAN&gt;;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: green; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // *** Code Truncated ***&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: green; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;//&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: green; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;//&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;PGCodeWorks.DateTimePicker.prototype = {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; initialize : &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;() {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; PGCodeWorks.DateTimePicker.callBaseMethod(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;initialize&#39;&lt;/SPAN&gt;);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._onDateTimeChangeHandler = Function.createDelegate(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._onDateTimeChange);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._onDateChangeHandler = Function.createDelegate(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._onDateChange);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._onTimeChangeHandler = Function.createDelegate(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._onTimeChange);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; $addHandler($get(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._textBoxClientID), &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;change&#39;&lt;/SPAN&gt; , &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._onDateChangeHandler );&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; $addHandler($get(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._dropDownClientID), &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;change&#39;&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._onTimeChangeHandler);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; },&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; dispose : &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;() {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; $removeHandler($get(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._textBoxClientID), &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;change&#39;&lt;/SPAN&gt; , &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._onDateChangeHandler );&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; $removeHandler($get(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._dropDownClientID), &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;change&#39;&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._onTimeChangeHandler);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; PGCodeWorks.DateTimePicker.callBaseMethod(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;dispose&#39;&lt;/SPAN&gt;);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; },&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;//&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;// Custom Methods&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;//&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; setDateTimeValues : &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;() {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;// Get Values&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;var&lt;/SPAN&gt; strDate = $get(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._textBoxClientID).value;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;var&lt;/SPAN&gt; strTime = $get(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._dropDownClientID).value;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;var&lt;/SPAN&gt; strTimeFormat = &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._timeFormat;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;if&lt;/SPAN&gt;( strDate != &lt;SPAN style=&quot;COLOR: blue&quot;&gt;null&lt;/SPAN&gt; &amp;amp;&amp;amp; strDate != &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;&quot;&lt;/SPAN&gt; )&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;{&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;if&lt;/SPAN&gt;( strTime == &lt;SPAN style=&quot;COLOR: blue&quot;&gt;null&lt;/SPAN&gt; || strTime == &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;&quot;&lt;/SPAN&gt; )&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&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;&lt;/SPAN&gt; strTime = &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;00:00&quot;&lt;/SPAN&gt;;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&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;&lt;/SPAN&gt; strTimeFormat = &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&quot;HH:mm&quot;&lt;/SPAN&gt;;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;var&lt;/SPAN&gt; totalDateTimeFormat = &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._dateFormat + &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39; &#39;&lt;/SPAN&gt; + strTimeFormat;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;var&lt;/SPAN&gt; newDate = Date.parseInvariant(&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt; strDate + &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39; &#39;&lt;/SPAN&gt; + strTime, totalDateTimeFormat&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt; );&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;.set_selectedDateTime( newDate );&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;//alert( this._selectedDateTime );&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; },&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;//&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;// Event delegates&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;//&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; _onDateTimeChange : &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;(e) {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;.setDateTimeValues();&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; },&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; _onDateChange : &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;(e) {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;.setDateTimeValues();&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; },&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; _onTimeChange : &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;(e) {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;.setDateTimeValues();&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; },&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;//&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;// Control properties&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: green&quot;&gt;//&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; get_textBoxClientID : &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;() {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;return&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._textBoxClientID;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; },&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; set_textBoxClientID : &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;(value) {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;if&lt;/SPAN&gt; (&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._textBoxClientID !== value) {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._textBoxClientID = value;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;.raisePropertyChanged(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;textBoxClientID&#39;&lt;/SPAN&gt;);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; },&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: green; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // *** Code Truncated ***&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; get_timeInterval : &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;() {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;return&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._timeInterval;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; },&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; set_timeInterval : &lt;SPAN style=&quot;COLOR: blue&quot;&gt;function&lt;/SPAN&gt;(value) {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;if&lt;/SPAN&gt;(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._timeInterval != value) {&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;._timeInterval = value;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;.raisePropertyChanged(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;timeInterval&#39;&lt;/SPAN&gt;);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;} &lt;SPAN style=&quot;COLOR: green&quot;&gt;// end of prototype declaration&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: green; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;// Optional descriptor for JSON serialization.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;PGCodeWorks.DateTimePicker.descriptor = {&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; properties: [&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; {name: &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;textBoxClientID&#39;&lt;/SPAN&gt;, type: String},&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN style=&quot;mso-spacerun: yes&quot;&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;&lt;/SPAN&gt;{name: &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;dropDownClientID&#39;&lt;/SPAN&gt;, type: String},&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; {name: &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;selectedDateTime&#39;&lt;/SPAN&gt;, type: Date},&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; {name: &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;dateFormat&#39;&lt;/SPAN&gt;, type: String},&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; {name: &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;timeFormat&#39;&lt;/SPAN&gt;, type: String},&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt; {name: &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;timeInterval&#39;&lt;/SPAN&gt;, type: Number} ]&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: green; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;// Register the class as a type that inherits from Sys.UI.Control.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;PGCodeWorks.DateTimePicker.registerClass(&lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;PGCodeWorks.DateTimePicker&#39;&lt;/SPAN&gt;, Sys.UI.Control);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt; COLOR: blue; LINE-HEIGHT: 115%; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;if&lt;/SPAN&gt; &lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;LINE-HEIGHT: 115%; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;typeof&lt;/SPAN&gt;(Sys) !== &lt;SPAN style=&quot;COLOR: #a31515&quot;&gt;&#39;undefined&#39;&lt;/SPAN&gt;) Sys.Application.notifyScriptLoaded();&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;The above code has allowed the client to be able to call the javascript object representing the overall control and retrieve it&#39;s selectedDateTime property.&lt;/P&gt;
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;How Does it Work?&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The libraries provided with the ASP.Net AJAX Extensions allow us to create composite controls which we can deal with as a single object on the client using object-oriented javascript. Using the patterns and examples given on the &lt;A href=&quot;http://ajax.asp.net/&quot; target=_blank&gt;AJAX web site&lt;/A&gt; we can recreate the types of functionality in the AjaxControlToolkit and start building rich client side experiences.&lt;/P&gt;
&lt;P&gt;In this example we have simply provided a public method on our object which grabs the values from the controls on the page and uses the type extensions in AJAX to provide a similar experience in client side development as we experience on the server side. To extend this example I have created a RequiredFieldValidator and a CompareValidator which will work with the above control and I hope to post this when it has been cleaned up.&lt;/P&gt;
&lt;P&gt;The full code and solution for this example is &lt;A href=&quot;http://blog.peter.goodman.ms/CodeSamples/AJAXDateTimePicker.zip&quot;&gt;available here&lt;/A&gt;&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/AJAX">AJAX</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/ASPNet">ASP.Net</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/VisualStudio">Visual Studio</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="custom" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=custom">custom</ent:topic>
    
    <ent:topic ent:id="IScriptControl" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=IScriptControl">IScriptControl</ent:topic>
    
    <ent:topic ent:id="control" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=control">control</ent:topic>
    
    <ent:topic ent:id="asp" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=asp">asp</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Microsoft announces Silverlight</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/4/17/2886092.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/4/17/2886092.html</guid>
    <pubDate>Tue, 17 Apr 2007 08:42:25 +0100</pubDate>
    <description>&lt;P&gt;&lt;IMG src=&quot;http://blog.peter.goodman.ms/blogImages/silverlight.gif&quot; align=right&gt;Microsoft have just announced Silverlight, the new branding for what was previously known as WPF/E.&amp;nbsp;They&#39;ve also provided a lot more&amp;nbsp;details about the specifications and their future plans.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Silverlight is the new Adobe (Macromedia) Flash competitor from Microsoft, it is based on the new Windows Presentation Foundation graphics engine found in Vista. It turns out that it will be very tightly integrated with .Net even to the point of shipping with its own cut down runtime.&lt;/P&gt;
&lt;P&gt;The download should be around 2MB though initially it will not contain 3D capabilities. IE, Firefox and Safari will be supported at launch.&lt;/P&gt;
&lt;P&gt;Silverlight website: &lt;A href=&quot;http://www.microsoft.com/silverlight/&quot; target=_blank&gt;http://www.microsoft.com/silverlight/&lt;/A&gt;&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/ASPNet">ASP.Net</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/WebSilverlight">Web Silverlight</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="silverlight" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=silverlight">silverlight</ent:topic>
    
    <ent:topic ent:id="web" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=web">web</ent:topic>
    
    <ent:topic ent:id="flash" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=flash">flash</ent:topic>
    
    <ent:topic ent:id="microsoft" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=microsoft">microsoft</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Response.Redirect and the ThreadAbortException</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/4/16/2884606.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/4/16/2884606.html</guid>
    <pubDate>Mon, 16 Apr 2007 18:37:10 +0100</pubDate>
    <description>&lt;P&gt;A colleague came across a problem recently where performance counters were showing a high exception to request ratio. In actual fact there were at 4 exceptions for every 1 request, that&#39;s 400% compared to the desired 5%. These seemed to be getting handled at some stage or another as there were no HttpUnhandledExceptions getting thrown at the UI.&lt;/P&gt;
&lt;P&gt;It turns out that Response.Redirect and Server.Transfer&amp;nbsp;will throw a ThreadAbortException everytime the single parameter overload is called.&lt;/P&gt;
&lt;P&gt;i.e. &lt;FONT face=&quot;Courier New,Courier,mono&quot;&gt;Response.Redirect( &lt;FONT color=#000066&gt;string &lt;/FONT&gt;url )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The problem is that Response.Redirect will call a Response.End internally to stop code executing after the statement. This in turn throws our mystery exceptions. To work around this use the overloaded version which allows code after the statement to be executed and try not to treat the statement as the end of a code block.&lt;/P&gt;
&lt;P&gt;i.e. pass &quot;false&quot; to second param of &lt;/P&gt;
&lt;P&gt;&lt;FONT face=&quot;Courier New,Courier,mono&quot;&gt;Response.Redirect( &lt;FONT color=#000066&gt;string &lt;/FONT&gt;url, &lt;FONT color=#000066&gt;bool &lt;/FONT&gt;endResponse )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;There is a lot of fair argument to say that this shouldn&#39;t cause an exception. So if you see unexplained high exception counters, have a look at your Response.Redirects and Server.Transfers.&lt;/P&gt;
&lt;P&gt;MSDN Article: &lt;A href=&quot;http://support.microsoft.com/kb/312629/EN-US/&quot; target=_blank&gt;PRB: ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;P.S. Thanks to Josh Twist at MS for pointing this one out. ;)&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/ASPNet">ASP.Net</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/PatternsPractices">Patterns &amp; Practices</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="redirect" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=redirect">redirect</ent:topic>
    
    <ent:topic ent:id="threadabortexception" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=threadabortexception">threadabortexception</ent:topic>
    
    <ent:topic ent:id="asp" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=asp">asp</ent:topic>
    
    <ent:topic ent:id="net" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=net">net</ent:topic>
    
    <ent:topic ent:id="server" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=server">server</ent:topic>
    
    <ent:topic ent:id="transfer" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=transfer">transfer</ent:topic>
    
    <ent:topic ent:id="response" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=response">response</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Enterprise Library 3.0 Released - with some really nice features</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/4/10/2869350.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/4/10/2869350.html</guid>
    <pubDate>Tue, 10 Apr 2007 09:43:34 +0100</pubDate>
    <description>&lt;P&gt;The Microsoft Patterns and Practices team have just released Enterprise Library 3.0 - April 2007. This is the full RTM version of EntLib with some really neat new&amp;nbsp;features:&lt;/P&gt;
&lt;P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Validation Application Block.&lt;/STRONG&gt; Allows you to centrally define validation rules using configuration or attributes, and easily validate data from anywhere in your application, including deep integration with Windows Forms, ASP.NET and WCF. &lt;/LI&gt;&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;&lt;STRONG&gt;Policy Injection Application Block.&lt;/STRONG&gt; Provides a powerful approach for separating cross-cutting concerns from business logic using declarative policies that are attached at runtime to methods on your objects. &lt;/LI&gt;&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;&lt;STRONG&gt;Application Block Software Factory.&lt;/STRONG&gt; Dramatically simplifies the process of building application blocks and providers through the magic of guidance automation. &lt;/LI&gt;&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;&lt;STRONG&gt;Visual Studio-integrated Configuration Editor.&lt;/STRONG&gt; Edit Enterprise Library configuration files directly within Visual Studio. &lt;/LI&gt;&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;&lt;STRONG&gt;Environmental Overrides.&lt;/STRONG&gt; Use the configuration tool to specify configuration settings that are common or different across multiple environments, and merge this information into configuration files to be deployed with your applications. &lt;/LI&gt;&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;&lt;STRONG&gt;WCF Integration.&lt;/STRONG&gt; Easily integrate the Logging, Exception Handling and Validation Application Blocks into service interfaces built using Windows Communication Foundation. &lt;/LI&gt;&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;&lt;STRONG&gt;Pre-compiled, strong-named binaries.&lt;/STRONG&gt; No need to compile and strong name the code unless you want to manage and evolve the code yourself.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I had a play with the Visual Studio integration and Environmental Overrides functionality over the weekend (yeh, I know) - I&#39;m glad they eventually added this stuff in. Olaf Conijn was building these as add ons before he was assimilated.&lt;/P&gt;
&lt;P&gt;Source: &lt;A href=&quot;http://blogs.msdn.com/tomholl/archive/2007/04/05/just-released-enterprise-library-3-0-april-2007.aspx&quot; target=_blank&gt;Tom Hollanders Blog&lt;/A&gt;&lt;/P&gt;&lt;STRONG&gt;Visual Studio Integration Screenshots&lt;/STRONG&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG alt=&quot;Web.Config context menu&quot; src=&quot;http://blog.peter.goodman.ms/blogImages/webconfigMenu.gif&quot;&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG alt=&quot;Web.Config editing UI&quot; src=&quot;http://blog.peter.goodman.ms/blogImages/editwebconfigentlib.gif&quot;&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/PatternsPractices">Patterns &amp; Practices</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/VisualStudio">Visual Studio</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="patterns" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=patterns">patterns</ent:topic>
    
    <ent:topic ent:id="practices" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=practices">practices</ent:topic>
    
    <ent:topic ent:id="enterprise" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=enterprise">enterprise</ent:topic>
    
    <ent:topic ent:id="library" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=library">library</ent:topic>
    
    <ent:topic ent:id="visual" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=visual">visual</ent:topic>
    
    <ent:topic ent:id="studio" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=studio">studio</ent:topic>
    
    <ent:topic ent:id="msdn" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=msdn">msdn</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>Expression Web now available on MSDN subscriptions</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/4/6/2862862.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/4/6/2862862.html</guid>
    <pubDate>Fri, 06 Apr 2007 17:21:25 +0100</pubDate>
    <description>&lt;P&gt;Microsoft have finally listened to all the developers (who are also designers) rightfully throwing our toys out of our prams and included Expression Web Designer and possibly some other Expression&amp;nbsp;badged products in the MSDN subscription downloads.&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style=&quot;MARGIN-RIGHT: 0px&quot;&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&quot;...we received a lot of questions about why we did not include some of these products, particularly Expression Web, within customers’ MSDN subscriptions.........Based on this feedback, I am pleased to say that we will be making Expression Web available starting today to all MSDN Premium subscribers&quot;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This is really good news. The presumption that developers never need to use the latest CSS and&amp;nbsp;HTML tools as they don&#39;t do design is ridiculous. Those of us building functional&amp;nbsp;internal web solutions rarely get the option of enlisting the services of a dedicated designer, leaving the lonely developer to struggle with whatever tools are available to accomplish design.&lt;/P&gt;
&lt;P&gt;Source: &lt;A href=&quot;http://blogs.msdn.com/somasegar/archive/2007/04/03/listening-to-your-feedback-expression-and-msdn.aspx&quot; target=_blank&gt;Somasegar&#39;s blog&lt;/A&gt;&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/VisualStudio">Visual Studio</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="expression" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=expression">expression</ent:topic>
    
    <ent:topic ent:id="msdn" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=msdn">msdn</ent:topic>
    
    <ent:topic ent:id="subscriptions" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=subscriptions">subscriptions</ent:topic>
    
    <ent:topic ent:id="visual" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=visual">visual</ent:topic>
    
    <ent:topic ent:id="studio" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=studio">studio</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>TeamPlain for TFS now available free</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/4/6/2862600.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/4/6/2862600.html</guid>
    <pubDate>Fri, 06 Apr 2007 15:27:36 +0100</pubDate>
    <description>&lt;P&gt;Due to the acquisition of DevBiz by Microsoft, their really cool TeamPlain web user interface for everything Team Foundation Server, is now available as a free download.&lt;/P&gt;&lt;P&lt;A target=&quot;_blank&quot; href=&quot;http://www.devbiz.com/teamplain/webaccess/default.aspx&quot;&gt;&lt;IMG src=&quot;http://blog.peter.goodman.ms/blogImages/TeamPlainforTFSnowavailablefree_CE55/newworkitem8.gif&quot;&gt;&lt;/A&gt; 
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Great News.&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.devbiz.com/teamplain/webaccess/default.aspx&quot; target=_blank&gt;TeamPlain Web Site&lt;/A&gt;&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    <category domain="http://blog.peter.goodman.ms/blog/TeamFoundationServer">Team Foundation Server</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="teamplain" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=teamplain">teamplain</ent:topic>
    
    <ent:topic ent:id="tfs" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=tfs">tfs</ent:topic>
    
    <ent:topic ent:id="visual" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=visual">visual</ent:topic>
    
    <ent:topic ent:id="studio" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=studio">studio</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Pete</dc:creator>
    <title>My Blog</title>
    <link>http://blog.peter.goodman.ms/blog/_archives/2007/4/5/2860781.html</link>
    <guid>http://blog.peter.goodman.ms/blog/_archives/2007/4/5/2860781.html</guid>
    <pubDate>Thu, 05 Apr 2007 19:18:36 +0100</pubDate>
    <description>&lt;P&gt;I&#39;m starting this blog to keep track of technical work. &lt;/P&gt;
&lt;P&gt;My name is Peter Goodman, currently living in Edinburgh and working as a .Net developer for a major financial organistion, but soon to be living in New Zealand and hopefully doing something similar.&lt;/P&gt;</description>
    
    <category domain="http://blog.peter.goodman.ms/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="introduction" ent:href="http://blog.peter.goodman.ms/blog/cmd=search_keyword/k=introduction">introduction</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
</channel>
</rss>

