<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><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><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/componentart" type="application/rss+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><item><title>Let us know what you want!</title><link>http://www.componentart.com/BLOGS/jovan/archive/2009/06/25/let-us-know-what-you-want.aspx</link><pubDate>Thu, 25 Jun 2009 19:49:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:31889</guid><dc:creator>Jovan</dc:creator><slash:comments>3</slash:comments><description>&lt;br /&gt;ComponentArt UI Framework 2009.2 Beta is now available for download. It includes the much-anticipated Scheduler control for ASP.NET AJAX as well as a number of new Silverlight controls.&lt;br /&gt;&lt;br /&gt;While the first preview of 2009.2 is out, there is plenty more development going on. In fact, now is your opportunity to choose exactly which features you want to see added! Here is how:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.componentart.com/download/beta.aspx"&gt;Download the beta version.&lt;/a&gt; (You will have to sign up for a free account if you haven&amp;#39;t already done so.)&lt;/li&gt;&lt;li&gt;Make sure to &lt;a href="http://www.componentart.com/user/edituserprofile.aspx"&gt;change your account preferences&lt;/a&gt; to indicate that you want to take part in the Beta Tester Program.&lt;/li&gt;&lt;li&gt;Within a few minutes you will get access to &lt;a href="http://www.componentart.com/forums/ShowForumGroup.aspx?ForumGroupID=25"&gt;the beta forums&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;These forums are actively monitored by the developers and are the quickest way to get your opinions heard by the people who actually write the code. Don&amp;#39;t wait. The beta forums will only be up for a few more weeks, and the sooner you let us know what you want, the sooner we can deliver it.&lt;br /&gt;&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/2009/06/25/let-us-know-what-you-want.aspx&amp;amp;;subject=Let+us+know+what+you+want!" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2009/06/25/let-us-know-what-you-want.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/jovan/archive/2009/06/25/let-us-know-what-you-want.aspx&amp;amp;;title=Let+us+know+what+you+want!" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2009/06/25/let-us-know-what-you-want.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2009/06/25/let-us-know-what-you-want.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2009/06/25/let-us-know-what-you-want.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/jovan/archive/2009/06/25/let-us-know-what-you-want.aspx&amp;amp;title=Let+us+know+what+you+want!" target="_blank" title = "Post http://www.componentart.com/BLOGS/jovan/archive/2009/06/25/let-us-know-what-you-want.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=31889" 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></item><item><title>ComponentArt Gauges for Silverlight *Sneak Preview*</title><link>http://www.componentart.com/BLOGS/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx</link><pubDate>Mon, 22 Jun 2009 23:51:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:31751</guid><dc:creator>Corey</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;&lt;span style="font-weight:bold;"&gt;ComponentArt is pleased to announce a sneak preview of Gauge for&lt;/span&gt;&lt;span style="font-weight:bold;"&gt; Silverlight!&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;br /&gt;
We have been working hard to bring you a flexible, themeable and customizable gauge control that delivers the same outstanding visual quality and ease of functionality that our &lt;a href="http://aspnetajax.componentart.com/control-specific/gauge/Features/GaugeTypes/Default.aspx" title="ComponentArt Gauge for ASP.NET AJAX"&gt;ASP.NET AJAX gauges&lt;/a&gt; deliver.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Theming&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
ComponentArt Gauge for Silverlight has very robust theming capabilities that allow you to customize the visual display of your gauge in almost any way that you can possibly conceive of.&amp;nbsp; Because Gauge has its themes defined entirely in XAML (vs. programmatic design), every visual element can be tweaked and/or replaced with very little effort!&amp;nbsp; For those who like to get up and running quickly, Gauge will ship with a number of already complete themes. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Data Binding&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Gauge for Silverlight is extremely flexible in its ability to be bound to other resources and objects.&amp;nbsp; Since almost every property supports binding, the use of custom DataContexts will make your life much easier!&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.componentart.com/blogs/corey/200906/GaugeSliderExample.html" title="Theme &amp;amp; Binding Example" target="_blank"&gt;following example&lt;/a&gt; illustrates both the theming and data binding capabilities of Gauge.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.componentart.com/blogs/corey/200906/GaugeSliderExample.html" title="Theme &amp;amp; Binding Example" target="_blank"&gt;&lt;img alt="Themes &amp;amp; Bindings" src="http://www.componentart.com/blogs/corey/200906/sliderThumb.png" title="Themes &amp;amp; Bindings" /&gt;&lt;br /&gt;
&lt;span style="font-size:10px;"&gt;Click to launch example.&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;p style="font-weight:bold;"&gt;Interactivity &amp;amp; Animations&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;Gauge for Silverlight will bring a new level of interactivity to our Gauge suite by utilizing Silverlight events, storyboard animations and its flexible architecture.&amp;nbsp; Custom and predefined animations can be used to smoothly (or wildly!) transition between states as the gauge&amp;#39;s data changes.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.componentart.com/blogs/corey/200906/GaugeAnimationExample.html" title="Animation Example" target="_blank"&gt;following example&lt;/a&gt; illustrates the use of a custom-animation to realistically transition the pointer from its old value to its new value.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.componentart.com/blogs/corey/200906/GaugeAnimationExample.html" title="Animation Example" target="_blank"&gt;&lt;img alt="Animation" src="http://www.componentart.com/blogs/corey/200906/animationThumb.png" title="Animation" /&gt;&lt;br /&gt;
&lt;span style="font-size:10px;"&gt;Click to launch example.&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;span style="font-weight:bold;"&gt;More Features To Look For&lt;/span&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete radial, linear, numeric and indicator gauge themes&lt;br /&gt;
&lt;/li&gt;

&lt;li&gt;Content area for embedded gauges, annotations and/or UI controls&lt;/li&gt;

&lt;li&gt;Interactive mouse events for gauge feedback and manipulation&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Keep an eye out for a &lt;a href="http://www.componentart.com/products/roadmap.aspx"&gt;Fall 2009 Beta&lt;/a&gt; of Gauge for Silverlight!&lt;/strong&gt;&lt;br /&gt;
&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/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx&amp;amp;;subject=ComponentArt+Gauges+for+Silverlight+*Sneak+Preview*" target="_blank" title = "Post http://www.componentart.com/BLOGS/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx&amp;amp;;title=ComponentArt+Gauges+for+Silverlight+*Sneak+Preview*" target="_blank" title = "Post http://www.componentart.com/BLOGS/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx&amp;amp;title=ComponentArt+Gauges+for+Silverlight+*Sneak+Preview*" target="_blank" title = "Post http://www.componentart.com/BLOGS/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=31751" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/corey/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://www.componentart.com/BLOGS/corey/archive/tags/Gauges/default.aspx">Gauges</category></item><item><title>$10,000 for the Best Silverlight App!</title><link>http://www.componentart.com/BLOGS/miljan/archive/2009/06/22/10-000-for-the-best-silverlight-app.aspx</link><pubDate>Mon, 22 Jun 2009 18:39:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:31745</guid><dc:creator>Miljan</dc:creator><slash:comments>2</slash:comments><description>
&lt;p&gt;Ok, this should be a lot of fun! &lt;br /&gt;
&lt;br /&gt;
ComponentArt has just announced the official beginning of the &lt;a href="http://www.componentart.com/community/competition2009/" title="Silverlight Competition"&gt;2009 Summer Silverlight Coding Competition&lt;/a&gt;. Starting immediately and throughout the summer (until September 22), developers can submit their Silverlight applications for evaluation by our Expert Panel and the developer community. The author(s) of the &amp;quot;best&amp;quot; application, as decided by the Expert Panel and the community, will walk away with the grand prize of $10,000 USD. Authors of the two runner-up applications will each receive ComponentArt licenses (a $1,299 USD value).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;How the Winner Will Be Chosen&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
Obviously, there&amp;#39;s no such thing as the &amp;quot;best&amp;quot; application. The winner will be chosen based on the number of points collected from the Expert Panel (maximum 450 points) and the community vote (maximum 100 points). So, we highly value the opinion of our Expert Panel, but the community vote might well tip the scale and select the winner! &lt;br /&gt;
&lt;br /&gt;
The grading criteria and the precise details for collecting points and are outlined on the &lt;a href="http://www.componentart.com/community/competition2009/howtowin.aspx" title="Silverlight Coding Competition - How to Win"&gt;how to win page&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Our Expert Panel&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
We are proud to have the following individuals on our Expert Panel: &lt;/p&gt;

&lt;table&gt;

&lt;tr&gt;
  
&lt;td style="width:220px;background-color:#e2e2e2;"&gt;&lt;strong&gt;Microsoft Silverlight Team &lt;/strong&gt;&lt;br /&gt;
- &lt;a href="http://timheuer.com/blog/" title="Tim Heuer" target="_blank"&gt;Tim Heuer&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://blogs.msdn.com/webnext/" title="Laurence Moroney" target="_blank"&gt;Laurence Moroney&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://www.silverlight.net/blogs/msnow" title="Mike Snow" target="_blank"&gt;Mike Snow&lt;/a&gt;
  &lt;/td&gt;
  
&lt;td style="width:220px;background-color:#e2e2e2;"&gt;&lt;strong&gt;Industry Gurus&lt;/strong&gt;&lt;br /&gt;
- &lt;a href="http://weblogs.asp.net/despos/" title="Dino Esposito" target="_blank"&gt;Dino Esposito&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://www.johnpapa.net/" title="John Papa" target="_blank"&gt;John Papa&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://www.stevesmithblog.com/" title="Steve Smith" target="_blank"&gt;Steve Smith&lt;/a&gt;
  &lt;/td&gt;
  
&lt;td style="width:220px;background-color:#e2e2e2;"&gt;&lt;strong&gt;ComponentArt Silverlight Team&lt;/strong&gt;&lt;br /&gt;
- &lt;a href="http://www.componentart.com/blogs/milos/" title="Milos Glisic" target="_blank"&gt;Milos Glisic&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://www.componentart.com/blogs/phil/" title="Phil Tucker" target="_blank"&gt;Phil Tucker&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://www.componentart.com/blogs/corey/" title="Corey Cahill" target="_blank"&gt;Corey Cahill&lt;/a&gt;
  &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Use of ComponentArt Products is NOT Required&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
Applicants are not required to use ComponentArt&amp;#39;s products to enter the competition (or as the legal jargon requires us to say: NO PURCHASE NECESSARY). We&amp;#39;ll obviously &lt;a href="http://www.componentart.com/community/competition2009/experience.aspx" title="Silverlight Coding Competition - Use ComponentArt Products"&gt;let you use our products&lt;/a&gt; if you want to, but the purpose of this contest is to increase awareness of Silverlight features and applications already released, so we would like to keep it open to the entire Silverlight developer community. &lt;br /&gt;
&lt;br /&gt;
The full contest rules are available &lt;a href="http://www.componentart.com/community/competition2009/rules.aspx" title="Silverlight Coding Competition - Rules"&gt;here&lt;/a&gt;. Let&amp;#39;s have some fun and may the best app win!&lt;br /&gt;
&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/2009/06/22/10-000-for-the-best-silverlight-app.aspx&amp;amp;;subject=%2410%2c000+for+the+Best+Silverlight+App!" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/06/22/10-000-for-the-best-silverlight-app.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/miljan/archive/2009/06/22/10-000-for-the-best-silverlight-app.aspx&amp;amp;;title=%2410%2c000+for+the+Best+Silverlight+App!" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/06/22/10-000-for-the-best-silverlight-app.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/miljan/archive/2009/06/22/10-000-for-the-best-silverlight-app.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/06/22/10-000-for-the-best-silverlight-app.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/miljan/archive/2009/06/22/10-000-for-the-best-silverlight-app.aspx&amp;amp;title=%2410%2c000+for+the+Best+Silverlight+App!" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/06/22/10-000-for-the-best-silverlight-app.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=31745" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Silverlight+Contest/default.aspx">Silverlight Contest</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Coding+Competition/default.aspx">Coding Competition</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Community/default.aspx">Community</category></item><item><title>Web.UI ASP.NET Grid: Synchronize Checkbox States with Row Selection</title><link>http://www.componentart.com/BLOGS/hwan/archive/2009/06/15/web-ui-asp-net-grid-synchronize-checkbox-states-with-row-selection.aspx</link><pubDate>Tue, 16 Jun 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:31421</guid><dc:creator>Hwan</dc:creator><slash:comments>1</slash:comments><description>One can use the Grid&amp;#39;s itemBeforeCheckChange and itemBeforeSelect client events to synchronize the state of checkboxes and row selection.  Some extra logic is required since checkbox clicks also trigger row selection.  I use the load client event is used to initially set all checked rows as selected.  The code here I used on the &lt;a href="http://aspnetajax.componentart.com/control-specific/grid/editing/editing_dataClientMode/WebForm1.aspx"&gt;Grid Editing - Client Mode&lt;/a&gt; example, after adding DataField &amp;quot;Discontinued&amp;quot; as a boolean ColumnType=&amp;quot;CheckBox&amp;quot; GridColumn.&lt;br /&gt;
&lt;br /&gt;
ASPX:
&lt;pre style="border:1px solid #a0a0a0;font-family:courier new;background-color:#e2e2e2;"&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;Grid&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Grid1&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;Columns&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DataField&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Discontinued&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ColumnType&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;CheckBox&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;ClientEvents&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;itemBeforeCheckChange&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;eventhandler&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Grid1_onItemBeforeCheckChange&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;itemBeforeSelect&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;eventhandler&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Grid1_onItemBeforeSelect&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;load&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;eventhandler&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Grid1_onLoad&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
JS:
&lt;pre style="border:1px solid #a0a0a0;font-family:courier new;background-color:#e2e2e2;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; checkboxClick = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; rowClick = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; Grid1_onItemBeforeCheckChange(sender, e)
{
  checkboxClick = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
}
&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; Grid1_onItemBeforeSelect(sender, e)
{
  &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (checkboxClick)
  {
    checkboxClick = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
    e.set_cancel(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (e.get_item().getMember(&amp;#39;Discontinued&amp;#39;).get_value())
    {
      rowClick = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
      sender.select(e.get_item(), &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)
    }
    &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
    {
      rowClick = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
      sender.unSelect(e.get_item());
    }
  }
  &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
  {
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (rowClick)
    {
      rowClick = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
      e.set_cancel(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);
      &lt;span style="color:#008000;"&gt;// 6 is the column index of DataField &amp;quot;Discontinued&amp;quot;&lt;/span&gt;
      e.get_item().setValue(6, !e.get_item().getMember(&amp;#39;Discontinued&amp;#39;).get_value());
      sender.select(e.get_item(), &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)
    }
    rowClick = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
  }
}
&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; Grid1_onLoad(sender, e)
{
  &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; table = sender.get_table();
  sender.beginUpdate();
  &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (i=0;i&amp;lt;table.getRowCount();i++)
  {
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (table.getRow(i).getMember(&amp;#39;Discontinued&amp;#39;).get_value())
    {
      rowClick = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
      sender.select(table.getRow(i), &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);
    }
  }
  sender.endUpdate();
}
&lt;/pre&gt;
&lt;br /&gt;
If you want selection to ONLY be done via the checkboxes, then modify the Grid1_onItemBeforeSelect client event handler to cancel user clicks.
&lt;br /&gt;
JS:
&lt;pre style="border:1px solid #a0a0a0;font-family:courier new;background-color:#e2e2e2;"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; Grid1_onItemBeforeSelect(sender, e)
{
  &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (checkboxClick)
  {
    checkboxClick = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
    e.set_cancel(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (e.get_item().getMember(&amp;#39;Discontinued&amp;#39;).get_value())
    {
      rowClick = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
      sender.select(e.get_item(), &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)
    }
    &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
    {
      rowClick = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
      sender.unSelect(e.get_item());
    }
  }
  &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
  {
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (rowClick)
    {
      e.set_cancel(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);
    }
    rowClick = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
  }
}
&lt;/pre&gt;
&lt;p style="font-size:smaller;"&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/hwan/archive/2009/06/15/web-ui-asp-net-grid-synchronize-checkbox-states-with-row-selection.aspx&amp;amp;;subject=Web.UI+ASP.NET+Grid%3a+Synchronize+Checkbox+States+with+Row+Selection" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/06/15/web-ui-asp-net-grid-synchronize-checkbox-states-with-row-selection.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/hwan/archive/2009/06/15/web-ui-asp-net-grid-synchronize-checkbox-states-with-row-selection.aspx&amp;amp;;title=Web.UI+ASP.NET+Grid%3a+Synchronize+Checkbox+States+with+Row+Selection" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/06/15/web-ui-asp-net-grid-synchronize-checkbox-states-with-row-selection.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/hwan/archive/2009/06/15/web-ui-asp-net-grid-synchronize-checkbox-states-with-row-selection.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/06/15/web-ui-asp-net-grid-synchronize-checkbox-states-with-row-selection.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/hwan/archive/2009/06/15/web-ui-asp-net-grid-synchronize-checkbox-states-with-row-selection.aspx&amp;amp;title=Web.UI+ASP.NET+Grid%3a+Synchronize+Checkbox+States+with+Row+Selection" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/06/15/web-ui-asp-net-grid-synchronize-checkbox-states-with-row-selection.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=31421" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/hwan/archive/tags/grid/default.aspx">grid</category><category domain="http://www.componentart.com/BLOGS/hwan/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.componentart.com/BLOGS/hwan/archive/tags/Web.UI+Grid/default.aspx">Web.UI Grid</category><category domain="http://www.componentart.com/BLOGS/hwan/archive/tags/Web.UI/default.aspx">Web.UI</category></item><item><title>AZGroups Scott Guthrie Event 2009, Phoenix</title><link>http://www.componentart.com/BLOGS/milos/archive/2009/06/02/scott-guthrie-event-2009-phoenix-az.aspx</link><pubDate>Tue, 02 Jun 2009 15:31:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:31036</guid><dc:creator>Milos</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Last week I had the pleasure of attending the annual &lt;a href="http://azgroups.org/"&gt;AZGroups&lt;/a&gt; event in Phoenix, Arizona headlined by Scott Guthrie of Microsoft. Other speakers included Tim Heuer, Jaime Rodriguez (on WPF) and Glenn Block (on MEF). All the sessions were very informative and the event overall was extremely well organized.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;I had a great time in Scottsdale and even got to participate in the goings on by presenting our new &lt;a href="http://www.componentart.com/products/soaui/"&gt;SOA.UI framework&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;img src="http://blogs.componentart.com/milos/images/phoenix2.jpg" /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src="http://blogs.componentart.com/milos/images/phoenix1.jpg" /&gt;&lt;br /&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;You can see the rest of the pics from the event &lt;a href="http://www.flickr.com/photos/scottcate/sets/72157619036373689/"&gt;here&lt;/a&gt;.&lt;/p&gt;
A big thanks to Scott Cate, Joseph Guadagno, and the rest of the organizers!
&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/2009/06/02/scott-guthrie-event-2009-phoenix-az.aspx&amp;amp;;subject=AZGroups+Scott+Guthrie+Event+2009%2c+Phoenix" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2009/06/02/scott-guthrie-event-2009-phoenix-az.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/milos/archive/2009/06/02/scott-guthrie-event-2009-phoenix-az.aspx&amp;amp;;title=AZGroups+Scott+Guthrie+Event+2009%2c+Phoenix" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2009/06/02/scott-guthrie-event-2009-phoenix-az.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2009/06/02/scott-guthrie-event-2009-phoenix-az.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2009/06/02/scott-guthrie-event-2009-phoenix-az.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2009/06/02/scott-guthrie-event-2009-phoenix-az.aspx&amp;amp;title=AZGroups+Scott+Guthrie+Event+2009%2c+Phoenix" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2009/06/02/scott-guthrie-event-2009-phoenix-az.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=31036" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/silverlight/default.aspx">silverlight</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/soa.ui/default.aspx">soa.ui</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/phoenix/default.aspx">phoenix</category></item><item><title>Securing Applications Built on Silverlight and WCF</title><link>http://www.componentart.com/BLOGS/milos/archive/2009/05/07/securing-applications-built-on-silverlight-and-wcf.aspx</link><pubDate>Thu, 07 May 2009 14:41:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:29917</guid><dc:creator>Milos</dc:creator><slash:comments>1</slash:comments><description>&lt;br /&gt;
Having recently released our initial offering of Silverlight controls, we are starting to get a feel for the sorts of issues Silverlight
developers commonly encounter in designing and developing their applications. One question which seems to pop up frequently is how
security and authentication should be handled in the context of a Silverlight application which interacts with WCF services. In applications
that include &lt;a href="http://www.componentart.com/products/silverlight/"&gt;Web.UI controls&lt;/a&gt;, especially those 
with &lt;a href="http://www.componentart.com/products/soaui/"&gt;SOA.UI integration&lt;/a&gt;, this question becomes even more important.
&lt;br /&gt;
&lt;br /&gt;
In this post, I will attempt to shine a bit of light on what we see as a typical approach to authentication and how it can be elegantly
integrated into a Silverlight 2 application and the WCF services it employs. We will use the example of simple ASP.NET forms authentication.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Step 1.&lt;/strong&gt; Configure authentication for the application in its web.config file:
&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;lt;system.web&amp;gt;
  ...
  &amp;lt;authentication mode=&amp;quot;Forms&amp;quot;&amp;gt;
    &amp;lt;forms name=&amp;quot;secure&amp;quot;&amp;gt;
      &amp;lt;credentials passwordFormat=&amp;quot;Clear&amp;quot;&amp;gt;
        &amp;lt;user name=&amp;quot;milos&amp;quot; password=&amp;quot;secret&amp;quot; /&amp;gt;
      &amp;lt;/credentials&amp;gt;
    &amp;lt;/forms&amp;gt;
  &amp;lt;/authentication&amp;gt;
  ...
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;

This is all we need to do to be able to rely on ASP.NET and its session cookies for authentication and session management. We do still need
to do a couple of things in order to connect our Silverlight and web service logic to this underlying mechanism.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Step 2.&lt;/strong&gt; Write a simple WCF authentication service:
&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;[ServiceContract(Namespace = &amp;quot;&amp;quot;)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class AuthenticationService
{
  [OperationContract]
  public bool Authenticate(string sUser, string sPass)
  {
    if (FormsAuthentication.Authenticate(sUser, sPass))
    {
      FormsAuthentication.SetAuthCookie(sUser, false);
      return true;
    }

    return false;
  }

  [OperationContract]
  public bool IsAuthenticated()
  {
    return HttpContext.Current.User.Identity.IsAuthenticated;
  }
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
In this example, we implement two methods: one for checking whether the user is authenticated and another for authenticating her. We rely
entirely on built-in FormsAuthentication functionality.
&lt;br /&gt;
&lt;br /&gt;
With the AuthenticationService in place, we can plug it into our Silverlight application and its associated WCF services (including standard
SOA.UI services). For the former, we can create a service reference in the Silverlight application and use it in this sort of way:

&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Step 3.&lt;/strong&gt; Implement authentication logic in the Silverlight application:
&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;public partial class Page : UserControl
{
  public Page()
  {
    InitializeComponent();

    // When the page initializes, perform authentication if necessary:
    AuthenticateAndInitialize();
  }

  void AuthenticateAndInitialize()
  {
    // Check whether the user is authenticated:
    AuthenticationService.AuthenticationServiceClient oAuthClient = 
      new AuthenticationService.AuthenticationServiceClient(...);
    oAuthClient.IsAuthenticatedCompleted += 
      new EventHandler(oAuthClient_IsAuthenticatedCompleted);
    oAuthClient.IsAuthenticatedAsync();
  }

  void oAuthClient_IsAuthenticatedCompleted(object sender, 
    AuthenticationService.IsAuthenticatedCompletedEventArgs e)
  {
    if (e.Result)
    {
      // The user is already authenticated, proceed with initializing the application:
      InitializeApplication();
    }
    else
    {
      // Show login screen, get username and password (code not shown here), and authenticate:
      Authenticate(sUsername, sPassword);
    }
  }

  void Authenticate(string sUser, string sPass)
  {
    // Attempt to authenticate the given credentials:
    AuthenticationService.AuthenticationServiceClient oAuthClient = 
      new AuthenticationService.AuthenticationServiceClient(...);
    oAuthClient.AuthenticateCompleted += 
      new EventHandler(oAuthClient_AuthenticateCompleted);
    oAuthClient.AuthenticateAsync(sUser, sPass);
  }

  void oAuthClient_AuthenticateCompleted(object sender, 
    AuthenticationService.AuthenticateCompletedEventArgs e)
  {
    if (e.Result)
    {
      // The user is now authenticated, proceed with initializing the application:
      InitializeApplication();
    }
    else
    {
      // Login failed, repeat the login screen procedure (code not shown here).
    }
  }

  ...
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
The (pseudo-)code above outlines the general approach to a simple login procedure which can be integrated into any Silverlight application.
We need to interface into this procedure from Silverlight because that is our client-side platform, but the authentication is actually
needed not for the client-side Silverlight operations, but for the server-side WCF layer. This brings us to the last step, and the real point
of the whole exercise: securing the service.
&lt;br /&gt;
&lt;br /&gt;

&lt;strong&gt;Step 4.&lt;/strong&gt; Secure the service:
&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;[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SoaFeedReaderDataGridService : SoaDataGridService
{
  public override SoaDataGridSelectResponse Select(SoaDataGridSelectRequest request)
  {
    &lt;strong&gt;if (HttpContext.Current.User.Identity.IsAuthenticated)&lt;/strong&gt;
    {
      // Implement service logic
      ...
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
The idea is to have the service check the user&amp;#39;s credentials before proceeding to fetch data or perform other potentially sensitive
operations. In the example above, we are using a standard SOA.UI SoaDataGridService, but the same approach is used for any WCF service.

&lt;br /&gt;
&lt;br /&gt;
I hope this basic example clarifies things a bit when it comes to security and Silverlight+WCF applications. For more elaborate authentication
mechanisms, other options also exist, such as the ability to pass around custom data using SOA.UI APIs, but that is a topic for another day.
&lt;br /&gt;
&lt;br /&gt;
Cheers!
&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/2009/05/07/securing-applications-built-on-silverlight-and-wcf.aspx&amp;amp;;subject=Securing+Applications+Built+on+Silverlight+and+WCF" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2009/05/07/securing-applications-built-on-silverlight-and-wcf.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/milos/archive/2009/05/07/securing-applications-built-on-silverlight-and-wcf.aspx&amp;amp;;title=Securing+Applications+Built+on+Silverlight+and+WCF" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2009/05/07/securing-applications-built-on-silverlight-and-wcf.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2009/05/07/securing-applications-built-on-silverlight-and-wcf.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2009/05/07/securing-applications-built-on-silverlight-and-wcf.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2009/05/07/securing-applications-built-on-silverlight-and-wcf.aspx&amp;amp;title=Securing+Applications+Built+on+Silverlight+and+WCF" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2009/05/07/securing-applications-built-on-silverlight-and-wcf.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=29917" 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/web+services/default.aspx">web services</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/silverlight/default.aspx">silverlight</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/soa.ui/default.aspx">soa.ui</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/wcf/default.aspx">wcf</category></item><item><title>ComponentArt: Past, Present and Future</title><link>http://www.componentart.com/BLOGS/miljan/archive/2009/04/21/componentart-past-present-and-future.aspx</link><pubDate>Tue, 21 Apr 2009 14:12:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:29277</guid><dc:creator>Miljan</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Shipping UI Framework 2009.1 was a lot more than a software release here at ComponentArt. In many ways, it was a re-launch of the company itself. Now that the big release is out in the wild, I thought that it would be fun to reflect on what we have done in the past as well as think about what lies ahead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Walk Down Memory Lane&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A couple of days ago we went through our archive of previous websites and had a good laugh while we relived some of those moments. Here is a quick list of the key points in ComponentArt&amp;#39;s history, with website screenshots: &lt;/p&gt;

&lt;table&gt;

&lt;tr&gt;
  
&lt;td&gt;&lt;a href="http://www.componentart.com/blogs/miljan/images/20090421_aspnetmenu.png" target="_blank"&gt;&lt;img border="0" height="297" src="http://www.componentart.com/blogs/miljan/images/20090421_aspnetmenu_thm.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;
  
&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;

&lt;td&gt;&lt;u&gt;February 28, 2002 - The Beginning&lt;/u&gt;
&lt;br /&gt;
&lt;br /&gt;
ASP.NET Menu launched by CYBERAKT INC. Throughout the summer of 2001 we were evaluating Microsoft&amp;rsquo;s new .NET Framework, which was in Beta 2 at the time. We were very impressed by ASP.NET and thought that it could use a good menu control. Our first software component product - ASP.NET Menu &amp;ndash; was released at the same time as ASP.NET itself. It quickly became the most downloaded control on the official ASP.NET website and sales started pouring in! Without a doubt, ASP.NET Menu was the big catalyst that enabled our growth. 
   &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td colspan="3"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td&gt;&lt;a href="http://www.componentart.com/blogs/miljan/images/20090421_rcr.png" target="_blank"&gt;&lt;img border="0" height="297" src="http://www.componentart.com/blogs/miljan/images/20090421_rcr_thm.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;
  
&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;
  
&lt;td&gt;&lt;u&gt;March 28, 2003 - Rich Content Rotator&lt;/u&gt; 
&lt;br /&gt;
&lt;br /&gt;
Proceeding with the rich DHTML control theme, we released our next product: Rich Content Rotator for ASP.NET (we affectionately refer to that control as &amp;quot;Rotato&amp;quot; here at the office). Rotato was less than a blockbuster product for us: it wasn&amp;#39;t anywhere near as popular as ASP.NET Menu. Also notice that it took us more than a year to release the second component. In any case, we learnt that you can&amp;#39;t win them all and started working hard on our next release. 
&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td colspan="3"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;/tr&gt;


&lt;tr&gt;
  
&lt;td&gt;&lt;a href="http://www.componentart.com/blogs/miljan/images/20090421_componentart10.png" target="_blank"&gt;&lt;img border="0" height="297" src="http://www.componentart.com/blogs/miljan/images/20090421_componentart10_thm.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;
  
&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;
  
&lt;td&gt;&lt;u&gt;May 14, 2004 - ComponentArt 1.0&lt;/u&gt;
&lt;br /&gt;
&lt;br /&gt;
This release marked the end of the &amp;quot;CYBERAKT&amp;quot; era. We changed the company name to ComponentArt and went through an elaborate rebranding exercise. We wanted a fresh new look that would be distinctive in the marketplace. Market reaction was overwhelmingly positive and we received numerous awards for our print ads in the coming years. This release also marked the introduction of our flagship Web.UI for ASP.NET product line, with TreeView and Snap controls added to the mix for a total of four components! 
&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td colspan="3"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td&gt;&lt;a href="http://www.componentart.com/blogs/miljan/images/20090421_webui30.png" target="_blank"&gt;&lt;img border="0" height="297" src="http://www.componentart.com/blogs/miljan/images/20090421_webui30_thm.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;
  
&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;
  
&lt;td&gt;&lt;u&gt;September 9, 2005 - ComponentArt - AJAX Edition&lt;/u&gt;
&lt;br /&gt;
&lt;br /&gt;
Skipping a few smaller releases, it was Web.UI 3.0 that marked the next major step in our offering. We implemented client-side rendering across the entire Web.UI suite, released our super-popular Grid for ASP.NET control and introduced the first generic AJAX container control for ASP.NET: ComponentArt CallBack (code named &amp;quot;AjaxBox&amp;quot;). This control was a major innovation. Notice that we released it well over a year before Microsoft&amp;#39;s UpdatePanel control and quite a bit before any other competing products. (By the way, CallBack and UpdatePanel have different architectures and are complementary products. More info on that is available &lt;a href="http://www.componentart.com/BLOGS/miljan/archive/2008/01/25/a-new-ajax-approach-client-side-controls-invoking-web-services.aspx"&gt;here&lt;/a&gt;). 
&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td colspan="3"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td&gt;&lt;a href="http://www.componentart.com/blogs/miljan/images/20090421_charting.png" target="_blank"&gt;&lt;img border="0" height="297" src="http://www.componentart.com/blogs/miljan/images/20090421_charting_thm.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;
  
&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;
  
&lt;td&gt;&lt;u&gt;December 21, 2005 - Charting Redefined&lt;/u&gt;
&lt;br /&gt;
&lt;br /&gt;
End of 2005 was when we revealed our next major achievement: Charting for .NET. We had been working on that product for 2 years prior to its release and we were very proud of our own 3D rendering engine. The rendering quality of our charts was impressive enough for the most established charting vendor to approach me at a tradeshow and ask: &amp;quot;Hey, who wrote your rendering engine?&amp;quot; I replied with a smile: &amp;quot;My dad.&amp;quot; But that&amp;#39;s another blog post. 
&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td colspan="3"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td&gt;&lt;a href="http://www.componentart.com/blogs/miljan/images/20090421_TrueAtlas.png" target="_blank"&gt;&lt;img border="0" height="297" src="http://www.componentart.com/blogs/miljan/images/20090421_TrueAtlas_thm.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;
  
&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;
  
&lt;td&gt;&lt;u&gt;November 21, 2006 - The First True &amp;quot;Atlas&amp;quot; Controls&lt;/u&gt;
&lt;br /&gt;
&lt;br /&gt;
We had been working closely with the ASP.NET AJAX (code named &amp;quot;Atlas&amp;quot;) team for many months prior to shipping Web.UI for ASP.NET AJAX. Our release was parallel with the &amp;quot;Atlas&amp;quot; release itself and generated a great deal of buzz in the industry, including a mention on Scott Guthrie&amp;#39;s blog. Business-wise, this product was also a blockbuster for us. The strategy of putting so much effort into supporting an upcoming MS framework and developing against its alpha bits was a risky one. It took some effort to convince the management team, but it really paid off in the end. 
&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td colspan="3"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;/tr&gt;

&lt;tr&gt;
  
&lt;td&gt;&lt;a href="http://www.componentart.com/blogs/miljan/images/20090421_ribbonnav.png" target="_blank"&gt;&lt;img border="0" height="297" src="http://www.componentart.com/blogs/miljan/images/20090421_ribbonnav_thm.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;
  
&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;
  
&lt;td&gt;&lt;u&gt;May 1, 2007 - The Ribbon Nav&lt;/u&gt; 
&lt;br /&gt;
&lt;br /&gt;
The May 1st release marked a website redesign and the introduction of ribbon-based navigation. Implementing non-standard UI elements for main navigation was another risky move. We had to make sure that it was perfectly executed, otherwise the website would be rendered useless (additional thoughts on that exercise are available &lt;a href="http://www.componentart.com/BLOGS/miljan/archive/2007/05/03/wake-up-and-smell-the-ribbon.aspx"&gt;here&lt;/a&gt;). We worked long and hard on the new site and in my opinion once again ended up with something unique and well executed. 
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;

&lt;p&gt;&lt;span style="font-weight:bold;"&gt;ComponentArt 2009.1&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Even though we&amp;#39;ve done some noteworthy things in the past, our latest release is undoubtedly our biggest achievement. We have grown our product offering by an order of magnitude, completely redesigned the website and introduced a new brand: ComponentArt UI Framework for .NET. &lt;br /&gt;
&lt;br /&gt;
I believe that this product release is significant beyond the fact that we have shipped a number of new components. We are introducing a powerful new paradigm with UI-centric web services and the ability to share code between AJAX and Silverlight applications. Most web developers on Microsoft&amp;#39;s platform today are somewhere between building vanilla ASP.NET apps and full Silverlight adoption. Our SOA.UI framework was designed to help bridge that gap as well as offer value to those who are already there (you can save quite a few lines of code even if you are doing Silverlight development exclusively). A lot more on that later. &lt;br /&gt;
&lt;br /&gt;
The new website is something we are particularly proud of. We have decided to take another fresh (although not as radical) approach to navigation. I think that the new &amp;quot;mega menu&amp;quot; works quite well. However, our customers always have the final say regarding these things, so please let us know how we did. &lt;/p&gt;

&lt;p&gt;&lt;span style="font-weight:bold;"&gt;ComponentArt v.Next&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
You won&amp;#39;t be surprised to hear that we are already working on the next release. As outlined in our new &lt;a href="http://www.componentart.com/products/roadmap.aspx"&gt;product roadmap&lt;/a&gt;, our plan is to expand our existing product lines as well as introduce a new Win.UI for WPF control suite by the end of the year. We are also working on additional website upgrades: the knowledge base and community sections will see major overhauls in the near future. &lt;br /&gt;
&lt;br /&gt;
We will always continue to think about creative ways to add value to the platform and best serve our customers. &lt;br /&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/2009/04/21/componentart-past-present-and-future.aspx&amp;amp;;subject=ComponentArt%3a+Past%2c+Present+and+Future" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/04/21/componentart-past-present-and-future.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/miljan/archive/2009/04/21/componentart-past-present-and-future.aspx&amp;amp;;title=ComponentArt%3a+Past%2c+Present+and+Future" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/04/21/componentart-past-present-and-future.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/miljan/archive/2009/04/21/componentart-past-present-and-future.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/04/21/componentart-past-present-and-future.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/miljan/archive/2009/04/21/componentart-past-present-and-future.aspx&amp;amp;title=ComponentArt%3a+Past%2c+Present+and+Future" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/04/21/componentart-past-present-and-future.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=29277" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/ComponentArt/default.aspx">ComponentArt</category></item><item><title>Hey, nice package!</title><link>http://www.componentart.com/BLOGS/evan/archive/2009/04/17/ui-framework-installation-package.aspx</link><pubDate>Fri, 17 Apr 2009 17:13:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:29144</guid><dc:creator>Evan</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;So many things have changed with the UI Framework 2009.1 release it&amp;#39;s &lt;a href="http://www.componentart.com/company/news.aspx#news68" title="UI Framework 2009.1 news item"&gt;mind-boggling&lt;/a&gt;.&amp;nbsp; One thing that often gets overlooked in product changelogs or feature lists is the installation package itself.&amp;nbsp; I&amp;#39;ll attempt to go over some of the changes we&amp;#39;ve made to the installer, and why we decided to do so.&lt;/p&gt;&lt;p&gt;The first thing you&amp;#39;ve probably noticed is that the number of installation packages has decreased from 12 (or 13 if you include the Silverlight beta package) to 1.&amp;nbsp; Obviously, realigning our &lt;a href="http://www.componentart.com/products/aspnetajax/" title="ASP.NET AJAX product page"&gt;AJAX offering&lt;/a&gt; to include the Web.UI, Chart, and Gauge products was the prime motivator for this.&amp;nbsp; As we started down the road of integrating those product lines, and the &lt;a href="http://www.componentart.com/products/soaui/" title="SOA.UI product page"&gt;SOA.UI product&lt;/a&gt; became more fleshed-out, it seemed natural to include everything in one package rather than having a Silverlight package and an AJAX package, both with the SOA.UI product included, or have SOA.UI as a standalone package (which really makes no sense when you think about what SOA.UI does).&amp;nbsp; Once we decided to have a single, unified installer, everything fell into place.&amp;nbsp; What we ended up with is, I think, a much more simple, efficient installation experience for end-users.&lt;/p&gt;&lt;p&gt;Of course, one of the concerns of moving to a unified installer is the size of the package itself.&amp;nbsp; We made every effort to reduce this as much as possible by:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;completely reworking the Live Demos&lt;br /&gt;&lt;/li&gt;&lt;li&gt;removing the .chm-based documentation files (we used to include both .chm and Help 2 .Hx* files)&lt;/li&gt;&lt;li&gt;only including help files for a single framework (2.0 AJAX, which is the superset of frameworks from a documentation point of view)&lt;/li&gt;&lt;li&gt;shipping a single License Manager for all products (facilitated by the implementation of a single, framework-wide license key)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;having the installer be smart about duplicate files we&amp;#39;re shipping&lt;/li&gt;&lt;/ul&gt;So we end up with an &lt;a href="http://www.componentart.com/download/" title="Download page"&gt;installer of roughly 65 megs&lt;/a&gt;.&amp;nbsp; No bad considering what where replacing, and I believe one of the smaller integrated installers in the industry.&lt;br /&gt;&lt;p&gt;We also took the opportunity to rework some things in the installer that we never really liked.&amp;nbsp; First was the concept of a &amp;quot;Server&amp;quot; install type (as opposed to &amp;quot;Complete&amp;quot; or &amp;quot;Custom&amp;quot;).&amp;nbsp; This option was included in previous versions as a convenience, and basically copied the product dlls themselves, plus a copy of the License Manager to the filesystem.&amp;nbsp; For some of the things we wanted to achieve, it became apparent that this installer should target a developer workstation only.&lt;span id="ctl00_MainContent_PostView1"&gt;&amp;nbsp; Developers create solutions there, and then deploy to the server (along with a .lic file for licensing) via xcopy of some other method. We kept this developer-centric mindset when approaching all features of the installer.&amp;nbsp; In fact, we might as well have called the distibution package &amp;quot;ComponentArt.UI.Framework.2009.1.DeveloperTools.exe&amp;quot;, but someone thought that was going overboard.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Also gone are the automatically created IIS virtual directories for Live Demos.&amp;nbsp; These have been problematic in the past for a number of reasons.&amp;nbsp; We rely on &lt;a href="http://www.acresso.com/products/is/installshield-overview.htm" title="InstallShield site"&gt;InstallShield&lt;/a&gt; for creating and managing these virtual directories at install-time.&amp;nbsp; That product is pretty good in this regard, but there&amp;#39;s no guarantee you&amp;#39;ll get what you want if you&amp;#39;re running on Vista, Windows Server 2008, or some other OS with IIS7.&amp;nbsp; We always included a fallback to Cassini (or WebDev.WebServer.EXE, or &lt;a href="http://forums.asp.net/t/949179.aspx" title="Cassini or WebDev.WebServer.EXE"&gt;whatever it&amp;#39;s called&lt;/a&gt;) in the event that the target machine does not have IIS installed.&amp;nbsp; So if we&amp;#39;re confident that we&amp;#39;re installing on a developer workstation (which we now are) then we know Cassini is available and launch that when we start the Live Demos.&amp;nbsp; We even designed a cool little app to manage the Cassini threads (it&amp;#39;s available off of the Start menu if you have Live Demos installed).&lt;/p&gt;&lt;p&gt;Since we&amp;#39;re &lt;em&gt;so&lt;/em&gt; confident that we&amp;#39;re now installing on a developer workstation, we decided to remove the option for &amp;quot;Visual Studio Integration&amp;quot;.&amp;nbsp; Now you get integrated whether you like it or not ;-)&amp;nbsp; This includes VS toolbox items and help collection merging, and is why you have those VSPackage.* dlls in the product directory structure.&amp;nbsp; Essentially, we just couldn&amp;#39;t think of one good reason why a developer would not want this stuff available.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There&amp;#39;s a lot more that I&amp;#39;ll try to address in future posts (the new licensing scheme, etc.). For now, please enjoy the new car smell!&lt;br /&gt;&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/evan/archive/2009/04/17/ui-framework-installation-package.aspx&amp;amp;;subject=Hey%2c+nice+package!" target="_blank" title = "Post http://www.componentart.com/BLOGS/evan/archive/2009/04/17/ui-framework-installation-package.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/evan/archive/2009/04/17/ui-framework-installation-package.aspx&amp;amp;;title=Hey%2c+nice+package!" target="_blank" title = "Post http://www.componentart.com/BLOGS/evan/archive/2009/04/17/ui-framework-installation-package.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/evan/archive/2009/04/17/ui-framework-installation-package.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/evan/archive/2009/04/17/ui-framework-installation-package.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/evan/archive/2009/04/17/ui-framework-installation-package.aspx&amp;amp;title=Hey%2c+nice+package!" target="_blank" title = "Post http://www.componentart.com/BLOGS/evan/archive/2009/04/17/ui-framework-installation-package.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=29144" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/evan/archive/tags/installation/default.aspx">installation</category><category domain="http://www.componentart.com/BLOGS/evan/archive/tags/setup/default.aspx">setup</category><category domain="http://www.componentart.com/BLOGS/evan/archive/tags/UI+Framework/default.aspx">UI Framework</category></item><item><title>Web.UI ASP.NET Grid: Retrieve the filtered set of rows in Client RunningMode</title><link>http://www.componentart.com/BLOGS/hwan/archive/2009/03/19/retrieve-the-filtered-set-of-rows-in-client-runningmode.aspx</link><pubDate>Thu, 19 Mar 2009 23:09:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:28001</guid><dc:creator>Hwan</dc:creator><slash:comments>1</slash:comments><description>Currently the Grid doesn&amp;#39;t expose the filtered set of GridItems after a search/filter action, preventing operations from being applied exclusively to that set of rows.  Until Grid provides a method to access these, you can build your own set of filtered items by using the undocumented gridLevel FilterExpression property.&lt;br /&gt;
&lt;br /&gt;
eg.&lt;br /&gt;
JS:
&lt;pre style="border:1px solid #a0a0a0;font-family:courier new;background-color:#e2e2e2;"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; getFilteredRows(grid)
{
    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; table = grid.get_table();
    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; filteredRows = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Array&lt;/span&gt;();
    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (i=0;i&amp;lt;table.getRowCount();i++)
    {
      &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; DataItem = table.getRow(i);
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;eval&lt;/span&gt;(grid.Levels[0]. F i l t e r E x p r e s s i o n ))
      {
        filteredRows[filteredRows.&lt;span style="color:#0000ff;"&gt;length&lt;/span&gt;] = DataItem;
      }
    }
    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; filteredRows;
}
&lt;/pre&gt;
You could then grab the filtered items (after a search/filter action) with something like&lt;br /&gt;
JS:
&lt;pre style="border:1px solid #a0a0a0;font-family:courier new;background-color:#e2e2e2;"&gt;&amp;nbsp;
&lt;span style="color:#008000;"&gt;// grab the first search result&amp;#39;s text in column 3&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;alert&lt;/span&gt;(getFilteredRows(Grid1)[0].getMemberAt(3).get_text());
&amp;nbsp;
&lt;/pre&gt;
&lt;p style="font-size:smaller;"&gt;
Note: You&amp;#39;ll have to remove the spaces from the &amp;quot; F i l t e r E x p r e s s i o n &amp;quot; above, as our blog software doesn&amp;#39;t permit this string in codeblocks.
&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/hwan/archive/2009/03/19/retrieve-the-filtered-set-of-rows-in-client-runningmode.aspx&amp;amp;;subject=Web.UI+ASP.NET+Grid%3a+Retrieve+the+filtered+set+of+rows+in+Client+RunningMode" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/03/19/retrieve-the-filtered-set-of-rows-in-client-runningmode.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/hwan/archive/2009/03/19/retrieve-the-filtered-set-of-rows-in-client-runningmode.aspx&amp;amp;;title=Web.UI+ASP.NET+Grid%3a+Retrieve+the+filtered+set+of+rows+in+Client+RunningMode" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/03/19/retrieve-the-filtered-set-of-rows-in-client-runningmode.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/hwan/archive/2009/03/19/retrieve-the-filtered-set-of-rows-in-client-runningmode.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/03/19/retrieve-the-filtered-set-of-rows-in-client-runningmode.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/hwan/archive/2009/03/19/retrieve-the-filtered-set-of-rows-in-client-runningmode.aspx&amp;amp;title=Web.UI+ASP.NET+Grid%3a+Retrieve+the+filtered+set+of+rows+in+Client+RunningMode" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/03/19/retrieve-the-filtered-set-of-rows-in-client-runningmode.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=28001" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/hwan/archive/tags/grid/default.aspx">grid</category><category domain="http://www.componentart.com/BLOGS/hwan/archive/tags/Web.UI/default.aspx">Web.UI</category></item><item><title>Convert Web.UI ASP.NET Grid into a data entry spreadsheet</title><link>http://www.componentart.com/BLOGS/hwan/archive/2009/03/12/give-web-ui-grid-data-entry-spreadsheet-behavior.aspx</link><pubDate>Thu, 12 Mar 2009 22:19:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:27804</guid><dc:creator>Hwan</dc:creator><slash:comments>1</slash:comments><description>&lt;span&gt;
Using client templates and some JavaScript one can change Web.UI Grid&amp;#39;s editing interface to behave more like a data entry spreadsheet.&amp;nbsp; I started from the code suggestions given in &lt;a href="http://www.componentart.com/kb/article.aspx?id=10111"&gt;Q10111 - HOWTO: Create a Microsoft Excel spreadsheet-like Grid&lt;/a&gt; and added keystroke handling for adding new rows and moving up and down between editable cells (Up Arrow and Down Arrow to go up and down, Tab and Shift+Tab to go right and left).&amp;nbsp; I also added a delete template (a clickable X) so that users could easily remove rows.  In my example I start with a blank Grid which is initially populated in the load client-event with a blank row.&lt;br /&gt;
&lt;br /&gt;
ASPX:&lt;br /&gt;
&lt;pre style="border:1px solid black;margin:4px;padding:4px;font-family:courier new;background-color:#e2e2e2;width:680px;overflow-y:auto;overflow-x:scroll;"&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;Grid&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Grid1&amp;quot;&lt;/span&gt;
&lt;span style="color:#ff0000;"&gt;AllowTextSelection&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;true&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;ClientEvents&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;load&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;eventhandler&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Grid1_onLoad&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;ClientEvents&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;Levels&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridLevel&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;Columns&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DataCellClientTemplateId&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;DeleteCellTemplate&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DataField&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;ProductName&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DataCellClientTemplateId&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;EditCellTemplate&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DataField&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;UnitPrice&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DataCellClientTemplateId&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;EditCellTemplate&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DataField&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;UnitsInStock&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DataCellClientTemplateId&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;EditCellTemplate&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;Columns&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridLevel&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;Levels&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;ClientTemplates&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;ClientTemplate&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Id&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;EditCellTemplate&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;style&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;border-style:none;width:## DataItem.getCurrentMember().get_column().get_width() ##px;&amp;quot;&lt;/span&gt;
            &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;textbox_## DataItem.get_index() ##_## DataItem.getCurrentMember().get_column().get_dataField() ##&amp;quot;&lt;/span&gt;
            &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;
            &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;## DataItem.getCurrentMember().get_value() ##&amp;quot;&lt;/span&gt;
            &lt;span style="color:#ff0000;"&gt;onfocus&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;this.select();editingTextboxId = this.id;editingClientId = &amp;#39;## DataItem.ClientId ##&amp;#39;;
            editingDataField = &amp;#39;## DataItem.getCurrentMember().get_column().get_dataField() ##&amp;#39;;
            editingIndexRow = ## DataItem.get_index() ##;&amp;quot;&lt;/span&gt;
            &lt;span style="color:#ff0000;"&gt;onKeyDown&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;return EditField_onKeyPress(event)&amp;quot;&lt;/span&gt;
            &lt;span style="color:#ff0000;"&gt;onBlur&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;saveCell(&amp;#39;## DataItem.ClientId ##&amp;#39;, &amp;#39;## DataItem.getCurrentMember().get_column().get_dataField() ##&amp;#39;, this.value);&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;ClientTemplate&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;ClientTemplate&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Id&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;DeleteCellTemplate&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;a&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;tabindex&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;
            &lt;span style="color:#ff0000;"&gt;style&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;color:#f00;&amp;quot;&lt;/span&gt; 
            &lt;span style="color:#ff0000;"&gt;href&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;j__avascript:Grid1.deleteItem(Grid1.getItemFromClientId(&amp;#39;## DataItem.get_clientId() ##&amp;#39;));&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;X&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;a&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:#c71585;"&gt;ComponentArt&lt;/span&gt;:&lt;span style="color:#800000;"&gt;ClientTemplate&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;ClientTemplates&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
JS:
&lt;pre style="border:1px solid black;margin:4px;padding:4px;font-family:courier new;background-color:#e2e2e2;width:680px;overflow-y:auto;overflow-x:scroll;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; editingIndexRow = -1;
&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; editingTextboxId = &amp;quot;&lt;span style="color:#8b0000;"&gt;&lt;/span&gt;&amp;quot;;
&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; editingClientId = &amp;quot;&lt;span style="color:#8b0000;"&gt;&lt;/span&gt;&amp;quot;;
&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; editingDataField = &amp;quot;&lt;span style="color:#8b0000;"&gt;&lt;/span&gt;&amp;quot;;
&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; firstEditableDataField = &amp;quot;&lt;span style="color:#8b0000;"&gt;ProductName&lt;/span&gt;&amp;quot;;

&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; Grid1_onLoad(sender, e)
{
	Grid1_addRow();
}
&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; saveCell(itemId, columnField, newValue)
{
	&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; row = Grid1.GetRowFromClientId(itemId);
	&lt;span style="color:#008000;"&gt;// Check if value was changed&lt;/span&gt;
	&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; oldValue = row.GetMember(columnField).Value;
	&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (oldValue != newValue)
	{
	&lt;span style="color:#008000;"&gt;// Get column index for SetValue&lt;/span&gt;
		&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; col = 0;
		&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; i=0;i&amp;lt;Grid1.Table.Columns.&lt;span style="color:#0000ff;"&gt;length&lt;/span&gt;;i++)
		{
			&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (Grid1.Table.Columns[i].DataField == columnField)
			{
				col = i;
				&lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;
			}
		}
		row.SetValue(col, newValue, &lt;span style="color:#0000ff;"&gt;true&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:#0000ff;"&gt;function&lt;/span&gt; Grid1_addRow()
{
	&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; col = 0;
	&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (Grid1.get_table().getRowCount() &amp;gt; 0)
	{
		&lt;span style="color:#008000;"&gt;// cancel adding row if there is already a blank one&lt;/span&gt;
		&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; row = Grid1.get_table().getRow(Grid1.get_table().getRowCount()-1);
		&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; i=0;i&amp;lt;Grid1.Table.Columns.&lt;span style="color:#0000ff;"&gt;length&lt;/span&gt;;i++)
		{
			&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (row.getMemberAt(i).get_text() != &amp;quot;&lt;span style="color:#8b0000;"&gt;&lt;/span&gt;&amp;quot;)
			{
				Grid1.get_table().addRow();
				&lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;
			}
		}
	}
	&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
	{
		Grid1.get_table().addRow();
	}
	&lt;span style="color:#0000ff;"&gt;setTimeout&lt;/span&gt;(&amp;quot;&lt;span style="color:#8b0000;"&gt;setTextboxFocus();&lt;/span&gt;&amp;quot;, 100);
}
&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; setTextboxFocus(datafield, index)
{
	&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt; datafield == &amp;quot;&lt;span style="color:#8b0000;"&gt;undefined&lt;/span&gt;&amp;quot;) datafield = firstEditableDataField;
	&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt; index == &amp;quot;&lt;span style="color:#8b0000;"&gt;undefined&lt;/span&gt;&amp;quot;) index = Grid1.get_recordCount() - Grid1.get_recordOffset() - 1;
	&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; elementId = &amp;quot;&lt;span style="color:#8b0000;"&gt;textbox_&lt;/span&gt;&amp;quot; + index + &amp;quot;&lt;span style="color:#8b0000;"&gt;_&lt;/span&gt;&amp;quot; + datafield;
	&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;
	{
		&lt;span style="color:#0000ff;"&gt;document&lt;/span&gt;.getElementById(elementId).&lt;span style="color:#0000ff;"&gt;focus&lt;/span&gt;();
	}
	&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (err)
	{
	}
}

&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; EditField_onKeyPress(e)
{
	&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(!e) e = &lt;span style="color:#0000ff;"&gt;window&lt;/span&gt;.event;
	key = e.keyCode ? e.keyCode : e.which;
	&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (key == 13) &lt;span style="color:#008000;"&gt;//enter&lt;/span&gt;
	{
		saveCell(editingClientId, editingDataField, &lt;span style="color:#0000ff;"&gt;document&lt;/span&gt;.getElementById(editingTextboxId).value);
		Grid1_addRow();
	}
	&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (key == 38) &lt;span style="color:#008000;"&gt;//up&lt;/span&gt;
	{
		&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; index = editingIndexRow - 1;
		&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (index &amp;gt; -1)
		{
			editingIndexRow = index;
			saveCell(editingClientId, editingDataField, &lt;span style="color:#0000ff;"&gt;document&lt;/span&gt;.getElementById(editingTextboxId).value);
			setTextboxFocus(editingDataField, index);
		}
	}
	&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (key == 40) &lt;span style="color:#008000;"&gt;//down&lt;/span&gt;
	{
		&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; index = editingIndexRow + 1;
		&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (index &amp;lt; Grid1.get_pageSize())
		{
			editingIndexRow = index;
			saveCell(editingClientId, editingDataField, &lt;span style="color:#0000ff;"&gt;document&lt;/span&gt;.getElementById(editingTextboxId).value);
			setTextboxFocus(editingDataField, index);
		}
	}
}&lt;/pre&gt;
&lt;br /&gt;
Here&amp;#39;s a screenshot of what the Grid will look like:&lt;br /&gt;
&lt;div style="border:1px solid black;margin:4px;padding:4px;width:680px;overflow-y:auto;overflow-x:scroll;"&gt;
&lt;img alt="Web.UI Grid using DataCell client templates" src="http://www.componentart.com/blogs/hwan/images/data_entry_spreadsheet_grid.png" title="Web.UI Grid using DataCell client templates" /&gt;
&lt;/div&gt;
&lt;a href="http://www.componentart.com/blogs/hwan/images/editing_dataClientMode07_excel_textentry.zip"&gt;Download the code for this example&lt;/a&gt; (8.56 KB)&lt;br /&gt;&lt;br /&gt;
&lt;p style="font-size:smaller;"&gt;
Notes:&lt;br /&gt;
i. I tested against Internet Explore 7, Firefox 3, Chrome, Safari and Opera.  I set UseSubmitBehavior to false on the ASP Button so that a postback doesn&amp;#39;t occur when the user hits Enter, but this doesn&amp;#39;t seem to work in Chrome or Safari.  The Grid functionality should otherwise be identical across these browsers.&lt;br /&gt;
ii. I save cell data whenever key navigation occurs since the Up/Down/Enter strokes won&amp;#39;t raise the blur event.&lt;br /&gt;
iii. I had considered adding Left/Right Arrow navigation but that would require remembering which column is currently in focus, which would greatly complicate things so I opted not to.&lt;br /&gt;
iv. The &amp;quot;save changes&amp;quot; ASP Button simply loops through the Items collection on the server and outputs their values so that you can get an idea of how to store the edits.&lt;br /&gt;
v. I give a tabindex of -1 to the DeleteCellTemplate anchor so that it&amp;#39;s skipped during Tab navigation.&lt;br /&gt;
vi.  In the JS section above you&amp;#39;ll need to remove the underscores from &amp;quot;j__avascript&amp;quot; as our blog software doesn&amp;#39;t allow that string.&lt;br /&gt;
&lt;/p&gt;
&lt;/span&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/hwan/archive/2009/03/12/give-web-ui-grid-data-entry-spreadsheet-behavior.aspx&amp;amp;;subject=Convert+Web.UI+ASP.NET+Grid+into+a+data+entry+spreadsheet" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/03/12/give-web-ui-grid-data-entry-spreadsheet-behavior.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/hwan/archive/2009/03/12/give-web-ui-grid-data-entry-spreadsheet-behavior.aspx&amp;amp;;title=Convert+Web.UI+ASP.NET+Grid+into+a+data+entry+spreadsheet" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/03/12/give-web-ui-grid-data-entry-spreadsheet-behavior.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/hwan/archive/2009/03/12/give-web-ui-grid-data-entry-spreadsheet-behavior.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/03/12/give-web-ui-grid-data-entry-spreadsheet-behavior.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/hwan/archive/2009/03/12/give-web-ui-grid-data-entry-spreadsheet-behavior.aspx&amp;amp;title=Convert+Web.UI+ASP.NET+Grid+into+a+data+entry+spreadsheet" target="_blank" title = "Post http://www.componentart.com/BLOGS/hwan/archive/2009/03/12/give-web-ui-grid-data-entry-spreadsheet-behavior.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=27804" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/hwan/archive/tags/grid/default.aspx">grid</category><category domain="http://www.componentart.com/BLOGS/hwan/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.componentart.com/BLOGS/hwan/archive/tags/Web.UI/default.aspx">Web.UI</category></item><item><title>Tapping Into the Raw Power of Silverlight</title><link>http://www.componentart.com/BLOGS/miljan/archive/2009/02/17/tapping-into-the-raw-power-of-silverlight.aspx</link><pubDate>Tue, 17 Feb 2009 21:37:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:27292</guid><dc:creator>Miljan</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;We are excited to announce the availability of ComponentArt Web.UI for Silverlight Beta - our latest suite of controls for Rich Internet Application development. The initial release will feature eight controls, with rapid expansion of the suite planned throughout 2009. Links to live demos, beta download package, as well as detailed roadmap information are all available on our &lt;a href="http://www.componentart.com/silverlight/" title="Silverlight Controls by ComponentArt"&gt;Silverlight Controls&lt;/a&gt; page. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://www.componentart.com/silverlight/" title="Silverlight Controls by ComponentArt"&gt;&lt;img border="0" height="490" src="http://www.componentart.com/blogs/miljan/images/2009_02_17_Silverlight.png" width="680" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Admittedly, we are a little late to the Silverlight party. Other leading vendors have been offering Silverlight products for a few months now. On top of that, there is Microsoft&amp;#39;s own excellent &lt;a href="http://www.codeplex.com/Silverlight"&gt;Silverlight Control Toolkit&lt;/a&gt;, containing a large number of controls.&lt;/p&gt;&lt;p&gt;However, what&amp;#39;s missing from the marketplace at this time, in my opinion, are real &amp;quot;industrial strength&amp;quot; line of business controls. Rather than trying to quickly ship a large number of controls, we decided to take our time to&amp;nbsp; make these core controls (Menu, TreeView, Grid, ToolBar, etc.)&amp;nbsp; as solid as possible. There are many features that we still want to add, so this release is only the first step on that journey. I hope you will find that our effort was worthwhile and that we managed to deliver best-of-breed core UI functionality.&lt;/p&gt;&lt;p&gt;Silverlight is truly a wonderful presentation layer platform. Products currently offered in the marketplace merely scratch the surface of what can be done with it (that includes our own offering). There is so much &amp;quot;raw power&amp;quot; in Silverlight and we are really excited about the opportunity to add value to it. &lt;br /&gt;&lt;br /&gt;As always, your feedback is welcome and highly appreciated. Please let us know what you think about the current features as well as the announced roadmap. A flurry of blog posts by our Silverlight team is forthcoming, I&amp;#39;m sure, so don&amp;#39;t hesitate to tell us what you&amp;#39;d like us to write about. &lt;br /&gt;&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/2009/02/17/tapping-into-the-raw-power-of-silverlight.aspx&amp;amp;;subject=Tapping+Into+the+Raw+Power+of+Silverlight" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/02/17/tapping-into-the-raw-power-of-silverlight.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/miljan/archive/2009/02/17/tapping-into-the-raw-power-of-silverlight.aspx&amp;amp;;title=Tapping+Into+the+Raw+Power+of+Silverlight" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/02/17/tapping-into-the-raw-power-of-silverlight.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/miljan/archive/2009/02/17/tapping-into-the-raw-power-of-silverlight.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/02/17/tapping-into-the-raw-power-of-silverlight.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/miljan/archive/2009/02/17/tapping-into-the-raw-power-of-silverlight.aspx&amp;amp;title=Tapping+Into+the+Raw+Power+of+Silverlight" target="_blank" title = "Post http://www.componentart.com/BLOGS/miljan/archive/2009/02/17/tapping-into-the-raw-power-of-silverlight.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=27292" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Web.UI+for+Silverlight/default.aspx">Web.UI for Silverlight</category><category domain="http://www.componentart.com/BLOGS/miljan/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Gauges to join ComponentArt's expanding list of controls</title><link>http://www.componentart.com/BLOGS/filip/archive/2008/12/15/gauges-to-join-componentart-s-expanding-list-of-controls.aspx</link><pubDate>Mon, 15 Dec 2008 19:36:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:26010</guid><dc:creator>Filip</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;One of the most frequently asked questions our sales and support teams have been getting over the past year or two is if we are going to make a gauges control that is on par with the rest of our controls.&amp;nbsp; Our answer has always been yes, but it is only now that we are able to let the cat out of the bag.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;For the past few months we have been working on a WebGauge control for ASP.NET. Our goal with this control was simple:&amp;nbsp; Create a control that has excellent server performance, is easy to use and is visually up to the high standard of ComponentArt&amp;#39;s controls. &lt;/p&gt;

&lt;p&gt;The server performance issue was handled by our innovative approach of layering multiple images to get the final gauge image.&amp;nbsp; With this technique we are able to achieve rendering times of less than one tenth of a second (100 milliseconds) for most commonly used gauges.&lt;/p&gt;

&lt;p&gt;The concept of themes plays a big part in making the control easy to use.&amp;nbsp; Our first version of the control will come packaged with four themes.&amp;nbsp; The idea behind this concept is that the user should be able to create a gauge in seconds by selecting the gauge geometry, setting the theme, and a value for the gauge.&amp;nbsp; Of course everything is customizable in case you desire to fine tune the details.&amp;nbsp; Currently available color themes have the following look:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.componentart.com/blogs/filip/images/gauge_themes.png" style="text-align:center;" /&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;Other features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Circular, Semi-Circular, Quarter-Circular, Linear and Numeric gauges&lt;/li&gt;
&lt;li&gt;Subgauges, multiple scales, ranges and pointers within a gauge&lt;/li&gt;
&lt;li&gt;Full client-side API with the ability to auto-refresh on a given interval&lt;/li&gt;
&lt;li&gt;Design time wizard and property view that allow setting of most properties with visual feedback&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the other hand, pictures speak a thousand words, so perhaps it&amp;#39;s best to take a look at some of our preliminary mock-ups and renderings:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://www.componentart.com/blogs/filip/images/gauge_appearance.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.componentart.com/blogs/filip/images/gauge_scalesAndRanges.png" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.componentart.com/blogs/filip/images/gauge_blackice_suite.png" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The beta version of our WebGauge control should be available before Christmas, with the full release in January. &lt;br /&gt;
&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/12/15/gauges-to-join-componentart-s-expanding-list-of-controls.aspx&amp;amp;;subject=Gauges+to+join+ComponentArt%27s+expanding+list+of+controls" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/12/15/gauges-to-join-componentart-s-expanding-list-of-controls.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/filip/archive/2008/12/15/gauges-to-join-componentart-s-expanding-list-of-controls.aspx&amp;amp;;title=Gauges+to+join+ComponentArt%27s+expanding+list+of+controls" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/12/15/gauges-to-join-componentart-s-expanding-list-of-controls.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/filip/archive/2008/12/15/gauges-to-join-componentart-s-expanding-list-of-controls.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/12/15/gauges-to-join-componentart-s-expanding-list-of-controls.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/filip/archive/2008/12/15/gauges-to-join-componentart-s-expanding-list-of-controls.aspx&amp;amp;title=Gauges+to+join+ComponentArt%27s+expanding+list+of+controls" target="_blank" title = "Post http://www.componentart.com/BLOGS/filip/archive/2008/12/15/gauges-to-join-componentart-s-expanding-list-of-controls.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=26010" width="1" height="1"&gt;</description></item><item><title>ComponentArt Silverlight Preview</title><link>http://www.componentart.com/BLOGS/milos/archive/2008/12/05/componentart-silverlight-preview.aspx</link><pubDate>Fri, 05 Dec 2008 17:15:00 GMT</pubDate><guid isPermaLink="false">c19e7ad3-6f2a-44cb-a9a2-6a12e252d531:25808</guid><dc:creator>Milos</dc:creator><slash:comments>3</slash:comments><description>
&lt;p&gt;If you are wondering what we here at ComponentArt have been up to in the last while, wonder no more: we have been busily working on a foray into the world of Silverlight. It&amp;#39;a always exciting to play with a new user interface technology, not least one that is as well thought-out and powerful as this. We have put together a small but ever-growing demo application to showcase some of our archievements so far, which you can check out at &lt;a href="http://silverlight.componentart.com"&gt;silverlight.componentart.com.&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;I personally have been working on the &lt;a href="http://silverlight.componentart.com/#DataGrid"&gt;DataGrid&lt;/a&gt; control. Our aim with DataGrid, as with the rest of the suite, is to make controls which will retain all the familiar features and UI capabilities of our AJAX suite and include new ones which will utilize the best of what Silverlight brings to the game. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Let us know what you think and what you would like to see in the upcoming ComponentArt Silverlight product line.&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/milos/archive/2008/12/05/componentart-silverlight-preview.aspx&amp;amp;;subject=ComponentArt+Silverlight+Preview" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/12/05/componentart-silverlight-preview.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.componentart.com/BLOGS/milos/archive/2008/12/05/componentart-silverlight-preview.aspx&amp;amp;;title=ComponentArt+Silverlight+Preview" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/12/05/componentart-silverlight-preview.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2008/12/05/componentart-silverlight-preview.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/12/05/componentart-silverlight-preview.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.componentart.com/BLOGS/milos/archive/2008/12/05/componentart-silverlight-preview.aspx&amp;amp;title=ComponentArt+Silverlight+Preview" target="_blank" title = "Post http://www.componentart.com/BLOGS/milos/archive/2008/12/05/componentart-silverlight-preview.aspx"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/BLOGS/aggbug.aspx?PostID=25808" width="1" height="1"&gt;</description><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/datagrid/default.aspx">datagrid</category><category domain="http://www.componentart.com/BLOGS/milos/archive/tags/silverlight/default.aspx">silverlight</category></item><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>1</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>1</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>2</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>4</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>1</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>1</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>24</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>1</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>1</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></channel></rss>
