<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.componentart.com/BLOGS/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ComponentArt</title><link>http://www.componentart.com/BLOGS/default.aspx</link><description>ComponentArt is a privately-held software design and development firm in Toronto, Canada, specializing in the creation of software components for Microsoft's .NET platform. Our products help developers and organizations worldwide reduce their development time and effort, save money, and gain peace of mind.

 ComponentArt's current focus is on user interface elements for web site and web application development, as well as data visualization solutions for both web and Windows applications. 

Originally known as CYBERAKT, the company's name was changed in early 2004 to better reflect our focus on building next-generation reusable software components for .NET. Coincident with the first release of the .NET framework, CYBERAKT's initial product offering - ASP.NET Menu - quickly grew to become the #1 most popular 3rd-party component for ASP.NET. 

Concurrent with our name change in 2004 was the first introduction of our Web.UI suite of component products. We feel that each of the components in the Web.UI suite are truly best-in-class, and will bring our customers' user interface development experience to the next level. The launch of ComponentArt was reaffirmation of our commitment to the developer community to continually grow and improve our product offerings, and to maintain the highest possible level of customer service and support to which they have grown accustomed. 

In summer 2005 ComponentArt announced a brand new product line: ComponentArt Charting for .NET - which allows developers to deliver stunning 3D charts in their web or windows applications, with a quality heretofore unavailable in component software products. 

ComponentArt is committed to continually expand and improve the products in our Web.UI interface suite and Charting product lines, and to offer other exciting new products in the future.
</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Debug Build: 61019.2)</generator><item><title>MaskedInput Transform Intellisense</title><link>http://www.componentart.com/BLOGS/jovan/archive/2008/10/27/maskedinput-transform-intellisense.aspx</link><pubDate>Mon, 27 Oct 2008 14:06:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:24624</guid><dc:creator>Jovan</dc:creator><slash:comments>2</slash:comments><description>&lt;br /&gt;MaskedInput class&amp;#39;s Transform property that I described in depth in a few preceding blog posts presented us with an interesting design dilemma. At first it seemed like it should be a typical enumeration property, with one value for each Transform type. However, since the architecture allowed new Transform types to be added in a number of different ways (see the previous blog posts), the enum turned out to be too stifling. For that reason, we opted for a string instead.&lt;br /&gt;&lt;br /&gt;However, we still wanted to offer some Intellisense, to give the developer a hint at the values he would most likely want to use. We did it by placing the TypeConverterAttribute on the Transform property:&lt;br /&gt;&lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; MaskedInput : BaseInput
{
  ...
  [TypeConverter(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(MaskedInputTransformConverter))]
  &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Transform
  {
    &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; {...}
    &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; {...}
  }
  ...
}
&lt;/pre&gt;&lt;br /&gt;The implementation of MaskedInputTransformConverter is very simple:&lt;br /&gt;&lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt;&lt;span style="color:#808080;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color:#808080;"&gt;/// Provides Visual Studio intellisense for Transform property.&lt;/span&gt;
&lt;span style="color:#808080;"&gt;/// The list of StandardValues here corresponds to the properties of client-side ComponentArt_MaskedInput_Transforms object.&lt;/span&gt;
&lt;span style="color:#808080;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; MaskedInputTransformConverter : TypeConverter
{
  &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] StandardValues =
  {
    &amp;quot;&lt;span style="color:#8b0000;"&gt;empty&lt;/span&gt;&amp;quot;, 
    &amp;quot;&lt;span style="color:#8b0000;"&gt;CreditCard_VisaMasterCard&lt;/span&gt;&amp;quot;,
    &amp;quot;&lt;span style="color:#8b0000;"&gt;CreditCard_AmEx&lt;/span&gt;&amp;quot;,
    &amp;quot;&lt;span style="color:#8b0000;"&gt;Telephone_NorthAmerica&lt;/span&gt;&amp;quot;,
    &amp;quot;&lt;span style="color:#8b0000;"&gt;ZipCode&lt;/span&gt;&amp;quot;,
    &amp;quot;&lt;span style="color:#8b0000;"&gt;PostalCode&lt;/span&gt;&amp;quot;,
    &amp;quot;&lt;span style="color:#8b0000;"&gt;PostalCode_Australia&lt;/span&gt;&amp;quot;,
    &amp;quot;&lt;span style="color:#8b0000;"&gt;EmailAddress&lt;/span&gt;&amp;quot;
  };
  &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
  {
    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StandardValuesCollection(StandardValues);
  }
  &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; GetStandardValuesSupported(ITypeDescriptorContext context)
  {
    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
  }
}&lt;/pre&gt;&lt;br /&gt;This works really well in ASPX Intellisense, popping up the list of standard values, without forcing you to use one of them - exactly the behaviour we needed. The Intellisense also works for the Properties pane. Unfortunately it does not work in the CodeBehind files, and I don&amp;rsquo;t think there is a way to implement it there.&lt;br /&gt;&lt;br /&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/jovan/archive/2008/10/27/maskedinput-transform-intellisense.aspx&amp;amp;;subject=MaskedInput+Transform+Intellisense" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/27/maskedinput-transform-intellisense.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/27/maskedinput-transform-intellisense.aspx&amp;amp;;title=MaskedInput+Transform+Intellisense" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/27/maskedinput-transform-intellisense.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/27/maskedinput-transform-intellisense.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/27/maskedinput-transform-intellisense.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/27/maskedinput-transform-intellisense.aspx&amp;amp;title=MaskedInput+Transform+Intellisense" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/27/maskedinput-transform-intellisense.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=24624" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/ComponentArt+Web.UI/default.aspx">ComponentArt Web.UI</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/Input/default.aspx">Input</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/MaskedInput/default.aspx">MaskedInput</category></item><item><title>Building in new MaskedInput Transforms</title><link>http://www.componentart.com/BLOGS/jovan/archive/2008/10/24/building-in-new-maskedinput-transforms.aspx</link><pubDate>Fri, 24 Oct 2008 14:05:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:24621</guid><dc:creator>Jovan</dc:creator><slash:comments>0</slash:comments><description>&lt;br /&gt;In the previous post I explained how you can customize the behaviour of MaskedInput&amp;rsquo;s Transforms. That should probably cover all your needs. However, MaskedInput&amp;rsquo;s architecture does allow for one more way to customize transforms. You can actually build in your own.&lt;br /&gt;&lt;br /&gt;As you can see from the MaskedInput_Transforms.js file attached in the previous post, all the built-in transforms are contained in a global JavaScript object named ComponentArt_MaskedInput_Transforms, indexed by Transform name. So building in a new Transform is as easy as adding another property to ComponentArt_MaskedInput_Transforms. You can do that in a few ways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You can completely redefine the object ComponentArt_MaskedInput_Transforms: &lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt; &amp;lt;script type=&amp;quot;&lt;span style="color:#8b0000;"&gt;text/javascript&lt;/span&gt;&amp;quot;&amp;gt;
   &lt;span style="color:#0000ff;"&gt;window&lt;/span&gt;.ComponentArt_MaskedInput_Transforms =
   {
     &amp;#39;UpperCaseInput&amp;#39;:
     {
       &amp;#39;validate&amp;#39;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput) {&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;},
       &amp;#39;unmask&amp;#39;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput) {&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; maskedInput.masked.value.toUpperCase();},
       &amp;#39;mask&amp;#39;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput) {&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; maskedInput.unmasked.value.toUpperCase();}
     }
   }
 &amp;lt;/script&amp;gt;
 &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;MaskedInput&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;MaskedInput1&amp;quot;&lt;/span&gt;
   &lt;span style="color:#ff0000;"&gt;Transform&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;UpperCaseInput&amp;quot;&lt;/span&gt;
 &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;Keep in mind that because you are overwriting ComponentArt_MaskedInput_Transforms, the built-in transforms will no longer work.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A less drastic solution is to just add your new Transform to the existing ones:&lt;br /&gt;&lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;MaskedInput&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;MyMaskedInput&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
 &amp;lt;script type=&amp;quot;&lt;span style="color:#8b0000;"&gt;text/javascript&lt;/span&gt;&amp;quot;&amp;gt;
   &lt;span style="color:#0000ff;"&gt;window&lt;/span&gt;.ComponentArt_MaskedInput_Transforms.UpperCaseInput =
   {
     &amp;#39;validate&amp;#39;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput) {&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;},
     &amp;#39;unmask&amp;#39;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput) {&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; maskedInput.masked.value.toUpperCase();},
     &amp;#39;mask&amp;#39;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput) {&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; maskedInput.unmasked.value.toUpperCase();}
   }
   &lt;span style="color:#0000ff;"&gt;window&lt;/span&gt;.MyMaskedInput.set_transform(&amp;#39;UpperCaseInput&amp;#39;);
 &amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;If you have a source code license and are compiling your own custom builds, you can easily add your transforms directly to the JavaScript file. They will then work just like the original built-in transforms.&lt;br /&gt;If you are doing this, you may also want to extend MaskedInput Transform Intellisense, as described in the next blog post. &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/jovan/archive/2008/10/24/building-in-new-maskedinput-transforms.aspx&amp;amp;;subject=Building+in+new+MaskedInput+Transforms" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/24/building-in-new-maskedinput-transforms.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/24/building-in-new-maskedinput-transforms.aspx&amp;amp;;title=Building+in+new+MaskedInput+Transforms" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/24/building-in-new-maskedinput-transforms.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/24/building-in-new-maskedinput-transforms.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/24/building-in-new-maskedinput-transforms.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/24/building-in-new-maskedinput-transforms.aspx&amp;amp;title=Building+in+new+MaskedInput+Transforms" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/24/building-in-new-maskedinput-transforms.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=24621" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/ComponentArt+Web.UI/default.aspx">ComponentArt Web.UI</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/Input/default.aspx">Input</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/MaskedInput/default.aspx">MaskedInput</category></item><item><title>Customizing MaskedInput Transforms</title><link>http://www.componentart.com/BLOGS/jovan/archive/2008/10/23/customizing-maskedinput-transforms.aspx</link><pubDate>Thu, 23 Oct 2008 13:30:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:24618</guid><dc:creator>Jovan</dc:creator><slash:comments>0</slash:comments><description>&lt;br /&gt;In this blog post I will assume that you understand how MaskedInput Transforms function. It was explained in the &lt;a href="http://www.componentart.com/BLOGS/jovan/archive/2008/10/22/maskedinput-transform-functionality.aspx"&gt;previous blog post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is the list of currently implemented transforms:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;CreditCard_VisaMasterCard&lt;/strong&gt; - Visa or MasterCard credit card number.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CreditCard_AmEx&lt;/strong&gt; - American Express credit card number.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Telephone_NorthAmerica&lt;/strong&gt; - North American telephone number.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ZipCode&lt;/strong&gt; - American ZIP code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;PostalCode&lt;/strong&gt; - Canadian postal code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;PostalCode_Australia&lt;/strong&gt; - Australian postal code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;EmailAddress&lt;/strong&gt; - e-mail address.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;empty&lt;/strong&gt; - accepts all inputs.&lt;/li&gt;&lt;/ul&gt;empty Transform is a special case. It accepts all inputs, and it doesn&amp;#39;t mask or unmask them. Here is how it looks in code: &lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt; &lt;span style="color:#800000;"&gt;&amp;#39;empty&amp;#39;&lt;/span&gt;:
 {
   &lt;span style="color:#800000;"&gt;&amp;#39;validate&amp;#39;&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput)
   {
     &lt;span style="color:#008000;"&gt;// Accept all input:&lt;/span&gt;
     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
   },
   &lt;span style="color:#800000;"&gt;&amp;#39;unmask&amp;#39;&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput)
   {
     &lt;span style="color:#008000;"&gt;// Just pass on the edited displayed text:&lt;/span&gt;
     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; maskedInput.masked.value;
   },
   &lt;span style="color:#800000;"&gt;&amp;#39;mask&amp;#39;&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput)
   {
     &lt;span style="color:#008000;"&gt;// Just pass on the unmasked value:&lt;/span&gt;
     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; maskedInput.unmasked.value;
   }
 }&lt;/pre&gt;&lt;br /&gt;There is not enough space in this blog post to show the code of the rest of the Transforms, but I made &lt;a href="http://blogs.componentart.com/jovan/files/MaskedInput_Transforms.zip"&gt;the source code file&lt;/a&gt; available for download.&lt;br /&gt;&lt;br /&gt;Ideally the available transforms will be enough for your requirements. New transforms are very easy to build in, so please don&amp;#39;t hesitate to send in your suggestions.&lt;br /&gt;&lt;br /&gt;However, for those times when your requirements cannot be met by the built-in transforms, there are a number of ways to customize the MaskedInput.&lt;br /&gt;&lt;br /&gt;In addition to Transform, MaskedInput exposes three more server-side properties: &lt;strong&gt;TransformValidate&lt;/strong&gt;, &lt;strong&gt;TransformUnmask&lt;/strong&gt;, and &lt;strong&gt;TransformMask&lt;/strong&gt;. These allow you to override the behaviour of any of the three transform functions. For example, to make the Visa card transform featured in the previous blog post mask with dashes instead of masking with spaces, you can do something like this: &lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt; &amp;lt;script type=&amp;quot;&lt;span style="color:#8b0000;"&gt;text/javascript&lt;/span&gt;&amp;quot;&amp;gt;
   &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; maskVisaWithDashes(maskedInput)
   {
     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; maskedInput.unmasked.value.replace(/^(\d{4})(\d{4})(\d{4})(\d{4})$/, &amp;#39;$1-$2-$3-$4&amp;#39;);
   }
 &amp;lt;/script&amp;gt;
 &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;MaskedInput&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;MyMaskedInput&amp;quot;&lt;/span&gt;
   &lt;span style="color:#ff0000;"&gt;Transform&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;CreditCard_VisaMasterCard&amp;quot;&lt;/span&gt;
   &lt;span style="color:#ff0000;"&gt;TransformMask&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;maskVisaWithDashes&amp;quot;&lt;/span&gt;
 &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;This allows you to fully override any of the Transform&amp;#39;s functions. Note that you can also leave the Transform property blank. In that case, the control defaults to the empty transform.&lt;br /&gt;&lt;br /&gt;In the next blog post, I will introduce another more integrated way to add a new Transform.&lt;br /&gt;&lt;br /&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/jovan/archive/2008/10/23/customizing-maskedinput-transforms.aspx&amp;amp;;subject=Customizing+MaskedInput+Transforms" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/23/customizing-maskedinput-transforms.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/23/customizing-maskedinput-transforms.aspx&amp;amp;;title=Customizing+MaskedInput+Transforms" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/23/customizing-maskedinput-transforms.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/23/customizing-maskedinput-transforms.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/23/customizing-maskedinput-transforms.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/23/customizing-maskedinput-transforms.aspx&amp;amp;title=Customizing+MaskedInput+Transforms" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/23/customizing-maskedinput-transforms.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=24618" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/ComponentArt+Web.UI/default.aspx">ComponentArt Web.UI</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/Input/default.aspx">Input</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/MaskedInput/default.aspx">MaskedInput</category></item><item><title>MaskedInput Transform functionality</title><link>http://www.componentart.com/BLOGS/jovan/archive/2008/10/22/maskedinput-transform-functionality.aspx</link><pubDate>Wed, 22 Oct 2008 14:06:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:24615</guid><dc:creator>Jovan</dc:creator><slash:comments>0</slash:comments><description>&lt;br /&gt;The format of the masked input is fully defined by the &amp;quot;Transform&amp;quot; it uses.&lt;br /&gt;&lt;br /&gt;A Transform is a client-side JavaScript object containing just three functions:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;validate&lt;/strong&gt; &amp;ndash; A function that takes a look at what the user just typed into the masked input box, and returns a boolean value: true if text is valid, false if it isn&amp;#39;t.&lt;br /&gt;For example, if the transform is used to accept a Visa card number, and the user types in &amp;quot;4506/00020002-0002&amp;quot;, this function returns true. (It just makes sure that there are exactly 16 digits.) If the user types in &amp;quot;2008-10-14&amp;quot;, the function returns false.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;unmask&lt;/strong&gt; &amp;ndash; A function that takes a look at what the user has just typed into the input box, and &amp;quot;unmasks&amp;quot; it. Typically, this means that the text is cleaned of formatting, leaving behind just the raw data. Unmask gets called even when validate does not return true, so it should not assume that the masked text it is working on is valid.&lt;br /&gt;In our example, if the user typed in &amp;quot;4506/00020002-0002&amp;quot;, this function will return &amp;quot;4506000200020002&amp;quot;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;mask&lt;/strong&gt; &amp;ndash; A function that takes a look at the raw, clean data, and &amp;quot;masks&amp;quot; it: formats it for display.&lt;br /&gt;With our raw data being &amp;quot;4506000200020002&amp;quot;, this function will return &amp;quot;4506 0002 0002 0002&amp;quot;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Each of these methods takes only one argument: the reference to the client-side MaskedInput JavaScript object. The function can then easily use this object to get any other information it needs. For example, here is the entire code of the Visa card transform:&lt;br /&gt;&lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt; &lt;span style="color:#800000;"&gt;&amp;#39;CreditCard_VisaMasterCard&amp;#39;&lt;/span&gt;:
 {
   &lt;span style="color:#800000;"&gt;&amp;#39;validate&amp;#39;&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput)
   {
     &lt;span style="color:#008000;"&gt;// Ensure the unmasked edited text has exactly 16 digits:&lt;/span&gt;
     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.unmask(maskedInput).&lt;span style="color:#0000ff;"&gt;length&lt;/span&gt; === 16;
   },
   &lt;span style="color:#800000;"&gt;&amp;#39;unmask&amp;#39;&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput)
   {
     &lt;span style="color:#008000;"&gt;// Simply remove all the non-digits from the displayed text:&lt;/span&gt;
     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; maskedInput.masked.value.replace(&lt;span style="color:#800000;"&gt;/[^\d]/g&lt;/span&gt;, &lt;span style="color:#800000;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
   },
   &lt;span style="color:#800000;"&gt;&amp;#39;mask&amp;#39;&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(maskedInput)
   {
     &lt;span style="color:#008000;"&gt;// Insert spaces between four-digit groups:&lt;/span&gt;
     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; maskedInput.unmasked.value.replace(&lt;span style="color:#800000;"&gt;/^(\d{4})(\d{4})(\d{4})(\d{4})$/&lt;/span&gt;, &lt;span style="color:#800000;"&gt;&amp;#39;$1 $2 $3 $4&amp;#39;&lt;/span&gt;);
   }
 }&lt;/pre&gt;&lt;br /&gt;Two often used properties of the client-side MaskedInput object are maskedInput.masked and maskedInput.unmasked:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;maskedInput.masked refers to the display textbox element that the user sees and edits. It contains the masked text.&lt;br /&gt;Although the masked text is typically not examined on the server, it can be accessed as MaskedInput&amp;#39;s DisplayText property.&lt;/li&gt;&lt;li&gt;maskedInput.unmasked refers to a hidden input that contains the unmasked text.&lt;br /&gt;The unmasked text is often examined or manipulated on the server, where it can be accessed as MaskedInput&amp;#39;s Text property.&lt;/li&gt;&lt;/ul&gt;Hopefully it is now clear how Transforms function. In the next blog post I will explain how you can customize them.&lt;br /&gt;&lt;br /&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/jovan/archive/2008/10/22/maskedinput-transform-functionality.aspx&amp;amp;;subject=MaskedInput+Transform+functionality" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/22/maskedinput-transform-functionality.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/22/maskedinput-transform-functionality.aspx&amp;amp;;title=MaskedInput+Transform+functionality" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/22/maskedinput-transform-functionality.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/22/maskedinput-transform-functionality.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/22/maskedinput-transform-functionality.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/22/maskedinput-transform-functionality.aspx&amp;amp;title=MaskedInput+Transform+functionality" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/22/maskedinput-transform-functionality.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=24615" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/ComponentArt+Web.UI/default.aspx">ComponentArt Web.UI</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/Input/default.aspx">Input</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/MaskedInput/default.aspx">MaskedInput</category></item><item><title>Major input control Gotcha</title><link>http://www.componentart.com/BLOGS/jovan/archive/2008/10/14/major-input-control-gotcha.aspx</link><pubDate>Tue, 14 Oct 2008 15:17:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:24274</guid><dc:creator>Jovan</dc:creator><slash:comments>3</slash:comments><description>&lt;br /&gt;&lt;strong&gt;Short Story:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This will not work:&lt;br /&gt;&lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;NumberInput&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;MyNumberInput&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;+&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;onclick&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;MyNumberInput.increaseValue();&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;onclick&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;MyNumberInput.decreaseValue();&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;This is how to correct it:&lt;br /&gt;&lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;NumberInput&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;MyNumberInput&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;+&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;onclick&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;&lt;span style="font-weight:bold;background-color:yellow;"&gt;window.&lt;/span&gt;MyNumberInput.increaseValue();&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;onclick&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;&lt;span style="font-weight:bold;background-color:yellow;"&gt;window.&lt;/span&gt;MyNumberInput.decreaseValue();&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Long Story:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This will work:&lt;br /&gt;&lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;NumberInput&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;MyNumberInput&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;+&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;onclick&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;increase();&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
  function increase()
  {
    MyNumberInput.increaseValue();
  }
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;But, as mentioned before, this:&lt;br /&gt;&lt;pre style="font-family:courier new;background-color:#e2e2e2;border:#a0a0a0 1px solid;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;NumberInput&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;MyNumberInput&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;+&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;onclick&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;MyNumberInput.increaseValue();&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;will instead produce a JavaScript error: &lt;span style="font-style:italic;font-family:courier new;"&gt;MyNumberInput.increaseValue is not a function&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But isn&amp;#39;t that the exact same code?? What is going on?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;It turns out that in the second case &amp;quot;MyNumberInput&amp;quot; is not referring to the client-side NumberInput object. Instead it is referring to a DOM element of the same name.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Like most ComponentArt controls, input controls create a number of client-side DOM elements and JavaScript objects.&lt;br /&gt;In this particular example, with a NumberInput named MyNumberInput:&lt;br /&gt;In JavaScript, the most important object is named &lt;span style="font-family:courier new;"&gt;MyNumberInput&lt;/span&gt;, and is an instance of client-side class &lt;span style="font-family:courier new;"&gt;ComponentArt.Web.UI.NumberInput&lt;/span&gt;.&lt;br /&gt;In the DOM, there are a number of different elements, including a text input with the id &lt;span style="font-family:courier new;"&gt;MyNumberInput&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;This results in a very unusual naming conflict. Normally, when you write &lt;span style="font-family:courier new;"&gt;MyNumberInput&lt;/span&gt; in client-side code, you expect it to refer to the global JavaScript object of that name. And it does. &lt;span style="font-weight:bold;font-style:italic;"&gt;Except&lt;/span&gt; when the code is running in the event handler of an HTML tag. Then &lt;span style="font-family:courier new;"&gt;MyNumberInput&lt;/span&gt; refers to the DOM element with that id. Which is probably not what you want.&lt;br /&gt;&lt;br /&gt;To avoid ambiguity, you can use &lt;span style="font-family:courier new;"&gt;window.MyNumberInput&lt;/span&gt; to refer to the JavaScript object, and &lt;span style="font-family:courier new;"&gt;document.getElementById(&amp;#39;MyNumberInput&amp;#39;)&lt;/span&gt; to refer to the DOM element.&lt;br /&gt;&lt;br /&gt;So why don&amp;rsquo;t we fix this? Well, it turns out that there is no real bug here.&lt;br /&gt;First of all, this is not a design that is unique to ComponentArt input controls. In fact, most ComponentArt controls produce JavaScript objects and DOM elements with matching identifiers, for a number of reasons. What is different with input controls is that the DOM element in question happens to be a form element. This triggers the naming conflict.&lt;br /&gt;However, having these matching identifiers turns out to be needed for the input controls to work smoothly with ASP.NET&amp;rsquo;s client-side validation, which is a very important feature.&lt;br /&gt;So it is unlikely that we will be able to &amp;quot;fix&amp;quot; this. Instead, just please keep this gotcha in mind.&lt;br /&gt;&lt;br /&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/jovan/archive/2008/10/14/major-input-control-gotcha.aspx&amp;amp;;subject=Major+input+control+Gotcha" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/14/major-input-control-gotcha.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/14/major-input-control-gotcha.aspx&amp;amp;;title=Major+input+control+Gotcha" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/14/major-input-control-gotcha.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/14/major-input-control-gotcha.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/14/major-input-control-gotcha.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2008/10/14/major-input-control-gotcha.aspx&amp;amp;title=Major+input+control+Gotcha" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2008/10/14/major-input-control-gotcha.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=24274" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/ComponentArt+Web.UI/default.aspx">ComponentArt Web.UI</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/Input/default.aspx">Input</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/NumberInput/default.aspx">NumberInput</category><category domain="http://www.componentart.com/BLOGS/jovan/archive/tags/MaskedInput/default.aspx">MaskedInput</category></item><item><title>Web.UI 2008.2 Grid News: Grouping</title><link>http://www.componentart.com/BLOGS/milos/archive/2008/09/23/web-ui-2008-2-grid-news-grouping.aspx</link><pubDate>Tue, 23 Sep 2008 18:34:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:23733</guid><dc:creator>Milos</dc:creator><slash:comments>1</slash:comments><description>&lt;br /&gt;

Now that Web.UI 2008.2 is officially out the door, I can take some time to sit back and reflect on what&amp;#39;s been done. There are some great new controls, as usual, and major enhancements to our Grid control. 
&lt;br /&gt;
&lt;br /&gt;

I&amp;#39;m particularly excited about that last part, as I&amp;#39;ve felt for a long time that some of the limitations with its grouping functionality needed to be addressed. With this release, we took the time to really re-think this aspect of the control, and instead of merely patching on additional features, to remake it in a powerful and elegant way and still keep it backward compatible. I believe we&amp;#39;ve managed to do that.
&lt;br /&gt;
&lt;br /&gt;

So, without further ado, here&amp;#39;s what&amp;#39;s new with Grid grouping:
&lt;br /&gt;
&lt;br /&gt;

&lt;strong&gt;Multiple Grouping&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;

One of the Grid&amp;#39;s major deficiencies for some time has been its inability to group by more than one column at a time. This had to do with various factors having to do mostly with the way we were rendering groups on the client. We have now surmounted those obstacles and groupings can be done on as many columns at a time as the user deems reasonable.
&lt;br /&gt;
&lt;br /&gt;

This ability extends across all running modes, usage scenarios and grouping modes.
&lt;br /&gt;
&lt;br /&gt;

Wait... Grouping modes?
&lt;br /&gt;
&lt;br /&gt;

&lt;strong&gt;Grouping Modes&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;

When re-thinking the way grouping should work in Grid, we realized that there are at least three different ways in which paging through a grouped record set could work:
&lt;br /&gt;
&lt;br /&gt;

ConstantRecords; in this mode, the number of actual data records, regardless of how many groups they are distributed across, remains constant across pages. This mode is very simple to handle programmatically, since data-access code doesn&amp;#39;t actually need to know anything about groupings. It simply retrieves the one page of records, which are then organized in appropriate groupings before being rendered on the client.
&lt;br /&gt;
&lt;br /&gt;

See demo here: &lt;a href="http://www.componentart.com/webui/demos/demos_control-specific/grid/sorting_and_grouping/grouping_constantRecords/default.aspx"&gt;ConstantRecords Grouping Mode&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;

Thanks to its simplicity, this grouping mode is supported in all running modes, including WebService.
&lt;br /&gt;
&lt;br /&gt;

ConstantGroups; this mode replicates the default grouping behaviour that Grid exhibited up to this point. Paging a Grid grouped in this mode means that the same number of top-level groups is present on every page. All the contents of those groups (sub-groups and records) are pre-loaded and no additional data access is required to expand and render that content.
&lt;br /&gt;
&lt;br /&gt;

See demo here: &lt;a href="http://www.componentart.com/webui/demos/demos_control-specific/grid/sorting_and_grouping/grouping_constantGroups/default.aspx"&gt;ConstantGroups Grouping Mode&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;

ConstantRows; the two modes described above have one common downside: as groups are expanded on the client, the number of rendered rows increases, and can stretch the height of the Grid control. With ConstantRows, the total number of rendered rows (records + group headings) is kept at the constant number dictated by GroupingPageSize.
&lt;br /&gt;
&lt;br /&gt;

See demo here: &lt;a href="http://www.componentart.com/webui/demos/demos_control-specific/grid/sorting_and_grouping/grouping_manual/default.aspx"&gt;ConstantRows Grouping Mode&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;

This running mode, when used in Server or Callback mode, requires some new server-side events (NeedGroups and NeedGroupData) to be handled in order to facilitate the efficient retrieval of only the necessary groups and records. 
&lt;br /&gt;
&lt;br /&gt;

Which brings us to our next topic...
&lt;br /&gt;
&lt;br /&gt;

&lt;strong&gt;Grouping + Manual Paging&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;

Up until this point, there was no good way to use manual paging (manual retrieval of just the required records from the database for each page) in conjunction with grouping with ComponentArt Grid. With the ConstantRecords and ConstantRows grouping modes, that is no longer a problem. Grouping can now be done while maintaining the efficiency of manual data retrieval.
&lt;br /&gt;
&lt;br /&gt;

&lt;strong&gt;Grouping + Scrolling&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;

The ConstantRows grouping mode provides an additional important benefit. To support grouping in conjunction with the Grid scroller, maintaining a constant number of rendered rows was crucial. A Grid which changes its height as it is scrolled completely ruins the visual feel of a scrolling interface. With ConstantRows, grouping can finally be used with the scroller.
&lt;br /&gt;
&lt;br /&gt;

See a demo here: 
&lt;a href="http://www.componentart.com/webui/demos/demos_control-specific/grid/sorting_and_grouping/grouping_scroll_callback/WebForm1.aspx"&gt;Scrolling a Grouped Grid in Callback Mode&lt;/a&gt;&lt;br /&gt;
And here: 
&lt;a href="http://www.componentart.com/webui/demos/demos_control-specific/grid/sorting_and_grouping/grouping_scroll_client/WebForm1.aspx"&gt;Scrolling a Grouped Grid in Client Mode&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;

&lt;strong&gt;Grouping + Web Services&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;

Grid&amp;#39;s WebService running mode, while offering the best possible performance and elegance of design, does have limitations due its inability to perform complex server-side logic as data is loaded. This makes it difficult to support the loading of groups on the server (web service), but once again, the grouping modes greatly improve the situation.
&lt;br /&gt;
&lt;br /&gt;

The ConstantRecords grouping mode is easily supported in WebService running mode, since it only relies on the regular paging of records. Through this mode, grouping is now supported with web services. In the future, we will be expanding this functionality to support as much of the other two grouping modes as we can, but we feel that this is already a decent start.
&lt;br /&gt;
&lt;br /&gt;

See a demo here: &lt;a href="http://www.componentart.com/webui/demos/demos_technology-showcase/web-services_ajax/grid_webServiceRunningMode/default.aspx"&gt;WebService Running Mode&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;

&lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;

We hope you find Grid&amp;#39;s new grouping functionality useful. We will continue to improve it and, as always, take your views and needs into account. Do let us know what you think.
&lt;br /&gt;
&lt;br /&gt;

Enhanced grouping isn&amp;#39;t the only thing that&amp;#39;s new in Grid 2008.2, but it&amp;#39;s certainly the most significant. Nevertheless, I will be writing about the other Grid enhancements in a follow-up post. Stay tuned.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/milos/archive/2008/09/23/web-ui-2008-2-grid-news-grouping.aspx&amp;amp;;subject=Web.UI+2008.2+Grid+News%3a+Grouping" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/09/23/web-ui-2008-2-grid-news-grouping.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/milos/archive/2008/09/23/web-ui-2008-2-grid-news-grouping.aspx&amp;amp;;title=Web.UI+2008.2+Grid+News%3a+Grouping" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/09/23/web-ui-2008-2-grid-news-grouping.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2008/09/23/web-ui-2008-2-grid-news-grouping.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/09/23/web-ui-2008-2-grid-news-grouping.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2008/09/23/web-ui-2008-2-grid-news-grouping.aspx&amp;amp;title=Web.UI+2008.2+Grid+News%3a+Grouping" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/09/23/web-ui-2008-2-grid-news-grouping.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=23733" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/Grid/default.aspx">Grid</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/Web.UI/default.aspx">Web.UI</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/2008.2/default.aspx">2008.2</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/Grouping/default.aspx">Grouping</category></item><item><title>WebChart View Angle Chooser Control: Client-Side 3D Rendering</title><link>http://www.componentart.com/BLOGS/bojan/archive/2008/07/22/view-angle-chooser-control-client-side-3d-rendering.aspx</link><pubDate>Wed, 23 Jul 2008 02:57:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:20829</guid><dc:creator>Bojan</dc:creator><slash:comments>0</slash:comments><description>View Angle Chooser is a UI control that comes included with the Charting 2008.1 product. It displays three sides of a rectangular box which can be rotated using a mouse to select the best chart viewing angle. Check out the &lt;a href="http://www.componentart.com/charting/gallery/samples/ajax/toolbar/" target="_blank"&gt;&lt;font color="#ff0000"&gt;Charting toolbar demo&lt;/font&gt;&lt;/a&gt; to see it in action. &lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align:center;"&gt;
&lt;img align="middle" height="175" src="http://www.componentart.com/blogs/bojan/images/ViewAngleChooser.PNG" width="154" /&gt;
&lt;/div&gt;
&lt;br /&gt;
In this post I will explain how it was implemented. The challenge was to efficiently draw 2D shapes (which represent projected 3D surfaces) using only standard DHTML technologies: HTML, JavaScript, CSS and DOM. There is no standard JavaScript library for drawing shapes, and the ones that do exist are highly inefficient, potentially requiring 100s of div elements.&lt;br /&gt;
&lt;br /&gt;
We followed a trick outlined on &lt;a href="http://www.uselesspickles.com/triangles/demo.html" target="_blank"&gt;&lt;font color="#ff0000"&gt;www.uselesspickles.com&lt;/font&gt;&lt;/a&gt; which allowed us to draw horizontal or vertical right angle triangles using div elements. &lt;br /&gt;
&lt;br /&gt;
The idea is to color one of the border edges of a div element and make an adjacent border edge transparent. The width of the other two border edges should be set to zero as well as the width and the height of the div itself.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;&amp;nbsp; &amp;lt;div style='width: 0px; height: 0px; border-left: 0px;&lt;br /&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; border-bottom: 0px; border-top: #ff0000 50px solid;&lt;br /&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; border-right: transparent 100px solid;&amp;#39;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
A triangle produced by the above code looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align:center;"&gt;
&lt;img height="122" src="http://www.componentart.com/blogs/bojan/images/RightAngleTriangle.PNG" width="218" /&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
The other three right angle triangles can be drawn similarly. To draw a triangle of any size and orientation we need to subdivide it into constituent vertical or horizontal right angle triangles. A possible subdivision for the following triangle looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align:center;"&gt;
&lt;img height="180" src="http://www.componentart.com/blogs/bojan/images/Triangle.PNG" width="216" /&gt;
&lt;/div&gt;
&lt;br /&gt;
Not all triangles can be divided into a finite number of constituent right angle triangles as seen in the above figure. In that case, the subdivision can be stopped after the desired level of detail has been reached.&lt;br /&gt;
&lt;br /&gt;
Our first attempt at subdividing the sides of a rectangular box involved dividing each quadrilateral side of the box along the diagonal into two triangles and subsequently dividing each of the resultant triangles in turn. This is what such a subdivision might look like:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align:center;"&gt;
&lt;img align="middle" height="284" src="http://www.componentart.com/blogs/bojan/images/FirstSubdivision.PNG" width="307" /&gt;
&lt;/div&gt;
&lt;br /&gt;
White dots started appearing from imperfect alignment where two triangles are joined along the hypotenuse. To eliminate that effect and to decrease the number of triangles we changed our subdivision method to first select the largest horizontal or vertical rectangle that can be inscribed inside of the quadrilateral side. One rectangle and four triangles are produced. The rectangle can then be drawn with a simple div while the triangles are subdivided the normal way. This is what such a subdivision might look like:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align:center;"&gt;
&lt;img height="284" src="http://www.componentart.com/blogs/bojan/images/SecondSubdivision.PNG" width="307" /&gt;
&lt;/div&gt;
&lt;br /&gt;
Notice that no two triangles are joined along the hypotenuse.&lt;br /&gt;
&lt;br /&gt;
The following drawing shows the View Angle Chooser rectangular box with each of the constituent rectangles and triangles drawn with a different shade:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align:center;"&gt;
&lt;img height="249" src="http://www.componentart.com/blogs/bojan/images/Subdivision1.PNG" width="224" /&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
When drawing 2D triangles using this technique keep the following browser incompatibilities in mind:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Internet Explorer 6&lt;/strong&gt; &amp;ndash; Transparency is not supported, but you can use the chroma filter and choose one color to be transparent. Your triangle divs will be of the following form:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;&amp;nbsp; &amp;lt;div style='filter:chroma(color=#abcdef);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width: 0px; height: 0px; border-left: 0px;&lt;br /&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; border-bottom: 0px; border-top: #ff0000 50px solid;&lt;br /&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; border-right: #abcdef 100px solid;&amp;#39;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;strong&gt;Opera (any version)&lt;/strong&gt; &amp;ndash; Divs are at least as high as the current font, so there might be a problem drawing small triangles. To get around this problem do the following:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;&amp;nbsp; &amp;lt;div style='line-height: 0px; font-size: 0px;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width: 0px; height: 0px; border-left: 0px;&lt;br /&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; border-bottom: 0px; border-top: #ff0000 50px solid;&lt;br /&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; border-right: transparent 100px solid;&amp;#39;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Interestingly, this control looks best in Firefox 3.0 because it is automatically anti-aliased while it renders the fastest in Safari 3.1.&lt;br /&gt;
&lt;br /&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/bojan/archive/2008/07/22/view-angle-chooser-control-client-side-3d-rendering.aspx&amp;amp;;subject=WebChart+View+Angle+Chooser+Control%3a+Client-Side+3D+Rendering" target="_blank" title = "Post http://www.componentart.com/BLOGS/bojan/archive/2008/07/22/view-angle-chooser-control-client-side-3d-rendering.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/bojan/archive/2008/07/22/view-angle-chooser-control-client-side-3d-rendering.aspx&amp;amp;;title=WebChart+View+Angle+Chooser+Control%3a+Client-Side+3D+Rendering" target="_blank" title = "Post http://www.componentart.com/BLOGS/bojan/archive/2008/07/22/view-angle-chooser-control-client-side-3d-rendering.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/bojan/archive/2008/07/22/view-angle-chooser-control-client-side-3d-rendering.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/bojan/archive/2008/07/22/view-angle-chooser-control-client-side-3d-rendering.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/bojan/archive/2008/07/22/view-angle-chooser-control-client-side-3d-rendering.aspx&amp;amp;title=WebChart+View+Angle+Chooser+Control%3a+Client-Side+3D+Rendering" target="_blank" title = "Post http://www.componentart.com/BLOGS/bojan/archive/2008/07/22/view-angle-chooser-control-client-side-3d-rendering.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=20829" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/bojan/archive/tags/Client-side+API/default.aspx">Client-side API</category><category domain="http://www.componentart.com/BLOGS/bojan/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.componentart.com/BLOGS/bojan/archive/tags/Charting/default.aspx">Charting</category><category domain="http://www.componentart.com/BLOGS/bojan/archive/tags/WebChart/default.aspx">WebChart</category><category domain="http://www.componentart.com/BLOGS/bojan/archive/tags/3D/default.aspx">3D</category></item><item><title>Drilling deeper into the Charting client-side API</title><link>http://www.componentart.com/BLOGS/bojan/archive/2008/07/14/drilling-deeper-into-the-charting-client-side-api.aspx</link><pubDate>Mon, 14 Jul 2008 19:17:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:20600</guid><dc:creator>Bojan</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;ComponentArt Charting 2008.1 introduces an easy way for end users to customize the look and feel of charts. This is accomplished through a JavaScript client-side API. &lt;a href="http://www.componentart.com/charting/gallery/samples/ajax/toolbar/" target="_blank"&gt;&lt;font color="#ff0000"&gt;Charting toolbar demo&lt;/font&gt;&lt;/a&gt; in ComponentArt&amp;rsquo;s new &lt;a href="http://www.componentart.com/charting/gallery/" target="_blank"&gt;&lt;font color="#ff0000"&gt;Charting gallery&lt;/font&gt;&lt;/a&gt; shows how this can be done.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;
&lt;img align="middle" height="338" src="http://www.componentart.com/blogs/bojan/images/ToolbarDemo.PNG" width="510" /&gt;
&lt;/div&gt;
&lt;br /&gt;

&lt;p&gt;The toolbar demo allows the end user change the following properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chart type&lt;/li&gt;

&lt;li&gt;Color scheme&lt;/li&gt;

&lt;li&gt;Orientation&lt;/li&gt;

&lt;li&gt;View angle&lt;/li&gt;

&lt;li&gt;Projection&lt;/li&gt;

&lt;li&gt;Perspective&lt;/li&gt;

&lt;li&gt;XY, YZ and ZX plane visibility&lt;br /&gt;
&lt;/li&gt;

&lt;li&gt;Legend visibility&lt;/li&gt;

&lt;li&gt;Series order&lt;/li&gt;

&lt;li&gt;Series highlighting&lt;/li&gt;

&lt;li&gt;Choice of rendering engines, high-quality or high-speed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These properties are accessed via a ComponentArt Web.UI ToolBar control.&lt;/p&gt;

&lt;p&gt;Properties with an on/off state, such as the visibility of the XY, YZ and ZX planes and the visibility of the legend, are implemented using toolbar buttons directly.&lt;/p&gt;

&lt;p&gt;Properties that have several options, such as chart type, color scheme, orientation, projection, series order, series highlighting and the engine selection, use Web.UI Menu controls connected to their corresponding toolbar buttons.&lt;/p&gt;

&lt;p&gt;The perspective property uses a Web.UI ComboBox control embedded in the ToolBar.&lt;/p&gt;

&lt;div style="text-align:center;"&gt;
&lt;img height="175" src="http://www.componentart.com/blogs/bojan/images/ViewAngleChooser.PNG" width="154" /&gt;
&lt;/div&gt;

&lt;p&gt;View Angle Chooser is a custom control implemented entirely in JavaScript. It is packaged with the WebChart assembly and can be used in your application separately from the toolbar demo.&amp;nbsp; &lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;The control must be enabled on the server before it is used:
&lt;/p&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;[ C# ]&lt;br /&gt;targetChart.Clientside.ViewAngleChooserEnabled = true;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;
&lt;br /&gt;
The HTML code that this control generates is obtained by calling the &lt;a href="http://www.componentart.com/docs/default.aspx?content=WebChart/ComponentArt.Charting~WebChart_GetViewAngleChooserHTML_method.htm" target="_blank"&gt;&lt;font color="#ff0000"&gt;GetViewAngleChooserHTML()&lt;/font&gt;&lt;/a&gt; method of the WebChart JavaScript object: &lt;br /&gt;&lt;/p&gt;&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;[ JavaScript ]&lt;br /&gt;WebChart1.GetViewAngleChooserHTML();&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;br /&gt;
Position, sizes and colors can be customized. The View Angle Chooser control will be discussed in more depth in a future blog post.
&lt;/p&gt;
&lt;p&gt;WebChart&amp;rsquo;s client-side API must also be enabled on the server before it is used. This was accomplished by setting the Clientside.ClientsideApiEnabled property to true. After the API is enabled it can be accessed through a JavaScript object whose name is the UniqueID property of the WebChart.&lt;/p&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;[ C# ]&lt;br /&gt;targetChart.Clientside.ClientsideApiEnabled = true;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;The chart properties are accessed through the getter and setter methods:&lt;/p&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;[ JavaScript ]&lt;br /&gt;WebChart1.set_mainChartType(&amp;quot;AreaSmooth&amp;quot;);&lt;br /&gt;WebChart1.set_colorPalette(&amp;quot;Organic&amp;quot;);&lt;br /&gt;WebChart1.set_legendVisibility(true);&lt;br /&gt;WebChart1.set_planeXYVisible(false);&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;
&lt;br /&gt;
To refresh the chart, after the properties have been set, the refresh method needs to be called. 
&lt;/p&gt;&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;[ JavaScript ]&lt;br /&gt;WebChart1.refresh();&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;There are two ways in which the refresh method can function: an AJAX callback, or a traditional postback. This can be selected in the server-side code.&lt;/p&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;[ C# ]&lt;br /&gt;WebChart1.Clientside.RefreshMethod = ClientsideRefreshMethod.Callback;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;In our demo, the refresh method is not called explicitly because the AutoRenderOnChange property is set to true in the server-side code. This will cause a refresh to happen automatically after any client-side property has been changed.&lt;/p&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;[ C# ]&lt;br /&gt;WebChart1.Clientside.AutoRenderOnChange = true;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Client-side customization is not limited to just these properties. In fact any property in your web application, chart related or not, can be customized through the client-side API. This can be accomplished using custom properties:&lt;/p&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;[ JavaScript ]&lt;br /&gt;ComponentArt.Charting.WebChart.set_customProperty(name, value);&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;To retrieve the value of the custom property in the server-side code call:&lt;/p&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;[ C# ]&lt;br /&gt;public string GetCustomProperty(string key);&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Once the custom property value is retrieved you can do anything with it, such as modify any aspect of the chart or effect a change in another part of the application. See the &lt;a href="http://www.componentart.com/charting/gallery/samples/ajax/drilldown/" target="_blank"&gt;&lt;font color="#ff0000"&gt;Drill-down demo&lt;/font&gt;&lt;/a&gt; for an example of how custom properties are used.
&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/bojan/archive/2008/07/14/drilling-deeper-into-the-charting-client-side-api.aspx&amp;amp;;subject=Drilling+deeper+into+the+Charting+client-side+API" target="_blank" title = "Post http://www.componentart.com/BLOGS/bojan/archive/2008/07/14/drilling-deeper-into-the-charting-client-side-api.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/bojan/archive/2008/07/14/drilling-deeper-into-the-charting-client-side-api.aspx&amp;amp;;title=Drilling+deeper+into+the+Charting+client-side+API" target="_blank" title = "Post http://www.componentart.com/BLOGS/bojan/archive/2008/07/14/drilling-deeper-into-the-charting-client-side-api.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/bojan/archive/2008/07/14/drilling-deeper-into-the-charting-client-side-api.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/bojan/archive/2008/07/14/drilling-deeper-into-the-charting-client-side-api.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/bojan/archive/2008/07/14/drilling-deeper-into-the-charting-client-side-api.aspx&amp;amp;title=Drilling+deeper+into+the+Charting+client-side+API" target="_blank" title = "Post http://www.componentart.com/BLOGS/bojan/archive/2008/07/14/drilling-deeper-into-the-charting-client-side-api.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=20600" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/bojan/archive/tags/Client-side+API/default.aspx">Client-side API</category><category domain="http://www.componentart.com/BLOGS/bojan/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.componentart.com/BLOGS/bojan/archive/tags/Charting/default.aspx">Charting</category><category domain="http://www.componentart.com/BLOGS/bojan/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.componentart.com/BLOGS/bojan/archive/tags/ToolBar/default.aspx">ToolBar</category></item><item><title>ComponentArt Web.UI 2008.2 Details Announced</title><link>http://www.componentart.com/BLOGS/miljan/archive/2008/07/10/componentart-web-ui-2008-2-details-announced.aspx</link><pubDate>Thu, 10 Jul 2008 18:34:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:20502</guid><dc:creator>Miljan</dc:creator><slash:comments>22</slash:comments><description>
&lt;p&gt;The Web.UI product team has been hard at work on the next major release of ComponentArt&amp;#39;s flagship product line. I am pleased to announce that the release of Web.UI 2008.2 is on the horizon and that it will include three new controls, a major Grid overhaul and several important new suite-wide features. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Three New Controls&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;The Web.UI suite is being expanded yet again. The following controls are being added with v2008.2: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Input for ASP.NET&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Slider for ASP.NET&amp;nbsp;&lt;/li&gt;
&lt;li&gt;ColorPicker for ASP.NET &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Major Grid Overhaul&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;Since its initial release, ComponentArt Grid has been perceived as one of the most valuable controls within the Web.UI suite. Our Grid-related R&amp;amp;D work has introduced many important innovations into the ASP.NET control space: client running mode, client-side structure creation, client templates and direct binding with web services, just to name a few. We are excited to push the capabilities of this control even further by adding the following features in v2008.2: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multi-level grouping (web service running mode only)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Header context menus&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Improved editing capabilities&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Revamped keyboard support&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Client-side sub-level sorting&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Templated footer rows &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;New Suite-Wide Features&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;The following suite-wide features are being added with v2008.2: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extended support for direct binding with ASP.NET AJAX web services&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Accessible output and Section 508 compliance&amp;nbsp;&lt;/li&gt;
&lt;li&gt;ASP.NET MVC support&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Extended keyboard support&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Revamped product documentation &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Release Dates - &lt;span style="color:red;"&gt;Updated!&lt;/span&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The anticipated release dates for Web.UI 2008.2 are as follows: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Beta Release: Week of August 18, 2008&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Full Release:&amp;nbsp; Week of September 15, 2008&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please note that these release dates are based on our best estimate and are subject to change. &lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/miljan/archive/2008/07/10/componentart-web-ui-2008-2-details-announced.aspx&amp;amp;;subject=ComponentArt+Web.UI+2008.2+Details+Announced" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2008/07/10/componentart-web-ui-2008-2-details-announced.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/miljan/archive/2008/07/10/componentart-web-ui-2008-2-details-announced.aspx&amp;amp;;title=ComponentArt+Web.UI+2008.2+Details+Announced" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2008/07/10/componentart-web-ui-2008-2-details-announced.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/miljan/archive/2008/07/10/componentart-web-ui-2008-2-details-announced.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2008/07/10/componentart-web-ui-2008-2-details-announced.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/miljan/archive/2008/07/10/componentart-web-ui-2008-2-details-announced.aspx&amp;amp;title=ComponentArt+Web.UI+2008.2+Details+Announced" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2008/07/10/componentart-web-ui-2008-2-details-announced.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=20502" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Web.UI/default.aspx">Web.UI</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Input/default.aspx">Input</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/ColorPicker/default.aspx">ColorPicker</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Slider/default.aspx">Slider</category></item><item><title>WebChart Drilldown Demo: A pathway to greater things</title><link>http://www.componentart.com/BLOGS/filip/archive/2008/06/20/webchart-drilldown-demo-a-pathway-to-greater-things.aspx</link><pubDate>Fri, 20 Jun 2008 19:03:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:19907</guid><dc:creator>Filip</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Upon visiting the &lt;a href="http://www.componentart.com/charting/gallery/samples/ajax/drilldown/" title="Drill-down live demo" target="_blank"&gt;drill-down live demo&lt;/a&gt; in CompoentArt&amp;#39;s new Charting gallery one can easily see the benefits of client-side events within WebChart&amp;#39;s client-side API.&amp;nbsp; Not only can you register event handlers when a data point or series is hovered over, but in that event handler you get access to the data point, series and chart client-side objects that are related to the data point. This goes a long way in building interactive UIs that show more information than just a chart image.&lt;/p&gt;

&lt;p&gt;But this is not the only interesting piece of code used in this demo.&amp;nbsp; The demo also uses custom properties set on the client-side in order to customize the SQL query to the data source, and come up with a unique image from the same WebChart instance.&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s take a closer look at both of these techniques.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client-side Event handlers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you take a look at the code behind the drill-down demo (available in the sample project that comes with the installation of WebChart 2008.1 or by pressing the SHOW CODE button in the demo) you&amp;#39;ll notice that the mouse hover event handler is simply registered in the ASPX page with the following code within the WebChart tag:&lt;br /&gt;
&lt;/p&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;&amp;lt;ClientEvents&amp;gt;&lt;br /&gt;    &amp;lt;DataPointHover EventHandler=&amp;quot;onDpHover&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;DataPointExit EventHandler=&amp;quot;onDpExit&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/ClientEvents&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
In the call to the JavaScript onDpHover function, we will receive two parameters.&amp;nbsp; The first will be the &lt;a href="http://www.componentart.com/docs/default.aspx?content=WebChart/ComponentArt.Charting~WebChart_members.htm" title="Client-side documentation" target="_blank"&gt;WebChart&lt;/a&gt; instance that generated the event, while the second will be a &lt;span id="ContentLabel" style="display:inline-block;width:100%;"&gt;&lt;span class="pageheader"&gt;&lt;a href="http://www.componentart.com/docs/default.aspx?content=WebChart/ComponentArt.Charting~DataPointHoverEventArgs_members.htm" title="Client-side API documentation" target="_blank"&gt;DataPointHoverEventArgs&lt;/a&gt; instance.&amp;nbsp; We can use these two classes to extract any data relevant to the &lt;a href="http://www.componentart.com/docs/default.aspx?content=WebChart/ComponentArt.Charting~DataPoint_members.htm" title="Client-side documentation" target="_blank"&gt;data point&lt;/a&gt;, its parent series (available from the DataPoint class), or the WebChart (also available through the parent series of the datapoint).&amp;nbsp; In this example we simply pop up a DIV which shows the Y value of the data point that is hovered over, along with its X label.&amp;nbsp; However, this API can be used in many powerful ways:&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;ul&gt;
&lt;li&gt;To add up the values of all data points in a series and display a total&lt;/li&gt;

&lt;li&gt;To find if certain data points fall within a dangerous range in order to pop up a warning&lt;/li&gt;

&lt;li&gt;Create links, or fire function calls that are relevant to the data point or series&lt;/li&gt;

&lt;li&gt;Update additional parts of the UI that may be related to the data point or series&lt;/li&gt;
&lt;/ul&gt;
It is also important to note that this functionality was made possible by enabling WebChart&amp;#39;s &lt;em&gt;&lt;span style="color:#000000;"&gt;RenderAreaMap,&lt;em&gt; &lt;/em&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="color:#000000;"&gt;Clientside.SerializeDatapoints&lt;/span&gt;&lt;em&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;/em&gt;&lt;span style="color:#000000;"&gt;&lt;em&gt; &lt;/em&gt;and&lt;/span&gt;&lt;em&gt;&lt;span style="color:#000000;"&gt; Clientside.ClientsideApiEnabled &lt;/span&gt;&lt;/em&gt;&lt;span style="color:#000000;"&gt;boolean properties in the server-side code.&lt;/span&gt;&lt;span class="pageheader"&gt;&lt;/span&gt;&lt;span id="ContentLabel" style="display:inline-block;width:100%;"&gt;&lt;/span&gt; 
&lt;p&gt;&lt;strong&gt;Custom Properties&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In addition to client-side events the Drill-down demo uses custom properties in order to pass additional data to the server-side.&amp;nbsp; Custom properties are set on the client-side through WebChart&amp;#39;s &lt;a href="http://www.componentart.com/docs/default.aspx?content=WebChart/ComponentArt.Charting~WebChart_setCustomProperty_method.htm" title="Client-sde documentation" target="_blank"&gt;setCustomProperty(&lt;em&gt;key, value&lt;/em&gt;)&lt;/a&gt; method and retrieved on the server-side through the String GetCustomProperty(string key) method.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;The method provides a way for developers to quickly pass parameters
from the client-side to the server-side code in a way that is optimized
to take as little overhead as possible. The developer can then retrieve
the parameters in the server-side code and change the WebChart instance or any other server-side code
in any way imaginable. &lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;In the Drill-down demo, we use the custom properties in order to customize the SQL query to the database.&amp;nbsp; We pass values of MONTH, YEAR and DAY for the period custom property in order to customize the SQL query to sum up the daily sales from the database for the given period, and produce a suitable data source for the WebChart based on the period chosen.&lt;/p&gt;

&lt;p&gt;This concept can easily be extended to: &lt;br /&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the data that the user wants displayed in the chart&lt;/li&gt;

&lt;li&gt;Select functions that the user wants applied to data (max, min, derivative or any custom function) &lt;br /&gt;
&lt;/li&gt;

&lt;li&gt;Apply a custom template to the chart upon a user action, based on user preferences &lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;strong&gt;Caching Customized Charts&lt;/strong&gt;&lt;br /&gt;

&lt;p&gt;In addition to providing flexibility to a single WebChart instance, use of custom properties can be important when caching chart images. Since our live demo is posted on a high-traffic site, and the data in the sample database does not get updated, we do not have to render a new chart for every request made to the page.&amp;nbsp; Furthermore we know that all charts with the same custom properties (i.e. MONTH view, December, 2004) will produce the same image.&amp;nbsp; Since setting custom properties on a chart makes that chart customized we want to enable caching for customized images in order to save our CPU from needlessly rendering images.&lt;br /&gt;
&lt;/p&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;WebChart1.Clientside.ClientsideCustomizedImageCachingEnabled = true;&lt;br /&gt;WebChart1.CacheInterval = 86400; //1 day in seconds &lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This ensures that each unique chart image is rendered once daily and the same image is reused (with virtually no overhead) for all subsequent requests within a day.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Even though at first glance the Drill-down demo looks the least impressive of the three live demos, when you look under the hood you&amp;#39;ll find a lot of features to get excited about.&amp;nbsp; Whether you&amp;#39;re building powerful and interactive UIs, allowing end-users to customize the data shown in the chart or designing your web app to be CPU conscious and take advantage of caching you can use this demo with its sample code as the starting point to implementing the techniques described above.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/filip/archive/2008/06/20/webchart-drilldown-demo-a-pathway-to-greater-things.aspx&amp;amp;;subject=WebChart+Drilldown+Demo%3a+A+pathway+to+greater+things" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/06/20/webchart-drilldown-demo-a-pathway-to-greater-things.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/filip/archive/2008/06/20/webchart-drilldown-demo-a-pathway-to-greater-things.aspx&amp;amp;;title=WebChart+Drilldown+Demo%3a+A+pathway+to+greater+things" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/06/20/webchart-drilldown-demo-a-pathway-to-greater-things.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/filip/archive/2008/06/20/webchart-drilldown-demo-a-pathway-to-greater-things.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/06/20/webchart-drilldown-demo-a-pathway-to-greater-things.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/filip/archive/2008/06/20/webchart-drilldown-demo-a-pathway-to-greater-things.aspx&amp;amp;title=WebChart+Drilldown+Demo%3a+A+pathway+to+greater+things" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/06/20/webchart-drilldown-demo-a-pathway-to-greater-things.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=19907" width="1" height="1"&gt;</description></item><item><title>WebChart AJAX Zooming and Scrolling: How to get the most out of your data</title><link>http://www.componentart.com/BLOGS/filip/archive/2008/06/18/WebChart-AJAX-Zooming-and-Scrolling_3A00_-how-to-get-the-most-out-of-your-data.aspx</link><pubDate>Wed, 18 Jun 2008 17:32:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:19781</guid><dc:creator>Filip</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Zooming and scrolling is one of those essential features that is a must-have for any comprehensive charting product.&amp;nbsp; However, deciding how to implement zooming and scrolling within WebChart was not obvious as there was no industry consensus on how this feature should look and operate, let alone how it should be implemented.&lt;/p&gt;

&lt;p&gt;Our first decision was an easy one as it had to do with the technology used to implement the feature.&amp;nbsp; Right away we knew that we did not want any third party plug-ins (including Flash) to be needed in order to use the feature.&amp;nbsp; It had to be pure JavaScript and DHTML, yet still look good and be user-friendly.&amp;nbsp; The reason for this was not only ease of compatibility with virtually all of today&amp;#39;s environments but also the ease of customization for our customers.&amp;nbsp; The second decision had to do with how the feature should work.&amp;nbsp; Some common implementations allow end users to use the mouse to draw a rectangle that represents the area that you want to zoom into.&amp;nbsp; This fairly useful,&amp;nbsp; however zooming out is not elegant with this model.&amp;nbsp; In addition to zooming, we also wanted to give the end user the ability to scroll through large sets of data, which was not possible with this implementation.&lt;/p&gt;

&lt;p&gt;So we decided to go with an implementation that uses a second instance of WebChart as the zooming and scrolling control, as seen in our &lt;a href="http://www.componentart.com/charting/gallery/samples/ajax/zooming/" target="_blank"&gt;demo&lt;/a&gt;.&amp;nbsp; This was the only implementation that satisfied all of our requirements while still visually looking good and being user friendly.&amp;nbsp; Below is a capture of the control in action:
&lt;/p&gt;

&lt;div style="text-align:center;"&gt;
&lt;img src="http://www.componentart.com/blogs/filip/images/zoomin_range_display.PNG" /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Configuring Your Own Control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ComponentArt&amp;#39;s concept of a zooming and scrolling control is a simple one.&amp;nbsp; You create another instance of WebChart, set its &lt;em&gt;Clientside.IsScrollControll &lt;/em&gt;property to true, and finally connect it to all the charts you want to control with this instance (yes, this means one zooming and scrolling control can control multiple WebCharts).&amp;nbsp; When the page is rendered in the browser, the control chart will be enhanced with the scrollbar and the shading which will allow the end user to zoom and scroll.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;The best way to get started with zooming and scrolling is to take a look at the &lt;a href="http://www.componentart.com/charting/gallery/samples/ajax/zooming/" title="Zooming and Scrolling demo" target="_blank"&gt;live demo&lt;/a&gt; of the zooming and scrolling control.&amp;nbsp; It is advisable to then read the &lt;a href="http://www.componentart.com/docs/default.aspx?content=WebChart/WebChart_scrolling_and_zooming.htm" title="Zooming and Scrolling documentation" target="_blank"&gt;documentation&lt;/a&gt; of this feature as well as look at the code that makes up the live demo (both of which are also available through the documentation and the sample project that come with the installation of WebChart 2008.1)&amp;nbsp;&lt;/p&gt;

&lt;p&gt;When you feel you&amp;#39;re ready to make your own control, here are a few tips to keep in mind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connecting your display chart to the control chart is done through the display chart&amp;#39;s &lt;em&gt;Clientside.MyScrollControl,&lt;/em&gt; which should be set to point to the instance of the control chart.&amp;nbsp; This allows multiple display charts to be controlled by a single control chart&lt;/li&gt;

&lt;li&gt;Always use the same data source in the control and display chart.&amp;nbsp; This prevents the data in the display chart from falling out of sync with data in the control chart.&amp;nbsp; The result of this is that the display chart will have more data than needs to be displayed at any one time, but this is the correct implementation, further explained in point 3 below.&lt;/li&gt;

&lt;li&gt;Set the initial display range through control chart&amp;#39;s server-side &lt;em&gt;SetZoomRange(from, to)&lt;/em&gt; method.&amp;nbsp; This sets the appropriate display range on all the controlled charts, as well as shade in the appropriate region when the scroll control renders. The parameters passed need to be of the same type as the values in the X axis, either DateTime, String or numeric.&amp;nbsp; The call to SetZoomRange needs to be done before any of the display charts perform their data binding, in order for the appropriate range of data to be extracted from the data source.&amp;nbsp; For this reason it could be considered good programming practice for the control chart code to precede the display chart&amp;#39;s code.&lt;/li&gt;

&lt;li&gt;Do not set &lt;em&gt;WebChart.CoordinateSystem.XAxis.MinValue&lt;/em&gt; or &lt;em&gt;CoordinateSystem.XAxis.MaxValue &lt;/em&gt;on the display chart as that will override the values set by the zooming and scrolling control.&lt;/li&gt;

&lt;li&gt;Setting &lt;em&gt;WebChart.AdjustReferenceValue&lt;/em&gt; to true will zoom in to show just the Y range in which all the values in the current chart fall into.&amp;nbsp; This is very handy for use with display charts that have large and varied data sets.&lt;/li&gt;

&lt;li&gt;Customize the look and feel of the zooming and scrolling control by changing the images for the scrollbar, the shadow color, shadow opacity as well as the HTML and the position of the Range Display pop-up.&amp;nbsp; See the &lt;a href="http://www.componentart.com/docs/default.aspx?content=WebChart/WebChart_scrolling_and_zooming.htm#Customization" title="Customizing the zooming and scrolling control" target="_blank"&gt;documentation&lt;/a&gt; on how to do this.&lt;/li&gt;

&lt;li&gt;Align the axis of the control chart to the beginning and end of the scroll bar.&amp;nbsp; This is done by matching the left and right margin to the width of the arrows on the ends of the scroll bar.&amp;nbsp; Since WebChart&amp;#39;s margin widths are set in percentages, we need to match that to the pixel widths of the arrow images.&amp;nbsp; So if the scroll bar arrow images are 15 pixels wide and the chart is 500 pixels wide, the following code will do the trick:&lt;br /&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;WebChart2.View.Margins.Left = (15.0 / 500) * 100;&lt;br /&gt;WebChart2.View.Margins.Right = (15.0 / 500) * 100;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;

&lt;li&gt;Use WebChart&amp;#39;s client-side API to dynamically set the active display range.&amp;nbsp; For example if you want to have a button that will set the range to show year to date, you need to execute the following JavaScript code when the button is pressed:&lt;br /&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;var startD = new Date();&lt;br /&gt;var endD = new Date();&lt;br /&gt;startD.setFullYear(2008,1,1);&lt;br /&gt;WebChart2.rangePicker.selectRange(startD, endD);&lt;/pre&gt;
&lt;/div&gt;
Again, the parameters passed to the method need to match the type of the X axis dimension, either Date, String or numeric.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;
That&amp;#39;s it from me for now, I hope you find these tips helpful when creating your zoom and scroll charts.&amp;nbsp; I will write more about WebChart&amp;#39;s other cool client-side features in upcoming posts.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/filip/archive/2008/06/18/WebChart-AJAX-Zooming-and-Scrolling_3A00_-how-to-get-the-most-out-of-your-data.aspx&amp;amp;;subject=WebChart+AJAX+Zooming+and+Scrolling%3a+How+to+get+the+most+out+of+your+data" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/06/18/WebChart-AJAX-Zooming-and-Scrolling_3A00_-how-to-get-the-most-out-of-your-data.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/filip/archive/2008/06/18/WebChart-AJAX-Zooming-and-Scrolling_3A00_-how-to-get-the-most-out-of-your-data.aspx&amp;amp;;title=WebChart+AJAX+Zooming+and+Scrolling%3a+How+to+get+the+most+out+of+your+data" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/06/18/WebChart-AJAX-Zooming-and-Scrolling_3A00_-how-to-get-the-most-out-of-your-data.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/filip/archive/2008/06/18/WebChart-AJAX-Zooming-and-Scrolling_3A00_-how-to-get-the-most-out-of-your-data.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/06/18/WebChart-AJAX-Zooming-and-Scrolling_3A00_-how-to-get-the-most-out-of-your-data.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/filip/archive/2008/06/18/WebChart-AJAX-Zooming-and-Scrolling_3A00_-how-to-get-the-most-out-of-your-data.aspx&amp;amp;title=WebChart+AJAX+Zooming+and+Scrolling%3a+How+to+get+the+most+out+of+your+data" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/06/18/WebChart-AJAX-Zooming-and-Scrolling_3A00_-how-to-get-the-most-out-of-your-data.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=19781" width="1" height="1"&gt;</description></item><item><title>Charting 2008.1 -  Boldly Going Where No AJAX Chart Has Gone Before</title><link>http://www.componentart.com/BLOGS/miljan/archive/2008/06/17/charting-2008-1-boldly-going-where-no-ajax-chart-has-gone-before.aspx</link><pubDate>Tue, 17 Jun 2008 18:24:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:19910</guid><dc:creator>Miljan</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;We are thrilled to announce the &lt;a href="http://www.componentart.com/default.aspx"&gt;release&lt;/a&gt; of ComponentArt Charting 2008.1. This product has been in the works for well over a year and it brings a number of truly important new features to the market. At this time I would like to highlight the two most significant areas of product improvement in v2008.1, and the Charting development team will follow up with additional juicy details related to the new functionality. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;AJAX Interactivity&lt;/strong&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.componentart.com/charting/gallery/" title="Interactive AJAX Charts - Gallery"&gt;&lt;img alt="Interactive AJAX Charts" border="0" height="172" src="http://www.componentart.com/blogs/miljan/images/2008_06_17_AjaxCharts.png" style="width:680px;height:172px;" title="Interactive AJAX Charts" width="680" /&gt;&lt;/a&gt;&amp;nbsp; &lt;br /&gt;We think that the new &lt;a href="http://www.componentart.com/charting/gallery/samples/ajax/toolbar/" title="Interactive AJAX Chart ToolBar Demo"&gt;view angle chooser&lt;/a&gt;, &lt;a href="http://www.componentart.com/charting/gallery/samples/ajax/zooming/" title="AJAX Zooming and Scrolling Chart"&gt;zooming and scrolling&lt;/a&gt; UI and the &lt;a href="http://www.componentart.com/charting/gallery/samples/ajax/drilldown/" title="AJAX Drill-down Chart"&gt;drill-down&lt;/a&gt; features push AJAX capabilities further than any other charting solution on the market. A key point here is that all of these features were implemented through the brand-new &lt;a href="http://www.componentart.com/docs/default.aspx?content=WebChart/ComponentArt.Charting~ComponentArt.Charting_namespace.htm" title="WebChart Client-side API Reference"&gt;client-side API&lt;/a&gt; of the WebChart control. We are only scratching the surface of what can be done by showing a few practical applications of this API. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Dual Rendering Engines&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.componentart.com/charting/gallery/" title="Dual Charting Rendering Engines - Gallery"&gt;&lt;img alt="Dual Charting Rendering Engines" border="0" height="310" src="http://www.componentart.com/blogs/miljan/images/2008_06_17_DualEngines.png" style="width:430px;height:310px;" title="Dual Charting Rendering Engines" width="430" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The 2008.1 release of Charting for .NET introduces a new high-speed rendering engine, augmenting ComponentArt&amp;#39;s famous 3D rendering quality with the ability to produce GDI+ chart renderings in high-traffic environments. All charts within our &lt;a href="http://www.componentart.com/charting/gallery/" title="Charting 2008.1 Gallery"&gt;brand-new gallery&lt;/a&gt; can now be viewed through&amp;nbsp;both rendering engines. &lt;/p&gt;&lt;p&gt;I hope this&amp;nbsp;has served as a nice high-level overview of the most important new features in v2008.1. Many additional details will follow in the coming days and weeks. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/miljan/archive/2008/06/17/charting-2008-1-boldly-going-where-no-ajax-chart-has-gone-before.aspx&amp;amp;;subject=Charting+2008.1+-++Boldly+Going+Where+No+AJAX+Chart+Has+Gone+Before" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2008/06/17/charting-2008-1-boldly-going-where-no-ajax-chart-has-gone-before.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/miljan/archive/2008/06/17/charting-2008-1-boldly-going-where-no-ajax-chart-has-gone-before.aspx&amp;amp;;title=Charting+2008.1+-++Boldly+Going+Where+No+AJAX+Chart+Has+Gone+Before" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2008/06/17/charting-2008-1-boldly-going-where-no-ajax-chart-has-gone-before.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/miljan/archive/2008/06/17/charting-2008-1-boldly-going-where-no-ajax-chart-has-gone-before.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2008/06/17/charting-2008-1-boldly-going-where-no-ajax-chart-has-gone-before.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/miljan/archive/2008/06/17/charting-2008-1-boldly-going-where-no-ajax-chart-has-gone-before.aspx&amp;amp;title=Charting+2008.1+-++Boldly+Going+Where+No+AJAX+Chart+Has+Gone+Before" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2008/06/17/charting-2008-1-boldly-going-where-no-ajax-chart-has-gone-before.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=19910" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/ASP.NET+Graphs/default.aspx">ASP.NET Graphs</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/AJAX+Charts/default.aspx">AJAX Charts</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/ComponentArt+WebChart/default.aspx">ComponentArt WebChart</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/ASP.NET+Charts/default.aspx">ASP.NET Charts</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Componentart+Charting+2008.1/default.aspx">Componentart Charting 2008.1</category></item><item><title>Grid Configuration via Web Service</title><link>http://www.componentart.com/BLOGS/milos/archive/2008/06/13/grid-configuration-via-web-service.aspx</link><pubDate>Fri, 13 Jun 2008 13:35:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:19796</guid><dc:creator>Milos</dc:creator><slash:comments>4</slash:comments><description>&lt;br /&gt;
Since the introduction of the WebService running mode in ComponentArt Grid, and related functionality (like the client-side load method), we have seen this approach rapidly gain popularity and, naturally, produce demands for more features and more versatility.
&lt;br /&gt;
&lt;br /&gt;
Versatility is key when it comes to UI controls, so we have been spending some time improving WebService mode in this respect. As of Web.UI 2008.2 SP2 (build 2008.2.1180) Grid has a number of new features.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;WebServiceConfigMethod&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to being able to define ASP.NET AJAX web service methods for data selection, insertion, deletion, etc, it is now also possible to perform Grid configuration in a web service.
&lt;br /&gt;
&lt;br /&gt;
Rather than defining top-level properties, &lt;em&gt;GridLevels&lt;/em&gt; and their constituent &lt;em&gt;GridColumns&lt;/em&gt; and all the accompanying styles on the ASPX page where the Grid instance is placed, all of these can now be loaded on the fly by defining the &lt;em&gt;WebServiceConfigMethod&lt;/em&gt; server-side property and calling the client-side &lt;em&gt;webServiceConfig&lt;/em&gt; method.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;GridWebServiceConfigResponse&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
The web service method performing Grid configuration is expected to return an object of the type &lt;em&gt;GridWebServiceConfigResponse&lt;/em&gt;. Such an object contains top-level property settings (contained in the &lt;em&gt;Properties&lt;/em&gt; member), and &lt;em&gt;GridLevel&lt;/em&gt; definitions (contained in the Levels property) which, in turn, can contain &lt;em&gt;GridColumns&lt;/em&gt;.
&lt;br /&gt;
&lt;br /&gt;
Configuration can be done at any time on the client, without going back to the server from which the ASPX file originated. The configuration request passes in an optional custom parameter, so that configuration can be context-dependent. 
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;GridWebServiceSelectRequest.Columns&lt;/strong&gt; 
&lt;br /&gt;
&lt;br /&gt;
To enable such potential on-the-fly changes to the Grid&amp;rsquo;s layout and definition, &lt;em&gt;GridWebServiceSelectRequest&lt;/em&gt; now contains a &lt;em&gt;Columns&lt;/em&gt; property. With every web service data request, Grid now sends along the collection of columns (data fields) that it expects on the client. This allows the web service selection logic to account for on-the-fly changes in the Grid&amp;rsquo;s client-side configuration, and always provide the required data.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;And More&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the above, a number of other enhancements to web service functionality have been made which should simplify its use in many scenarios and enable altogether new ones.
&lt;br /&gt;
&lt;br /&gt;
For example, &lt;em&gt;GridWebServiceSelectResponse.Items&lt;/em&gt; can now contain simple arrays of objects corresponding to the rows of data requested by the Grid. Simple proxy classes no longer need to be defined, as long as the order of data in the arrays matches the fields specified in &lt;em&gt;GridWebServiceSelectRequest.Columns&lt;/em&gt;.
&lt;br /&gt;
&lt;br /&gt;
The select response can now also contain hierarchical data, with rows containing more rows defined on the second (or third, etc) &lt;em&gt;GridLevel&lt;/em&gt;. To keep on topic, I will write more on this particular functionality at a later date.
&lt;br /&gt;
&lt;br /&gt;
Cheers, and thanks for stopping by!
&lt;br /&gt;
&lt;br /&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/milos/archive/2008/06/13/grid-configuration-via-web-service.aspx&amp;amp;;subject=Grid+Configuration+via+Web+Service" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/06/13/grid-configuration-via-web-service.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/milos/archive/2008/06/13/grid-configuration-via-web-service.aspx&amp;amp;;title=Grid+Configuration+via+Web+Service" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/06/13/grid-configuration-via-web-service.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2008/06/13/grid-configuration-via-web-service.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/06/13/grid-configuration-via-web-service.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2008/06/13/grid-configuration-via-web-service.aspx&amp;amp;title=Grid+Configuration+via+Web+Service" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/06/13/grid-configuration-via-web-service.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=19796" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/Grid/default.aspx">Grid</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/web+services/default.aspx">web services</category></item><item><title>AJAX With ASP.NET MVC and ComponentArt CallBack</title><link>http://www.componentart.com/BLOGS/milos/archive/2008/05/01/asp-net-mvc-and-ajax.aspx</link><pubDate>Thu, 01 May 2008 18:08:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:18817</guid><dc:creator>Milos</dc:creator><slash:comments>3</slash:comments><description>&lt;br /&gt;
Web.UI vNext (preview build included in attached project packages) will include, among other things, a new feature of the CallBack control which will allow it to become extremely useful for integrating AJAX functionality in web applications build on Microsoft&amp;rsquo;s new ASP.NET MVC framework.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;About Microsoft ASP.NET MVC&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
A few months ago, Microsoft announced a new, alternative framework for ASP.NET applications built around the &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;model-view-controller&lt;/a&gt; architecture pattern. Scott Guthrie &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx"&gt;blogged about it&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx"&gt;described in detail&lt;/a&gt; how this framework operates. Though still in a preview stage, ASP.NET MVC has already generated a lot of buzz and interest, and promises to be an important factor for some types of web apps. However, ASP.NET MVC has no AJAX support out of the box.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;About ComponentArt CallBack&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
ComponentArt CallBack is a relatively simple ASP.NET control which contains HTML content and allows it to be updated asynchronously via AJAX calls back to the server. In a typical web form, the request is sent back to the page of origin and is handled by the control itself, which raises an event, allowing the developer to compose the content to be sent to the client.
&lt;br /&gt;
&lt;br /&gt;
A new feature introduced to CallBack for the next version of Web.UI is the client-side &lt;strong&gt;loadUrl&lt;/strong&gt; method. This method allows the control to asynchronously call up any URL and display the content returned within its element on the page. This feature is useful for all sorts of situations, including rapid integration of partial AJAX updates in web applications built on Microsoft&amp;rsquo;s ASP.NET MVC framework.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ASP.NET MVC and ComponentArt CallBack&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
ASP.NET MVC request routing operates according to conventions for HTTP GET requests. Requests for pages are of the form &lt;em&gt;/Controller/Action/Id&lt;/em&gt;, and the logic of the application is built to follow this flow: the appropriate Controller accepts the request, and handles the requested action by performing the appropriate business logic (in conjunction with the Model) and passing resulting data to the appropriate View which is then rendered to the client.
&lt;br /&gt;
&lt;br /&gt;
This architecture is a complete departure from that of ASP.NET web forms, which is based on postbacks and persistence of control state. The traditional use of CallBack (by raising server-side events to handle a callback request) is no longer applicable. However, with the addition of the loadUrl method, CallBack fits perfectly into the ASP.NET MVC architecture and provides the easiest and most integrated way of performing partial AJAX updates in an ASP.NET MVC application.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;How it Works&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
When designing functionality that is to be useful for ASP.NET MVC apps, we found that less is more. Since the MVC model forces us to drop most of the complexities of the ASP.NET web form life cycle, control state and server-side events, we are left with just the basics of HTTP. In this case, that is all we need, and it is also the best way to seamlessly integrate into the MVC way of doing things.
&lt;br /&gt;
&lt;br /&gt;
CallBack&amp;#39;s &lt;strong&gt;loadUrl&lt;/strong&gt; method causes CallBack&amp;rsquo;s content to be loaded from the given URL, which, of course, can follow MVC conventions. We are therefore able to have a CallBack control on an MVC View Page (say, CallBack1), get it rendered to the client, and from that point, only interact with it on the client side, to perform actions and load new content, with typical calls like these:
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;CallBack1.loadUrl(&amp;#39;/Search/Beverages/23&amp;#39;);
CallBack1.loadUrl(&amp;#39;/Products/List/Beverages&amp;#39;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
On the server, layout is organized as a standard ASPX View, with distinct parts encapsulated in ASCX views.
&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://www.componentart.com/blogs/milos/images/MVC_CallBack_Diagram_1.png" /&gt;
&lt;br /&gt;
&lt;br /&gt;
After the initial ASPX view is loaded, those parts of it which are encapsulated in ASCX views (and placed inside instances of ComponentArt CallBack) can be updated asynchronously.
&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://www.componentart.com/blogs/milos/images/MVC_CallBack_Diagram_2.png" /&gt;
&lt;br /&gt;
&lt;br /&gt;
Organizing content areas in ASCX views is the key component of our MVC AJAX solution.
&lt;br /&gt;
&lt;br /&gt;
The loadUrl method also takes an optional second parameter, POST data. If data needs to be sent that is not part of the URL (including the optional query string), it can be combined into a POST data string on the client (in the form &amp;quot;name1=value1&amp;amp;name2=value2&amp;quot;) and passed to loadUrl. It will be available in the MVC controller as part of the Request.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Examples&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
To illustrate these ideas, I include two examples below. With these web application projects, I have tried to demonstrate how Web.UI controls can be used in the context of MVC, including how partial AJAX updates can be performed with the CallBack control while maintaining the full MVC pattern. There are two separate applications:
&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;a href="http://www.componentart.com/blogs/milos/files/MvcChartGallery.zip"&gt;MvcChartGallery&lt;/a&gt;&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;
This ASP.NET MVC web application is an adaptation of a typical application dealing with hierarchical data, featuring ComponentArt Web.UI controls. The architecture of the web application uses simple one-time rendering of the controls, taking them out of the paradigm of web forms. Interaction with the controls causes full-page refreshes with appropriate MVC routing. Context data is passed in URL query parameters.
&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;a href="http://www.componentart.com/blogs/milos/files/MvcAjaxChartGallery.zip"&gt;MvcAjaxChartGallery&lt;/a&gt;&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;
This ASP.NET MVC web application is a reworking of the above example which encapsulates autonomous areas of the UI into MVC User Control Views, which are in turn placed inside instances of ComponentArt CallBack, allowing them to be updated independently and asynchronously (see diagram 2). Most importantly, these partial updates are HTTP requests MVC User Control Views and are fully routed through MVC. They can be treated in the same way as any other MVC request, and application logic does not need to do anything special to allow for this asynchronous operation, nor indeed to be aware of it at all.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
Though still in an early preview stage, ASP.NET MVC has attracted a lot of interest and shows a lot of promise to grow into an important web technology. However, as of yet, ASP.NET MVC has no built-in AJAX support. Despite its divorce from web forms, applications built on ASP.NET MVC can still utilize rich ComponentArt Web.UI controls, and use the CallBack control, in particular, to quickly and easily add AJAX functionality in a way that seamlessly fits into the MVC pattern.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/milos/archive/2008/05/01/asp-net-mvc-and-ajax.aspx&amp;amp;;subject=AJAX+With+ASP.NET+MVC+and+ComponentArt+CallBack" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/05/01/asp-net-mvc-and-ajax.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/milos/archive/2008/05/01/asp-net-mvc-and-ajax.aspx&amp;amp;;title=AJAX+With+ASP.NET+MVC+and+ComponentArt+CallBack" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/05/01/asp-net-mvc-and-ajax.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2008/05/01/asp-net-mvc-and-ajax.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/05/01/asp-net-mvc-and-ajax.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2008/05/01/asp-net-mvc-and-ajax.aspx&amp;amp;title=AJAX+With+ASP.NET+MVC+and+ComponentArt+CallBack" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/05/01/asp-net-mvc-and-ajax.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=18817" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/CallBack/default.aspx">CallBack</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/Web.UI/default.aspx">Web.UI</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/mvc/default.aspx">mvc</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category></item><item><title>TreeView and Web Services</title><link>http://www.componentart.com/BLOGS/milos/archive/2008/04/23/treeview-and-web-services.aspx</link><pubDate>Wed, 23 Apr 2008 17:49:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:18564</guid><dc:creator>Milos</dc:creator><slash:comments>4</slash:comments><description>&lt;br /&gt;
In my &lt;a href="http://www.componentart.com/blogs/milos/archive/2008/04/01/web-ui-navigation-controls-and-web-services.aspx"&gt;previous post&lt;/a&gt;, I talked about the web service functionality that&amp;#39;s common to all ComponentArt navigation controls. I focused on common features that are present in many different controls, especially in this case, but this approach was unfair to one control. With its ability to load chunks of data on demand, TreeView is the odd man out, supporting everything that other navigation controls do, but adding its own unique twist.
&lt;br /&gt;
&lt;br /&gt;
Like the other navigation controls, TreeView has control-level &lt;strong&gt;WebService&lt;/strong&gt; and 
&lt;strong&gt;WebServiceMethod&lt;/strong&gt; properties. These determine which ASP.NET AJAX registered web service will be called, and which method of that service, when nodes are retrieved. For the initial data load, the behaviour is identical to Menu, TabStrip or NavBar. What TreeView can do that others can not is to only load some nodes initially, letting user actions determine what else gets loaded and when. Essentially, TreeView is able to operate in load-on-demand mode with web services.
&lt;br /&gt;
&lt;br /&gt;
To return load-on-demand nodes (parent nodes with no child nodes pre-loaded), simply set their 
&lt;strong&gt;UseWebService&lt;/strong&gt; property to true. This will notify TreeView to consider these nodes to be parent nodes, and to call the web service again when they are expanded, to load their child nodes. When that happens, the same WebServiceMethod will be called, but with a twist: the
&lt;strong&gt;TreeViewWebServiceRequest&lt;/strong&gt; object that is passed in will have its &lt;strong&gt;Node&lt;/strong&gt; property set to the node that requires data. Based on the Text, Value or ID of this node, appropriate new nodes can be created and returned, as they would normally, from the web service method. Note that these child nodes can also have their UseWebService property set to true.
&lt;br /&gt;
&lt;br /&gt;
After a web service call completes, the client-side event also exposes the node for which the call was made, in addition to the &lt;strong&gt;customData&lt;/strong&gt; property common to all navigation controls. Here&amp;#39;s an overview of the client-side &lt;strong&gt;TreeViewNodeWebServiceCompleteEventArgs&lt;/strong&gt; class:
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border:1px solid #808080;padding:10px;font-family:courier new;background-color:#e5e5e5;text-align:left;"&gt;
&lt;pre&gt;function TreeView1_webServiceComplete(sender, eventArgs)
{
  var node = eventArgs.get_node();
  
  if(node)
  {
    alert(&amp;#39;Completed web service call for node &amp;#39; + node.get_text());
  }
  else
  {
    alert(&amp;#39;Completed web service call for top level data.&amp;#39;);
  }
  
  var customData = eventArgs.get_customData();
  
  if(customData)
  {
    alert(&amp;#39;Web service call returned custom data: &amp;#39; + customData);
  }
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
You can see an example of this functionality online with the &lt;a href="http://www.componentart.com/webui/demos/demos_technology-showcase/web-services_ajax/treeview_loadFromWebService/default.aspx"&gt;TreeView Web Service Load-on-demand sample&lt;/a&gt;. Please note that this functionality is fully available only as of Web.UI 2008.1 SP1, released on April 23rd 2008.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Summary&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
To recap, since TreeView can load node-specific partial data through web services (unlike other navigation controls, which can only load all the items at once), its related API is a superset of, say, that of Menu. 
&lt;strong&gt;TreeViewWebServiceRequest&lt;/strong&gt; includes the &lt;strong&gt;Node&lt;/strong&gt; property (null for initial, top-level loading), 
&lt;strong&gt;TreeViewNode&lt;/strong&gt; has the &lt;strong&gt;UseWebService&lt;/strong&gt; boolean, and the client-side &lt;strong&gt;TreeViewWebServiceCompleteEventArgs&lt;/strong&gt; class includes a 
&lt;strong&gt;node&lt;/strong&gt; property. These extensions enable efficient load-on-demand functionality built entirely on ASP.NET AJAX web services.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.componentart.com/BLOGS/milos/archive/2008/04/23/treeview-and-web-services.aspx&amp;amp;;subject=TreeView+and+Web+Services" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/04/23/treeview-and-web-services.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/milos/archive/2008/04/23/treeview-and-web-services.aspx&amp;amp;;title=TreeView+and+Web+Services" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/04/23/treeview-and-web-services.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2008/04/23/treeview-and-web-services.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/04/23/treeview-and-web-services.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2008/04/23/treeview-and-web-services.aspx&amp;amp;title=TreeView+and+Web+Services" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/04/23/treeview-and-web-services.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=18564" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/Web.UI/default.aspx">Web.UI</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/treeview/default.aspx">treeview</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/web+services/default.aspx">web services</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/Load+on+demand/default.aspx">Load on demand</category></item><item><title>Web.UI Navigation Controls and Web Services</title><link>http://www.componentart.com/BLOGS/milos/archive/2008/04/01/web-ui-navigation-controls-and-web-services.aspx</link><pubDate>Tue, 01 Apr 2008 17:45:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:17977</guid><dc:creator>Milos</dc:creator><slash:comments>4</slash:comments><description>&lt;br /&gt;

It&amp;#39;s been some time now since we first started introducing client-side integration with ASP.NET AJAX web services into our controls. The first foray was the ability of Grid to bind directly to JavaScript object arrays, allowing it to directly load JSON data returned from a web service, and continue running in client mode (&lt;a href="http://www.componentart.com/webui/demos/demos_technology-showcase/web-services_ajax/grid_loadFromWebService/default.aspx"&gt;see demo&lt;/a&gt;). The interest that this generated prompted the next big wave: Grid&amp;rsquo;s WebService running mode (&lt;a href="http://www.componentart.com/webui/demos/demos_technology-showcase/web-services_ajax/grid_webServiceRunningMode/default.aspx"&gt;see demo&lt;/a&gt;) and web service functionality in all the major navigation controls: TreeView, Menu, TabStrip, NavBar and ToolBar (&lt;a href="http://www.componentart.com/webui/demos/demos_technology-showcase/web-services_ajax/web_serviceCreation/default.aspx"&gt;see demo&lt;/a&gt;).
&lt;br /&gt;&lt;br /&gt;

In the latest iteration of Web.UI (2008.1) we standardized client-side events relating to web service calls across this group of controls, and added the ability to pass custom data to and from the web services. Each &lt;em&gt;*WebServiceRequest&lt;/em&gt; and &lt;em&gt;*WebServiceResponse&lt;/em&gt; class now has a &lt;strong&gt;CustomParameter&lt;/strong&gt; property.
&lt;br /&gt;&lt;br /&gt;

In this blog post, I want to illustrate how this custom data can be bounced around using standard client-side and server-side properties and client events.
&lt