<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.devexpress.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ctodx</title><link>http://community.devexpress.com/blogs/ctodx/default.aspx</link><description>Discussions, news and rants from the CTO of Developer Express, Julian M Bucknall</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 SP1 (Build: 30415.43)</generator><item><title>Curl up in front of a roaring fire with our EULA</title><link>http://community.devexpress.com/blogs/ctodx/archive/2010/02/01/curl-up-in-front-of-a-roaring-fire-with-our-eula.aspx</link><pubDate>Mon, 01 Feb 2010 22:50:12 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292881</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>17</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=292881</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2010/02/01/curl-up-in-front-of-a-roaring-fire-with-our-eula.aspx#comments</comments><description>&lt;p&gt;OK, the headline is said partly in jest, but the intent is serious. You see, we had a weird support case over the weekend where tempers were starting to rise, until Alex in support worked out what was going on.&lt;/p&gt;  &lt;p&gt;The customer was writing a small test program with ASPxScheduler. Worked fine on his development machine — yes, it&amp;#39;s the &lt;a href="http://www.codinghorror.com/blog/archives/000818.html"&gt;perennial programmer&amp;#39;s excuse&lt;/a&gt; &lt;img src="http://community.devexpress.com/emoticons/emotion-1.gif" alt="Smile" /&gt; — but when he copied the test app over to the production server with all required DevExpress assemblies and ran it, blam, the &lt;a href="http://en.wikipedia.org/wiki/Screens_of_death"&gt;Yellow Screen of Death&lt;/a&gt;. The error was frankly bizarre: &amp;quot;Make sure that the class defined in this code file matches the &amp;quot;inherits&amp;quot; attribute, and that it extends the correct base class.&amp;quot; Nice, but what the … does it mean?&lt;/p&gt;  &lt;p&gt;Of course, the support team couldn&amp;#39;t replicate the problem either (more &amp;quot;works on my machine&amp;quot; in other words). We thought it was one thing and then another, nothing seemed to make sense, and every back and forth would dial up the frustration and the tense atmosphere towards the magical 11. Even Mehul was dragged into the fray, and he&amp;#39;s in Paris.&lt;/p&gt;  &lt;p&gt;Finally this morning, Alex noticed something in a screenshot: the customer was copying the *.design.dlls to the production website as well. The customer considered them part of the &amp;quot;required DevExpress dlls&amp;quot; and had unknowingly copied them over along with the run-time dlls. Our support guys, knowing the language in the EULA, had naturally assumed that this wasn&amp;#39;t the case and so were trying more and more outlandish scenarios trying to replicate the customer&amp;#39;s problem. Removing the design-time-only dlls solved the issue.&lt;/p&gt;  &lt;p&gt;The moral of the story is this: the EULA not only defines your rights and ours and is admittedly quite boring to read, but it does also define a long list of dlls that you can — are allowed to — deploy along with your application. None of the *.design.dlls are deployable. &lt;/p&gt;  &lt;p&gt;So, take a moment to read our EULA. You may save yourself some support time in the future…&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292881" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/EULA/default.aspx">EULA</category></item><item><title>How to make a Flickr slideshow using DXperience ASP.NET</title><link>http://community.devexpress.com/blogs/ctodx/archive/2010/01/29/how-to-make-a-flickr-slideshow-using-dxperience-asp-net.aspx</link><pubDate>Sat, 30 Jan 2010 00:55:50 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292667</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=292667</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2010/01/29/how-to-make-a-flickr-slideshow-using-dxperience-asp-net.aspx#comments</comments><description>&lt;p&gt;One of the chapters I wrote for &lt;em&gt;&lt;a href="http://www.amazon.com/Professional-DevExpress-ASP-NET-Controls-Programmer/dp/0470500832"&gt;Professional DevExpress ASP.NET Controls&lt;/a&gt;&lt;/em&gt; was chapter 11 on asynchronous programming. In essence, I showed how to use the client-side functionality of the DevExpress ASP.NET controls, as well as using callbacks.&lt;/p&gt;  &lt;p&gt;One of the example programs I developed for that chapter was a slideshow application using an ASPxCallbackPanel, an ASPxRoundPanel (because I wanted it to look good), an ASPxImage, a few ASPxButtons, and an ASPxTimer. I glossed over the &amp;quot;where the photos come from&amp;quot; problem by just having an array of pre-initialized URLs. I always thought it was a bit of a daft excuse -- I cop to it being a cop-out, if you like -- but then again I was really describing the use of client-side JavaScript and AJAX and all that good stuff and didn&amp;#39;t want to muddy it with a bunch of photo-handling code. &lt;/p&gt;  &lt;p&gt;Well, no more. Let&amp;#39;s modify the app to get our photos from &lt;a href="http://flickr.com"&gt;Flickr&lt;/a&gt;. The first thing we need is a great little open-source library called Flickr.NET so go &lt;a href="http://www.codeplex.com/FlickrNet"&gt;download it from CodePlex&lt;/a&gt;. You only really need the binaries, but if you want to see how it&amp;#39;s built, download the source as well. Add the FlickrNet assembly to the solution, a reference to it, and add the &lt;code&gt;using FlickrNet;&lt;/code&gt; statement to the code-behind file.&lt;/p&gt;  &lt;p&gt;Now let&amp;#39;s quickly build the visual part of the application. Drop an ASPxCallbackPanel onto the web project&amp;#39;s main form. Drop an ASPxRoundPanel inside that, and then an ASPxImage inside of that. Create a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; element underneath all that and drop four ASPxButtons&amp;#160; and an ASPxTimer inside that &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;. Set the various properties and names such that you get the following HTML code:&lt;/p&gt;  &lt;div class="jmbcodeblock"&gt;   &lt;pre&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;form&lt;/span&gt; &lt;span style="color:#008000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&amp;gt;
&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxCallbackPanel&lt;/span&gt; &lt;span style="color:#008000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CallbackPanel&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;  
      &lt;span style="color:#008000;"&gt;ClientInstanceName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;callbackPanel&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;HideContentOnCallback&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;False&amp;quot;&lt;/span&gt; 
      &lt;span style="color:#008000;"&gt;oncallback&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CallbackPanel_Callback&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;ShowLoadingPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;False&amp;quot;&amp;gt;
&lt;/span&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PanelCollection&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PanelContent&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&amp;gt;
&lt;/span&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxRoundPanel&lt;/span&gt; &lt;span style="color:#008000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;RoundPanel&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&amp;gt;
&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PanelCollection&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PanelContent&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&amp;gt;
&lt;/span&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxImage&lt;/span&gt; &lt;span style="color:#008000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ImageViewer&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&amp;gt;
&lt;/span&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxImage&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PanelContent&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:#a31515;"&gt;PanelCollection&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxRoundPanel&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PanelContent&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:#a31515;"&gt;PanelCollection&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxCallbackPanel&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:#a31515;"&gt;div&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:#a31515;"&gt;div&lt;/span&gt; &lt;span style="color:#008000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;buttons&amp;quot;&amp;gt;
&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt; &lt;span style="color:#008000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;float&lt;/span&gt;:&lt;span style="color:#0000ff;"&gt;left&lt;/span&gt;;&lt;span style="color:#0000ff;"&gt;&amp;quot;&amp;gt;
&lt;/span&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxButton&lt;/span&gt; &lt;span style="color:#008000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Prev&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Previous&amp;quot;&lt;/span&gt; &lt;br /&gt;        &lt;span style="color:#008000;"&gt;ClientInstanceName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;prevButton&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;EnableClientSideAPI&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;AutoPostBack&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;False&amp;quot;&amp;gt;
&lt;/span&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ClientSideEvents&lt;/span&gt; &lt;span style="color:#008000;"&gt;Click&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;function(s, e) {slideshowEngine.movePrev();}&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxButton&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:#a31515;"&gt;div&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:#a31515;"&gt;div&lt;/span&gt; &lt;span style="color:#008000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;float&lt;/span&gt;:&lt;span style="color:#0000ff;"&gt;left&lt;/span&gt;;&lt;span style="color:#0000ff;"&gt;&amp;quot;&amp;gt;
&lt;/span&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxButton&lt;/span&gt; &lt;span style="color:#008000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Play&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Play&amp;quot;&lt;/span&gt; &lt;br /&gt;        &lt;span style="color:#008000;"&gt;ClientInstanceName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;playButton&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;EnableClientSideAPI&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;AutoPostBack&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;False&amp;quot;&amp;gt;
&lt;/span&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ClientSideEvents&lt;/span&gt; &lt;span style="color:#008000;"&gt;Click&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;function(s, e) {slideshowEngine.play();}&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxButton&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:#a31515;"&gt;div&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:#a31515;"&gt;div&lt;/span&gt; &lt;span style="color:#008000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;float&lt;/span&gt;:&lt;span style="color:#0000ff;"&gt;left&lt;/span&gt;;&lt;span style="color:#0000ff;"&gt;&amp;quot;&amp;gt;
&lt;/span&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxButton&lt;/span&gt; &lt;span style="color:#008000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Stop&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Stop&amp;quot;&lt;/span&gt; &lt;br /&gt;        &lt;span style="color:#008000;"&gt;ClientInstanceName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;stopButton&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;EnableClientSideAPI&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;AutoPostBack&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;False&amp;quot;&amp;gt;
&lt;/span&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ClientSideEvents&lt;/span&gt; &lt;span style="color:#008000;"&gt;Click&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;function(s, e) {slideshowEngine.stop();}&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxButton&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:#a31515;"&gt;div&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:#a31515;"&gt;div&lt;/span&gt; &lt;span style="color:#008000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;float&lt;/span&gt;:&lt;span style="color:#0000ff;"&gt;left&lt;/span&gt;;&lt;span style="color:#0000ff;"&gt;&amp;quot;&amp;gt;
&lt;/span&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxButton&lt;/span&gt; &lt;span style="color:#008000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Next&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Next&amp;quot;&lt;/span&gt; &lt;br /&gt;        &lt;span style="color:#008000;"&gt;ClientInstanceName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;nextButton&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;EnableClientSideAPI&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;AutoPostBack&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;False&amp;quot;&amp;gt;
&lt;/span&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ClientSideEvents&lt;/span&gt; &lt;span style="color:#008000;"&gt;Click&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;function(s, e) {slideshowEngine.buttonMoveNext();}&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxButton&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:#a31515;"&gt;div&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxTimer&lt;/span&gt; &lt;span style="color:#008000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Timer&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; 
      &lt;span style="color:#008000;"&gt;ClientInstanceName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;slideshowTimer&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;Interval&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;4000&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;Enabled&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;False&amp;quot;&amp;gt;
&lt;/span&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ClientSideEvents&lt;/span&gt; 
        &lt;span style="color:#008000;"&gt;Init&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;function(s, e) {slideshowEngine.play();}&amp;quot;&lt;/span&gt; 
        &lt;span style="color:#008000;"&gt;Tick&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;function(s, e) {slideshowEngine.tickMoveNext();}&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:#a31515;"&gt;dx&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ASPxTimer&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:#a31515;"&gt;div&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:#a31515;"&gt;form&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;In essence I named everything nicely (server-side and client-side) and set the client-side behavior of the buttons and timer to call various methods in a JavaScript object called &lt;code&gt;slideshowEngine&lt;/code&gt;. I also created a callback method called &lt;code&gt;CallbackPanel_Callback()&lt;/code&gt; in the code-behind C# file.&lt;/p&gt;

&lt;p&gt;I created a new JScript file called &lt;code&gt;slideshow.js&lt;/code&gt; to the solution and placing it in the website folder. By dragging the file from the Solution Explorer to the &lt;code&gt;default.aspx&lt;/code&gt; file and dropping it after the &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; element&amp;#39;s end tag, Visual Studio created the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; element for me.&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt; &lt;span style="color:#008000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;slideshow.js&amp;quot;&lt;/span&gt; &lt;span style="color:#008000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The JavaScript code looks like this:&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; slideshowEngine &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() {
  &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; timerOn &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;

  &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; setTimer &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(enable) {
    slideshowTimer.SetEnabled(enable);
    timerOn &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
  };

  &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; moveNext &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() {
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#808000;"&gt;!&lt;/span&gt;callbackPanel.InCallback()) {
      callbackPanel.PerformCallback(&lt;span style="color:#ff00ff;"&gt;&amp;quot;next&amp;quot;&lt;/span&gt;);
    }
  };

  &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; movePrior &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() {
    setTimer(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#808000;"&gt;!&lt;/span&gt;callbackPanel.InCallback()) {
      callbackPanel.PerformCallback(&lt;span style="color:#ff00ff;"&gt;&amp;quot;prev&amp;quot;&lt;/span&gt;);
    }
  };

  &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; {
    tickMoveNext&lt;span style="color:#808000;"&gt;:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() {
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (timerOn) {
        moveNext();
      }
    }&lt;span style="color:#808000;"&gt;,
&lt;/span&gt;    buttonMoveNext&lt;span style="color:#808000;"&gt;:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() {
      setTimer(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);
      moveNext();
    }&lt;span style="color:#808000;"&gt;,
&lt;/span&gt;    movePrev&lt;span style="color:#808000;"&gt;:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() {
      movePrior();
    }&lt;span style="color:#808000;"&gt;,
&lt;/span&gt;    play&lt;span style="color:#808000;"&gt;:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() {
      setTimer(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);
    }&lt;span style="color:#808000;"&gt;,
&lt;/span&gt;    stop&lt;span style="color:#808000;"&gt;:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() {
      setTimer(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);
    }
  };
} ();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This uses what you might term an advanced style of JavaScript programming. In essence the &lt;code&gt;slideshow&lt;/code&gt; object is defined as the result of running an anonymous function (although it looks to be declared as a function, look to the last line and you&amp;#39;ll see that it is immediately executed -- you can see the function call parentheses). The reason for doing this is to strictly control what&amp;#39;s public in the object: the function invocation will form a closure and return the anonymous object defined by the &lt;code&gt;return&lt;/code&gt; statement. The only members that are visible in the created &lt;code&gt;slideshow&lt;/code&gt; object will be &lt;code&gt;tickMoveNext()&lt;/code&gt;, &lt;code&gt;buttonMoveNext()&lt;/code&gt;, &lt;code&gt;movePrev()&lt;/code&gt;, &lt;code&gt;play()&lt;/code&gt;, and &lt;code&gt;stop()&lt;/code&gt;. The rest of the code you can see will be in the function closure and invisible to the outside world.&lt;/p&gt;

&lt;p&gt;Anyway, moving on, let&amp;#39;s see what we have to do in the code-behind file.&lt;/p&gt;

&lt;p&gt;In order to use anything in the Flickr API you have to have what&amp;#39;s known as an apiKey. You can get these from Flickr, by logging in with your user ID, and going to &lt;a href="http://www.flickr.com/services/api/keys"&gt;http://www.flickr.com/services/api/keys&lt;/a&gt;. I created one specially for this demo, as you&amp;#39;ll see below, but if you want to use this technique, you should create and use your own (you&amp;#39;d really hate it if I deleted mine on a whim).&lt;/p&gt;

&lt;p&gt;For this example, I just wanted to do a tagged search. This returns 100 photos at a time (or, more strictly, the details for 100 photos -- the actual images are available elsewhere), so it seemed to be a good idea to save the results of a search operation locally on the server in the Session object. I decided to encapsulate all the Flickr API work in a special class to make this easier, and to just expose a few methods that would enable the slideshow app to cycle through the images. &lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;  &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FlickrResults&lt;/span&gt; {
    &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; apiKey &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;&amp;quot;e28762539e823e30baedcee67e64cae4&amp;quot;&lt;/span&gt;;
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; loadedPage;
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; number;
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Flickr&lt;/span&gt; flickr &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Flickr&lt;/span&gt;(apiKey);
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Photos&lt;/span&gt; photos;

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; FlickrResults() {
      loadedPage &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#808000;"&gt;-&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;;
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Photo&lt;/span&gt; GetPhoto() {
      &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; pageNum &lt;span style="color:#808000;"&gt;=&lt;/span&gt; number &lt;span style="color:#808000;"&gt;%&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;100&lt;/span&gt;;

      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (pageNum &lt;span style="color:#808000;"&gt;!=&lt;/span&gt; loadedPage) {
        &lt;span style="color:#2b91af;"&gt;PhotoSearchOptions&lt;/span&gt; options &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PhotoSearchOptions&lt;/span&gt;();
        options&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Tags &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;&amp;quot;yorkshire&amp;quot;&lt;/span&gt;;
        options&lt;span style="color:#808000;"&gt;.&lt;/span&gt;PerPage &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;100&lt;/span&gt;;
        options&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Page &lt;span style="color:#808000;"&gt;=&lt;/span&gt; pageNum;
        options&lt;span style="color:#808000;"&gt;.&lt;/span&gt;SortOrder &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PhotoSearchSortOrder&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;DateTakenDesc;
        photos &lt;span style="color:#808000;"&gt;=&lt;/span&gt; flickr&lt;span style="color:#808000;"&gt;.&lt;/span&gt;PhotosSearch(options);
        loadedPage &lt;span style="color:#808000;"&gt;=&lt;/span&gt; pageNum;
      }

      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (number &lt;span style="color:#808000;"&gt;&amp;gt;&lt;/span&gt; photos&lt;span style="color:#808000;"&gt;.&lt;/span&gt;TotalPhotos &lt;span style="color:#808000;"&gt;-&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;)
        number &lt;span style="color:#808000;"&gt;=&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)photos&lt;span style="color:#808000;"&gt;.&lt;/span&gt;TotalPhotos &lt;span style="color:#808000;"&gt;-&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;;
      &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; photos&lt;span style="color:#808000;"&gt;.&lt;/span&gt;PhotoCollection[number];
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; MoveNext() {
      number&lt;span style="color:#808000;"&gt;++&lt;/span&gt;;
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; MovePrior() {
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (number &lt;span style="color:#808000;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;)
        number&lt;span style="color:#808000;"&gt;--&lt;/span&gt;;
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Reset() {
      number &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;;
    }
  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Simple enough; the majority of the work is done in the &lt;code&gt;GetPhoto()&lt;/code&gt; method. It works out the page number needed (at 100 photos per page) for the number of the photo requested. If the page of results hasn&amp;#39;t been loaded yet, it&amp;#39;ll make the call to Flickr to get the required page of photos. (Here I&amp;#39;m requesting photos tagged with &amp;quot;yorkshire&amp;quot;, at 100 photos in a page, and ordering the results by the date taken in reverse order. Feel free to play around with your search options.) If the photo number happens to be greater than the total count of photos in the result set, I upper-bound the photo number. Finally return the current photo object from the result set.&lt;/p&gt;

&lt;p&gt;Next up is an easy little method to update the image and details in the browser:&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; UpdateSlideShow() {
      &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; photo &lt;span style="color:#808000;"&gt;=&lt;/span&gt; results&lt;span style="color:#808000;"&gt;.&lt;/span&gt;GetPhoto();
      ImageViewer&lt;span style="color:#808000;"&gt;.&lt;/span&gt;ImageUrl &lt;span style="color:#808000;"&gt;=&lt;/span&gt; photo&lt;span style="color:#808000;"&gt;.&lt;/span&gt;MediumUrl;
      RoundPanel&lt;span style="color:#808000;"&gt;.&lt;/span&gt;HeaderText &lt;span style="color:#808000;"&gt;=&lt;/span&gt; photo&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Title;
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;It gets the current photo object, sets the image URL to the medium-sized image and sets the round panel&amp;#39;s header text to the photo&amp;#39;s description. The &lt;code&gt;results&lt;/code&gt; variable is created in the &lt;code&gt;Page_Load()&lt;/code&gt; method:&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ResultsName &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;&amp;quot;flickrResults&amp;quot;&lt;/span&gt;;
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FlickrResults&lt;/span&gt; results;

    &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt; e) {
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#808000;"&gt;!&lt;/span&gt;IsCallback &lt;span style="color:#808000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#808000;"&gt;!&lt;/span&gt;IsPostBack) {
        results &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FlickrResults&lt;/span&gt;();
        UpdateSlideShow();
        Session[ResultsName] &lt;span style="color:#808000;"&gt;=&lt;/span&gt; results;
      }
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Of course, once created, the &lt;code&gt;results&lt;/code&gt; object gets saved in the Session object, ready for being retrieved (and subsequently saved) during the callback:&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;    &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; CallbackPanel_Callback(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;CallbackEventArgsBase&lt;/span&gt; e) {
      results &lt;span style="color:#808000;"&gt;=&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;FlickrResults&lt;/span&gt;)Session[ResultsName];
      &lt;span style="color:#0000ff;"&gt;switch&lt;/span&gt; (e&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Parameter) {
        &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;&amp;quot;prev&amp;quot;&lt;/span&gt;:
          results&lt;span style="color:#808000;"&gt;.&lt;/span&gt;MovePrior();
          &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;
        &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;&amp;quot;next&amp;quot;&lt;/span&gt;:
          results&lt;span style="color:#808000;"&gt;.&lt;/span&gt;MoveNext();
          &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;
        &lt;span style="color:#0000ff;"&gt;default&lt;/span&gt;:
          results&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Reset();
          &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;
      }
      UpdateSlideShow();
      Session[ResultsName] &lt;span style="color:#808000;"&gt;=&lt;/span&gt; results;
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;And that&amp;#39;s pretty much it. Compiling and running the application produces a nice little web slideshow of photos tagged &amp;quot;yorkshire&amp;quot;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/ctodx/image_50939408.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="DX-Flickr slideshow" border="0" alt="DX-Flickr slideshow" src="http://community.devexpress.com/blogs/ctodx/image_thumb_3974ECFF.png" width="338" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Happy programming!&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292667" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/DXperience/default.aspx">DXperience</category><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/Flickr/default.aspx">Flickr</category></item><item><title>Great review/intro to CodeRush's Test Runner, in French</title><link>http://community.devexpress.com/blogs/ctodx/archive/2010/01/28/great-review-intro-to-coderush-s-test-runner-in-french.aspx</link><pubDate>Thu, 28 Jan 2010 18:43:53 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292516</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=292516</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2010/01/28/great-review-intro-to-coderush-s-test-runner-in-french.aspx#comments</comments><description>&lt;p&gt;All this &lt;a href="http://community.devexpress.com/blogs/ctodx/archive/2010/01/26/encore-quelques-places-224-paris.aspx"&gt;blogging in French&lt;/a&gt; on my part got Christian Ista (twitter: &lt;a href="http://twitter.com/christianista"&gt;@christianista&lt;/a&gt;) to review the new Test Runner feature in CodeRush. In French. Let&amp;#39;s put it like this: he&amp;#39;s much better at it than I am &lt;img src="http://community.devexpress.com/emoticons/emotion-1.gif" alt="Smile" /&gt;.&lt;/p&gt;  &lt;p&gt;It&amp;#39;s a great synopsis of the new functionality and, as Christian points out, it&amp;#39;s available in version 9.3.2 without any increase in price for all CodeRush users, providing of course that their subscription has not lapsed. It is not available in our free &lt;a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/"&gt;CodeRush Xpress&lt;/a&gt;. Christian also gives a well-deserved shout-out to the &lt;a href="http://code.google.com/p/dxcorecommunityplugins/"&gt;CodeRush/DXCore Community Plug-ins&lt;/a&gt; site on Google Code.&lt;/p&gt;  &lt;p&gt;Not only that, but Christian recorded a quick screencast showing the feature in action. You can read his blog post and see the video &lt;a href="http://www.technologies-dotnet.be/2010/01/executer-vos-tests-unitaires-avec.html"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In unrelated news, I now know that &amp;quot;unit tests&amp;quot; is &amp;quot;tests unitaires&amp;quot; in French, &amp;quot;status bar&amp;quot; is &amp;quot;une barre d&amp;#39;états&amp;quot;, &amp;quot;failed test&amp;quot; is either &amp;quot;test défectueux&amp;quot;, &amp;quot;test en échec&amp;quot; or simply &amp;quot;test raté&amp;quot;. (Magic, I really like that last one.) My technical French is getting better... Thanks Christian.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292516" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/CodeRush/default.aspx">CodeRush</category><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/Unit+tests/default.aspx">Unit tests</category><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/Test+runner/default.aspx">Test runner</category></item><item><title>DevExpress Newsletter 20: Message from the CTO</title><link>http://community.devexpress.com/blogs/ctodx/archive/2010/01/27/devexpress-newsletter-20-message-from-the-cto.aspx</link><pubDate>Wed, 27 Jan 2010 17:10:26 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292379</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>21</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=292379</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2010/01/27/devexpress-newsletter-20-message-from-the-cto.aspx#comments</comments><description>&lt;p&gt;Reprinting my Message from the CTO from the twentieth newsletter so that you may comment on my thoughts.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;Assume your code will be public&lt;/i&gt;&lt;/p&gt;    &lt;p&gt;Back when I was a younger programmer than I am now, I remember writing cute but honest comments in my code. Things like &amp;quot;This is a hack, I&amp;#39;ll fix it later&amp;quot;, &amp;quot;This is to satisfy that stupid request that XYZ should happen&amp;quot;, &amp;quot;One day I&amp;#39;ll speed this up, but at least it works&amp;quot;. And some of my identifier names could be a little risqué. All very well, since, of course, I was going to be the only person reading my code.&lt;/p&gt;    &lt;p&gt;Then it spread to my test data, making up charming first and last names, ridiculous addresses, lampooning famous people or just coworkers.&lt;/p&gt;    &lt;p&gt;Of course, you can guess what happened next. Someone high up caught a glimpse and didn&amp;#39;t think it was funny. Oops. Later on, when the code I wrote was actually made public (it happens in the control vendor market, don&amp;#39;t you know) a customer looked at one of my comments and started arguing about the situation it mocked. Double oops.&lt;/p&gt;    &lt;p&gt;So, if you take any advice from me in 2010 at least let it be this recommendation: write your code assuming that it will be public and scrutinized. Don&amp;#39;t play funny games with it. Make sure your text -- be it error messages, test data, comments, whatever -- is squeaky clean. Don&amp;#39;t end up on the Daily WTF with a red face.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A fun one this time, but with a serious underlying point.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292379" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/Newsletter/default.aspx">Newsletter</category></item><item><title>Encore quelques places à Paris</title><link>http://community.devexpress.com/blogs/ctodx/archive/2010/01/26/encore-quelques-places-224-paris.aspx</link><pubDate>Tue, 26 Jan 2010 17:47:23 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292225</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>13</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=292225</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2010/01/26/encore-quelques-places-224-paris.aspx#comments</comments><description>&lt;p&gt;Il y a encore quelques places pour notre événement de formation à Paris. Ceci est votre chance d&amp;#39;apprendre les contrôles ASP.NET de DevExpress et de s&amp;#39;amuser!&lt;/p&gt;  &lt;p&gt;Oliver Sturm et Mehul Harry présenteront la classe «Business Apps with DXperience in ASP.NET» le lundi et mardi Février 1 et 2 à Paris. Cette classe fournit un aperçu de la suite DXperience ASP.NET. Il vous emmène à travers les processus de création d&amp;#39;une application d&amp;#39;entreprise avec une interface externe et aussi interne, utilisant une combinaison typique des composants sur toute la gamme de produits DevExpress ASP.NET. Un niveau bien pratique des connaissances sera réalisé qui vous permet d&amp;#39;écrire des applications commerciales similaires.&lt;/p&gt;  &lt;p&gt;La classe sera présenté en Anglais, soit Américain. Vous pouvez vous inscrire pour la classe ici: &lt;a href="http://professional-developer-training.com/items.aspx?catId=c44"&gt;European Training Roadshow&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;(Une note pour les véritables francophones: Soyez reconnaissants que nous ne parlons pas français &lt;img src="http://community.devexpress.com/emoticons/emotion-1.gif" alt="Smile" /&gt;.)&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292225" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/Training/default.aspx">Training</category></item><item><title>Poor man's Bollinger bands</title><link>http://community.devexpress.com/blogs/ctodx/archive/2010/01/18/poor-man-s-bollinger-bands.aspx</link><pubDate>Mon, 18 Jan 2010 23:05:57 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:291200</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=291200</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2010/01/18/poor-man-s-bollinger-bands.aspx#comments</comments><description>&lt;p&gt;Mehul&amp;#39;s interview with Chris White (&lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/05/video-get-an-edge-in-the-stock-market.aspx"&gt;here&lt;/a&gt;) about EdgeRater was not only popular in the sense of seeing a successful stock market application written using DXperience, but also in the sense of the number of customers asking &amp;quot;when will XtraCharts support Bollinger bands&amp;quot; (EdgeRater uses Bollinger bands as the &amp;quot;edge&amp;quot; in making investment decisions). We are not currently planning to add Bollinger bands to XtraCharts this year, but until we do, here&amp;#39;s a quick way to add them yourself.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Aside&lt;/strong&gt;: For more information on Bollinger bands, see &lt;a href="http://en.wikipedia.org/wiki/Bollinger_bands"&gt;wikipedia&amp;#39;s article&lt;/a&gt; or see John Bollinger&amp;#39;s &lt;a href="http://www.bollingerbands.com/"&gt;website&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In order to display Bollinger bands, we have some assumptions to make and some calculating to do. We assume that the data we&amp;#39;re investigating are values over time. The archetypal example is of course stock prices, but it can be any measurement over time. &lt;/p&gt;  &lt;p&gt;The first band is a moving average of the data over some number of periods, the width of the periods being known as the &lt;em&gt;window&lt;/em&gt;. This is known as the middle band. For example, if we&amp;#39;re measuring fuel efficiency for our car in miles per gallon per minute (that is, our data points are values in mpg, and we calculate it every minute by measuring how far we&amp;#39;ve gone and how much fuel we used in that minute), we may decide that our moving average is calculated from the last 20 data points, or 20 minutes. The number of is the first &amp;quot;knob&amp;quot; in our Bollinger band calculator engine; the bigger the value, the more it &amp;quot;smoothes out&amp;quot; the variability in the original data. Call the width of the window, that is, the number of periods we use in calculating the moving average, N.&lt;/p&gt;  &lt;p&gt;The next two bands, known as the upper and lower bands, are calculated from the running standard deviations. In other words, over the same number of periods as we used for the moving average, we calculate the standard deviation each time. The upper band is calculated as some multiple (say 2) of the standard deviation over the average, and the lower band as the same multiple of the standard deviation under the average. The multiple is the second knob in the Bollinger band engine, although generally it&amp;#39;s left at 2. Call this K. If the upper and lower bands are close together, it indicates low volatility in the original data; the wider apart they are, the greater the volatility. The significant points in the original data are those that lie above the upper band or below the lower band, and in a stock trading environment these are the points at which a trader might buy or sell the underlying stock.&lt;/p&gt;  &lt;p&gt;To chart the Bollinger bands, we therefore have to calculate the moving average and standard deviations of the original set of data. To do this efficiently, we make use of three summation variables. The first is merely the count of data points in our window. Usually this is N, but for the first N-1 windows it will take on the values 1 to N-1. Commonly, we just ignore the first N-1 moving averages and start our bands at the Nth period; this is what we&amp;#39;ll do here. The second is the sum of the data values in the window, S, and the third is the sum of the squares of the data values in the window, Q. The moving average is then &lt;code&gt;(S / N)&lt;/code&gt;, and the standard deviation is &lt;code&gt;sqrt(N.Q - S^2) / N&lt;/code&gt;.&lt;/p&gt;  &lt;p&gt;The nice things about using these running totals is that when we move the window along to the right by one period, we merely subtract the values at the point that slides out of the window on the left and add in the values for the point that slides in on the right. We do not have to calculate the entire total again from scratch every time. Also, it is this property that makes it ideal for calculating the bands for data that is constantly and frequently being added to.&lt;/p&gt;  &lt;p&gt;To illustrate how to use Bollinger bands using XtraCharts, I created this small WinForms application. Drop a chart control onto a new form and dock it to fill the form. Don&amp;#39;t bother setting any properties using the Properties pane, we&amp;#39;ll be doing it all via code.&lt;/p&gt;  &lt;p&gt;Change the form constructor to the following code. In it we shall load the data we&amp;#39;re applying the Bollinger bands statistical analysis to (this will be a line series), and then calculate the bands themselves as area series. &lt;/p&gt;  &lt;div class="jmbcodeblock"&gt;   &lt;pre&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; WindowSize &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;20&lt;/span&gt;;
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; SpreadSize &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;;

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Form1() {
      InitializeComponent();
      LoadOriginalData();
      CalculateBands();

      &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; diagram &lt;span style="color:#808000;"&gt;=&lt;/span&gt; chartControl1&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Diagram &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XYDiagram&lt;/span&gt;;
      diagram&lt;span style="color:#808000;"&gt;.&lt;/span&gt;AxisX&lt;span style="color:#808000;"&gt;.&lt;/span&gt;DateTimeGridAlignment &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTimeMeasurementUnit&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Minute;
      diagram&lt;span style="color:#808000;"&gt;.&lt;/span&gt;AxisX&lt;span style="color:#808000;"&gt;.&lt;/span&gt;DateTimeMeasureUnit &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTimeMeasurementUnit&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Minute;
      diagram&lt;span style="color:#808000;"&gt;.&lt;/span&gt;AxisX&lt;span style="color:#808000;"&gt;.&lt;/span&gt;DateTimeOptions&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Format &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTimeFormat&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;ShortTime;
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We also make sure that the X axis displays times. (The &lt;code&gt;WindowSize&lt;/code&gt; constant is what we called N, &lt;code&gt;SpreadSize&lt;/code&gt; is K.)&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;LoadOriginalData()&lt;/code&gt; method is pretty simple. I create a line series as a random set of points that has some random variability in the form of larger jumps, otherwise it just &amp;quot;jiggles&amp;quot; up and down. &lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; GetRandomValue(&lt;span style="color:#2b91af;"&gt;Random&lt;/span&gt; r, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; oldValue) {
      &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; jump &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;1.0&lt;/span&gt;;
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (r&lt;span style="color:#808000;"&gt;.&lt;/span&gt;NextDouble() &lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0.15&lt;/span&gt;)
        jump &lt;span style="color:#808000;"&gt;=&lt;/span&gt; (r&lt;span style="color:#808000;"&gt;.&lt;/span&gt;NextDouble() &lt;span style="color:#808000;"&gt;-&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0.5&lt;/span&gt;) &lt;span style="color:#808000;"&gt;*&lt;/span&gt; (r&lt;span style="color:#808000;"&gt;.&lt;/span&gt;NextDouble() &lt;span style="color:#808000;"&gt;*&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;30.0&lt;/span&gt;);
      &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (oldValue &lt;span style="color:#808000;"&gt;+&lt;/span&gt; jump) &lt;span style="color:#808000;"&gt;+&lt;/span&gt; ((r&lt;span style="color:#808000;"&gt;.&lt;/span&gt;NextDouble() &lt;span style="color:#808000;"&gt;-&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0.6&lt;/span&gt;) &lt;span style="color:#808000;"&gt;*&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;5.0&lt;/span&gt;);
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; LoadOriginalData() {
      &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; series &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Series&lt;/span&gt;(&lt;span style="color:#ff00ff;"&gt;&amp;quot;OriginalData&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;ViewType&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Line);
      series&lt;span style="color:#808000;"&gt;.&lt;/span&gt;ArgumentScaleType &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ScaleType&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;DateTime;
      series&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Label&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Visible &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
      &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; view &lt;span style="color:#808000;"&gt;=&lt;/span&gt; series&lt;span style="color:#808000;"&gt;.&lt;/span&gt;View &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;LineSeriesView&lt;/span&gt;;
      view&lt;span style="color:#808000;"&gt;.&lt;/span&gt;LineMarkerOptions&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Visible &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;

      &lt;span style="color:#2b91af;"&gt;Random&lt;/span&gt; r &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Random&lt;/span&gt;();
      &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt; time &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Now;
      &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; value &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;20.0&lt;/span&gt;;

      &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;; i &lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;200&lt;/span&gt;; i&lt;span style="color:#808000;"&gt;++&lt;/span&gt;) {
        time &lt;span style="color:#808000;"&gt;=&lt;/span&gt; time&lt;span style="color:#808000;"&gt;.&lt;/span&gt;AddMinutes(&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;);
        value &lt;span style="color:#808000;"&gt;=&lt;/span&gt; GetRandomValue(r, value);
        series&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Points&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SeriesPoint&lt;/span&gt;(time, value));
      }

      chartControl1&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Series&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Add(series);
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I also make sure to turn off the point markers and the labels: there are 200 points here and with markers/labels visible it would look a complete mess.&lt;/p&gt;

&lt;p&gt;I then wrote a helper routine that would create a band as an area series, again turning off the labels and markers.&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Series&lt;/span&gt; GetBand(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name) {
      &lt;span style="color:#2b91af;"&gt;Series&lt;/span&gt; band &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Series&lt;/span&gt;(name, &lt;span style="color:#2b91af;"&gt;ViewType&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Area);
      band&lt;span style="color:#808000;"&gt;.&lt;/span&gt;ArgumentScaleType &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ScaleType&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;DateTime;
      band&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Label&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Visible &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
      &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; view &lt;span style="color:#808000;"&gt;=&lt;/span&gt; band&lt;span style="color:#808000;"&gt;.&lt;/span&gt;View &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AreaSeriesView&lt;/span&gt;;
      view&lt;span style="color:#808000;"&gt;.&lt;/span&gt;MarkerOptions&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Visible &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
      &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; band;
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;CalculateBands()&lt;/code&gt; method is next. &lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; CalculateBands() {
      &lt;span style="color:#2b91af;"&gt;SeriesPointCollection&lt;/span&gt; originalData &lt;span style="color:#808000;"&gt;=&lt;/span&gt; chartControl1&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Series[&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;]&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Points;

      &lt;span style="color:#2b91af;"&gt;Series&lt;/span&gt; middleBand &lt;span style="color:#808000;"&gt;=&lt;/span&gt; GetBand(&lt;span style="color:#ff00ff;"&gt;&amp;quot;MiddleBand&amp;quot;&lt;/span&gt;);
      &lt;span style="color:#2b91af;"&gt;Series&lt;/span&gt; upperBand &lt;span style="color:#808000;"&gt;=&lt;/span&gt; GetBand(&lt;span style="color:#ff00ff;"&gt;&amp;quot;UpperBand&amp;quot;&lt;/span&gt;);
      &lt;span style="color:#2b91af;"&gt;Series&lt;/span&gt; lowerBand &lt;span style="color:#808000;"&gt;=&lt;/span&gt; GetBand(&lt;span style="color:#ff00ff;"&gt;&amp;quot;LowerBand&amp;quot;&lt;/span&gt;);

      &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; sum &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0.0&lt;/span&gt;;
      &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; sumSquares &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0.0&lt;/span&gt;;

      &lt;span style="color:#2b91af;"&gt;SeriesPoint&lt;/span&gt; point;
      &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;; index &lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt; originalData&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Count; index&lt;span style="color:#808000;"&gt;++&lt;/span&gt;) {
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (index &lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt; WindowSize) {
          point &lt;span style="color:#808000;"&gt;=&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;SeriesPoint&lt;/span&gt;)originalData[index];
          sum &lt;span style="color:#808000;"&gt;+=&lt;/span&gt; point&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Values[&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;];
          sumSquares &lt;span style="color:#808000;"&gt;+=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Pow(point&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Values[&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;], &lt;span style="color:#ff0000;"&gt;2.0&lt;/span&gt;);
        }
        &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; {
          point &lt;span style="color:#808000;"&gt;=&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;SeriesPoint&lt;/span&gt;)originalData[index &lt;span style="color:#808000;"&gt;-&lt;/span&gt; WindowSize];
          sum &lt;span style="color:#808000;"&gt;-=&lt;/span&gt; point&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Values[&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;];
          sumSquares &lt;span style="color:#808000;"&gt;-=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Pow(point&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Values[&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;], &lt;span style="color:#ff0000;"&gt;2.0&lt;/span&gt;);

          point &lt;span style="color:#808000;"&gt;=&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;SeriesPoint&lt;/span&gt;)originalData[index];
          sum &lt;span style="color:#808000;"&gt;+=&lt;/span&gt; point&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Values[&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;];
          sumSquares &lt;span style="color:#808000;"&gt;+=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Pow(point&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Values[&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;], &lt;span style="color:#ff0000;"&gt;2.0&lt;/span&gt;);

          &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; mean &lt;span style="color:#808000;"&gt;=&lt;/span&gt; sum &lt;span style="color:#808000;"&gt;/&lt;/span&gt; WindowSize;
          middleBand&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Points&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SeriesPoint&lt;/span&gt;(point&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Argument, mean));
          &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; stdDev &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Sqrt(WindowSize &lt;span style="color:#808000;"&gt;*&lt;/span&gt; sumSquares &lt;span style="color:#808000;"&gt;-&lt;/span&gt; sum &lt;span style="color:#808000;"&gt;*&lt;/span&gt; sum) &lt;span style="color:#808000;"&gt;/&lt;/span&gt; WindowSize;
          upperBand&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Points&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SeriesPoint&lt;/span&gt;(point&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Argument, mean &lt;span style="color:#808000;"&gt;+&lt;/span&gt; stdDev &lt;span style="color:#808000;"&gt;*&lt;/span&gt; SpreadSize));
          lowerBand&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Points&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SeriesPoint&lt;/span&gt;(point&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Argument, mean &lt;span style="color:#808000;"&gt;-&lt;/span&gt; stdDev &lt;span style="color:#808000;"&gt;*&lt;/span&gt; SpreadSize));
        }
      }

      chartControl1&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Series&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Add(upperBand);
      chartControl1&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Series&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Add(middleBand);
      chartControl1&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Series&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Add(lowerBand);
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;First of all we get a local copy of the original data series and create the three bands using my help routine. We initialize the running totals: &lt;code&gt;sum&lt;/code&gt; and &lt;code&gt;sumSquares&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Now for the fun bit: making a pass through the original data to calculate the moving average and standard deviation. The first 20 (actually &lt;code&gt;WindowSize&lt;/code&gt;) points are merely used to &amp;quot;seed&amp;quot; the running totals; these will not be reflected in the Bollinger bands themselves. Once we get past the first 20 points we can start calculating the moving average and the standard deviation. As described in the text above, we drop off the oldest data point from the running totals, and add in the new data point. We can then calculate the mean and add it to the middle band. After that we calculate the running standard deviation using the formula above, from which we can add the upper spread point to the upper band and the lower one to the lower band.&lt;/p&gt;

&lt;p&gt;Finally at the end of the method we add the new area series to the chart control, in order.&lt;/p&gt;

&lt;p&gt;Running the application gives us this (click for full-sized image):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/ctodx/image_71BDA8F5.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Bollinger Bands" border="0" alt="Bollinger Bands" src="http://community.devexpress.com/blogs/ctodx/image_thumb_4147247F.png" width="240" height="143" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Now, of course, this is still only a rough version of what might be achievable (for a start, the colors could be chosen better: these are the default ones), but as a first approximation it&amp;#39;s a good rendition of displaying Bollinger bands with XtraCharts.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=291200" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/XtraCharts/default.aspx">XtraCharts</category><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/Charting/default.aspx">Charting</category></item><item><title>DevExpress Newsletter 19: Message from the CTO</title><link>http://community.devexpress.com/blogs/ctodx/archive/2010/01/13/devexpress-newsletter-19-message-from-the-cto.aspx</link><pubDate>Thu, 14 Jan 2010 04:24:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:290655</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=290655</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2010/01/13/devexpress-newsletter-19-message-from-the-cto.aspx#comments</comments><description>&lt;p&gt;Reprinting my Message from the CTO from the nineteenth newsletter so that you may comment on my thoughts.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;On commitment&lt;/p&gt;    &lt;p&gt;As I write this, Google have just announced their &lt;a href="http://www.google.com/phone"&gt;NexusOne phone&lt;/a&gt;, featuring the next version of the Android operating system. Alongside this announcement are news reports about a recent &lt;a href="http://www.appleinsider.com/articles/10/01/04/user_interest_satisfaction_in_android_approaching_the_iphone.html"&gt;ChangeWave survey&lt;/a&gt; that said levels of user interest and satisfaction in Android are now approaching that of the iPhone. Windows Mobile is falling behind ever more rapidly, fourth behind Blackberry. Suppose you&amp;#39;re a smartphone application developer: which phone OS do you target?&lt;/p&gt;    &lt;p&gt;To bring the question closer to home, since my readers are very likely to be PC or web application developers: which platform should you target? What if the choice you make or have made turns out to be the equivalent of Windows Mobile?&lt;/p&gt;    &lt;p&gt;At some point, after you&amp;#39;ve done your research, you have to commit and implement your plans. And you have to continue with them despite what might be happening in the world outside that might be invalidating your assumptions. If not, your project might turn into&lt;i&gt; &lt;/i&gt;&lt;i&gt;&lt;a href="http://www.wired.com/magazine/2009/12/fail_duke_nukem/"&gt;Duke Nukem Forever&lt;/a&gt;&lt;/i&gt;, where the game engine was changed multiple times before the product was abandoned unreleased.&lt;/p&gt;    &lt;p&gt;There are, I suppose, two strategies to minimize the risk: isolate the technology you&amp;#39;re worried about behind an interface or framework and switch when necessary, or release early and often. The first might not be feasible anyway, and the second at least means you&amp;#39;ll get some revenue and valuable feedback on functionality should a change in technology be required. Commit!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In essence, my thoughts here can be summed up to &amp;quot;release early, release often&amp;quot;, but I&amp;#39;m surprised how often the same possible hesitancy can occur in other situations. An obvious example is buying a new PC: you know very well that if you wait a month, the PC you want will be cheaper, more action-packed, sleeker, but of course after a month you know in a month&amp;#39;s time it will be better still. So you vacillate. &lt;/p&gt;  &lt;p&gt;(Aside: to be brutally honest, the only times I&amp;#39;ve seen the &amp;quot;isolate behind an interface&amp;quot; option being used produced something that looked as if it had been designed by &lt;a href="http://www.joelonsoftware.com/articles/fog0000000018.html"&gt;Architecture Astronauts&lt;/a&gt;.)&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=290655" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/Newsletter/default.aspx">Newsletter</category></item><item><title>Roadmaps lack detail. Film at 11.</title><link>http://community.devexpress.com/blogs/ctodx/archive/2010/01/13/roadmaps-lack-detail-film-at-11.aspx</link><pubDate>Thu, 14 Jan 2010 00:43:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:290662</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=290662</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2010/01/13/roadmaps-lack-detail-film-at-11.aspx#comments</comments><description>&lt;p&gt;I love Google Maps on the iPhone. If I find myself with 5 minutes to spare in a place I&amp;#39;m not familiar with, I can start the app, hit the GPS icon, and the screen shows me where I am. If I&amp;#39;m trying to see where I am in respect to other streets and the like, I use the map option. If I&amp;#39;m just wondering what it&amp;#39;s like around here I can look at the satellite view to get an idea.&lt;/p&gt;  &lt;p&gt;The map is ideal for understanding the layout of the streets and understanding how to get from A to B. There is, however, no detail. It&amp;#39;s essentially just a collection of vectors joined end to end and to each other, each vector having some attributes (start and end latitude and longitude being the primary ones, but type of road, speed limit, etc, are others). For detail, you have to switch to satellite view and then you have all the detail you want: houses, trees, open space, rivers, whatever.&lt;/p&gt;  &lt;p&gt;Our roadmaps are like the map view. You can see the general direction and the route we&amp;#39;re planning to take, but there are little to no details. If you think about it for a little while, you&amp;#39;ll understand why. We just haven&amp;#39;t had the time to fully flesh out and design everything at the point where we discuss and decide on the roadmap. Instead all we have is a list of features, with some information about each feature, and from that starting point we discuss and make a decision about each. Yep, we could be making a decision based on insufficient or imperfect information, but it doesn&amp;#39;t matter. If we waited until we did have sufficient or perfect information, we&amp;#39;d be publishing the roadmap at the end of the year in &amp;quot;satellite&amp;quot; view with flawless hindsight. It would of course be completely useless at that point, apart from as a &amp;quot;this year in review&amp;quot; type blog post.&lt;/p&gt;  &lt;p&gt;Of course, there will be errors in the roadmap. Some things won&amp;#39;t get done. Some others we didn&amp;#39;t mention, will. Others still will be done but in a different order. However the overall arch of the roadmap will be valid. For the 2010 roadmap that means more Silverlight and WPF; it means more work being done to make XAF/XPO the primary choice for business applications; it means polish type work for WinForms, some further investigations into ASP.NET MVC on the web side, and so on.&lt;/p&gt;  &lt;p&gt;But what it means for feature X (for numerous values of X) that&amp;#39;s mentioned &lt;em&gt;en passant&lt;/em&gt; in the roadmap, we don&amp;#39;t fully know. We have some ideas, yes, otherwise it wouldn&amp;#39;t be there, but how X will be designed and implemented is probably still being decided, and may even require something else to be done first. What it means for feature Y that&amp;#39;s &lt;em&gt;not&lt;/em&gt; mentioned at all: it&amp;#39;s either too small to mention in a coarse-resolution roadmap, or it&amp;#39;s probably not going to be done (but who knows).&lt;/p&gt;  &lt;p&gt;So, please don&amp;#39;t take the roadmap to be any more than it already is. There is no subtext to it. Although I mostly make my living from writing these days, I didn&amp;#39;t have the time to add Dan Brown style hints and clues to it: What you see is what you get. It&amp;#39;s a map, not a satellite or street view.&lt;/p&gt;  &lt;p&gt;(Aside: for customers who don&amp;#39;t know the idiom, here&amp;#39;s the explanation for &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/Film_at_11"&gt;Film at 11&lt;/a&gt;&amp;quot;.);&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=290662" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/roadmap/default.aspx">roadmap</category></item><item><title>Build 48 of the VCL subscription published</title><link>http://community.devexpress.com/blogs/ctodx/archive/2010/01/07/build-48-of-the-vcl-subscription-published.aspx</link><pubDate>Thu, 07 Jan 2010 16:44:54 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:289962</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=289962</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2010/01/07/build-48-of-the-vcl-subscription-published.aspx#comments</comments><description>&lt;p&gt;In case you missed the announcement email that was sent out, Build 48 of the VCL subscription has now been published.&lt;/p&gt;  &lt;p&gt;The big new feature of this build is ExpressPrinting System v4. We&amp;#39;ve been blogging about the new enhancements in this release since we published it in beta (&lt;a href="http://community.devexpress.com/blogs/dxram/archive/2009/07/10/PDFs_2C00_-VCL-applications-and-more-Revolutionary-UIs.-.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://community.devexpress.com/blogs/ctodx/archive/2009/08/21/more-info-on-new-printing-library-for-delphi.aspx"&gt;here&lt;/a&gt;, for example), and it&amp;#39;s now fully released. The new features include:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;PDF Export. Reports can now be exported to PDF. A full set of options are available, including compression, font embedding, security.&lt;/li&gt;    &lt;li&gt;Print Preview Dialog style options. Choose between standard, advanced, ribbon styles. The ribbon style is new.&lt;/li&gt;    &lt;li&gt;Skins and Look-And-Feel styles for built-in dialogs. The built-in dialogs now support your application&amp;#39;s skin.&lt;/li&gt;    &lt;li&gt;Many other miscellaneous features.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Apart from ExpressPrinting System v4, there are many changes, fixes, and enhancements to other VCL controls, including the grid, the bars suite, the skinning library, the tree list, the layout control, and so on.&lt;/p&gt;  &lt;p&gt;For the full list of changes please review the What&amp;#39;s New &lt;a href="http://www.devexpress.com/Support/WhatsNew/VCL/files/48.xml"&gt;here&lt;/a&gt;. Note that there are also some breaking changes. Please review that list &lt;a href="http://www.devexpress.com/Support/WhatsNew/VCL/files/48.bc.xml"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=289962" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/C_2B002B00_Builder/default.aspx">C++Builder</category><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/VCL/default.aspx">VCL</category><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/Delphi/default.aspx">Delphi</category></item><item><title>DevExpress Roadmap 2010</title><link>http://community.devexpress.com/blogs/ctodx/archive/2010/01/05/devexpress-roadmap-2010.aspx</link><pubDate>Tue, 05 Jan 2010 18:21:28 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:289692</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>49</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=289692</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2010/01/05/devexpress-roadmap-2010.aspx#comments</comments><description>&lt;p&gt;The roadmap for Developer Express in 2010 has just been published. You can find it &lt;a href="http://www.devexpress.com/Home/Announces/roadmap-2010.xml"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I recommend that all customers read it, not only because of the news about features and enhancements across our entire product line, but also especially as it contains vital new information about how we plan to publish new versions in 2010.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=289692" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/roadmap/default.aspx">roadmap</category></item><item><title>DevExpress Newsletter 17: Message from the CTO</title><link>http://community.devexpress.com/blogs/ctodx/archive/2009/12/17/devexpress-newsletter-17-message-from-the-cto.aspx</link><pubDate>Thu, 17 Dec 2009 17:20:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:288067</guid><dc:creator>Rachel Hawley (Developer Express)</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=288067</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2009/12/17/devexpress-newsletter-17-message-from-the-cto.aspx#comments</comments><description>&lt;p&gt;Dual-posting Julian&amp;#39;s &lt;i&gt;Message from the CTO&lt;/i&gt; from DX Press, the DevExpress Newsletter, issue 17.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Standards&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;This particular rental car I&amp;rsquo;m driving this trip is &amp;hellip; annoying. It&amp;rsquo;s nippy enough and can hold me and my luggage with room to spare, but every time I indicate to overtake or to change direction, I turn on the windshield wipers. You see, my own car has the indicators on the left stalk and this car has them on the right. Heaven knows what the other drivers must think as my wipers frantically swish across the windshield as I turn into a side street.&lt;br /&gt;&lt;br /&gt;It&amp;rsquo;s all a matter of standards. Manufacturers have agreed on the placement of the pedals in a car, but the rest is a mishmash. We have standards too in software: not only in the user interface, but also in &amp;ldquo;hidden&amp;rdquo; areas like XML, communication protocols, file formats, and the like. When we write software, it&amp;rsquo;s as if half of our design decisions have been made for us already. And note I am not knocking this situation, far from it. I still remember that Esc brought up the menu in Word for DOS.&lt;br /&gt;&lt;br /&gt;But sometimes, we implement something that is brand new. It behooves us, in that case, to try and make decisions that could frame some new standards so that other people can follow them (and thereby ensuring their &amp;ldquo;standardness&amp;rdquo;). At DevExpress, we encounter this type of scenario relatively often: every new control design that hasn&amp;rsquo;t been implemented elsewhere will need us to decide on mouse usage, keyboard shortcuts, text placement, and so forth, although we can leverage other standards for things like icons and similar.&lt;/p&gt;
&lt;p&gt;So, embrace standards, for without them, your work would be that much harder to design and complete.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=288067" width="1" height="1"&gt;</description></item><item><title>Summit and Roadmap news</title><link>http://community.devexpress.com/blogs/ctodx/archive/2009/12/11/summit-and-roadmap-news.aspx</link><pubDate>Fri, 11 Dec 2009 20:48:09 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:287463</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>17</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=287463</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2009/12/11/summit-and-roadmap-news.aspx#comments</comments><description>&lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 0px 0px 15px;display:inline;border-top:0px;border-right:0px;" title="Roadmap" border="0" alt="Roadmap" align="right" src="http://community.devexpress.com/blogs/ctodx/Roadmap_40489D5D.jpg" width="424" height="283" /&gt;We&amp;#39;ve reached lunchtime on the last day of our DevExpress Summit. The Summit is the occasion where, every year, around the New Year, the management, team leads, and evangelists all meet together, listen and watch each other&amp;#39;s presentations about where we are, and where we&amp;#39;d like to be, and discuss the proposed features and enhancements for the upcoming year. Of course, this time around, it&amp;#39;s all about the Roadmap for 2010.&lt;/p&gt;  &lt;p&gt;When we published the 2009 Roadmap, we decided to experiment and release it as a series of blog posts as and when we decided on a particular platform or product suite. Although this meant that customers got the news hot off the presses before the ink had even dried, it did have the consequence that a couple of months into the year, finding the &amp;quot;Roadmap&amp;quot; turned into a longwinded exercise in searching the Community site. We received a lot of feedback throughout 2009 that this was, shall we say, not the most stellar decision we ever made. Well, you&amp;#39;ve got to experiment to improve things and you&amp;#39;ve got to move on if the experiment fails.&lt;/p&gt;  &lt;p&gt;This year then, we are reverting to the &amp;quot;old&amp;quot; style of publishing a roadmap: posting a single web page on our main site. That&amp;#39;s why we&amp;#39;ve been mostly silent through the whole week — at least compared with last January.&lt;/p&gt;  &lt;p&gt;My job Monday is to amalgamate all my notes and all the Powerpoint slidedecks into a coherent narrative that describes the whole DevExpress Roadmap for 2010. I&amp;#39;ll be circulating it to everyone here so that they can check their sections (heaven forbid I add something on the sly &lt;img src="http://community.devexpress.com/emoticons/emotion-5.gif" alt="Wink" /&gt;), and so it should be published Wednesday or Thursday. Of course, I&amp;#39;ll announce it here, and it will be prominently displayed on the home page.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=287463" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/roadmap/default.aspx">roadmap</category></item><item><title>Naming anonymous types</title><link>http://community.devexpress.com/blogs/ctodx/archive/2009/12/02/naming-anonymous-types.aspx</link><pubDate>Thu, 03 Dec 2009 01:11:21 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:286315</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=286315</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2009/12/02/naming-anonymous-types.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve been futzing around recently trying to get a grip on LINQ to XML for an internal project. Yeah, I know, everyone else has moved on having solved that particular problem a couple of years ago, but for some reason, although I understood the concepts and the infrastructure behind LINQ, I&amp;#39;d never really coded anything. Until this afternoon, that is.&lt;/p&gt;  &lt;p&gt;Not one to take little nibbles, I decided to attack &lt;code&gt;iTunes Music Library.xml&lt;/code&gt;.&lt;/p&gt;  &lt;p&gt;If you&amp;#39;ve never taken a peek at this file, here&amp;#39;s the header plus the top two tracks from mine:&lt;/p&gt;  &lt;div class="jmbcodeblock"&gt;   &lt;pre&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;encoding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;UTF-8&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;?&amp;gt;
&amp;lt;!&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DOCTYPE&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;plist&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; PUBLIC &lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;-//Apple Computer//DTD PLIST 1.0//EN&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;http://www.apple.com/DTDs/PropertyList-1.0.dtd&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;plist&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dict&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Major Version&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Minor Version&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Application Version&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;9.0.2&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Features&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;5&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Show Content Ratings&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;true&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Music Folder&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;file://localhost/O:/My%20Music/iTunes/iTunes%20Music/&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Library Persistent ID&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;277AA4870A436D01&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Tracks&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dict&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1656&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dict&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Track ID&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1656&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Name&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Voices&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Artist&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Vangelis&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Album Artist&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Vangelis&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Composer&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Vangelis&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Album&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Voices&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt; 
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Genre&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Electronica&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Kind&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;MPEG audio file&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Size&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;5064895&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Total Time&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;421381&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Track Number&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Year&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1995&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Date Modified&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;2008-02-09T21:05:38Z&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Date Added&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;2005-05-06T23:21:31Z&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Bit Rate&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;96&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Sample Rate&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;44100&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Play Count&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;10&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt; 
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Play Date&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;3327338137&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Play Date UTC&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;2009-06-09T03:35:37Z&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Artwork Count&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Persistent ID&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;277AA4870A436D0E&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Track Type&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;File&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Location&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;file://localhost/M:/My%20Music/Vangelis/Voices/01%20-%20Voices.mp3&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;File Folder Count&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;-1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Library Folder Count&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;-1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dict&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1658&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dict&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Track ID&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1658&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Name&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Echoes&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Artist&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Vangelis&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Album Artist&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Vangelis&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Composer&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Vangelis&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Album&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Voices&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Genre&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Electronica&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Kind&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;MPEG audio file&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Size&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;6067997&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Total Time&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;504973&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Track Number&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;2&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Year&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1995&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Date Modified&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;2008-02-09T21:05:38Z&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Date Added&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;2005-05-06T23:21:31Z&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Bit Rate&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;96&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Sample Rate&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;44100&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Play Count&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;9&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Play Date&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;3330797581&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Play Date UTC&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;2009-07-19T04:33:01Z&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;date&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Artwork Count&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Persistent ID&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;277AA4870A436D0F&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Track Type&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;File&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Location&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;file://localhost/M:/My%20Music/Vangelis/Voices/02%20-%20Echoes.mp3&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;string&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;File Folder Count&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;-1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Library Folder Count&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;-1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;integer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dict&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Yep, it&amp;#39;s a mess. The design is not brilliant: I was expecting to see major elements like &amp;quot;song&amp;quot;, and inner elements called &amp;quot;Album&amp;quot; and &amp;quot;Artist&amp;quot; and the like. But no: it&amp;#39;s a dictionary with every entry in the dictionary defined as a key-value pair or as another dictionary entry. Bleugh. &lt;/p&gt;

&lt;p&gt;I almost tossed the idea, but then decided to do a quick search to see if anyone had figured out what to do. I came across &lt;a href="http://www.netcrucible.com/blog/2008/04/11/processing-itunes-library-with-linq/"&gt;this article&lt;/a&gt; by Joshua Allen in his &lt;a href="http://www.netcrucible.com/blog"&gt;Better Living Through Software&lt;/a&gt; blog. In it he described a method using LINQ that transformed the iTunes file into what I might call more normal-looking XML. So I took that idea and ran with it. Essentially I wanted a method that would return a LINQ result set containing cleaned up data, with POCOs (plain old C# objects) and no XML. (In essence, I was going to feed this directly into one of our grids through its &lt;code&gt;DataSource&lt;/code&gt; property.)&lt;/p&gt;

&lt;p&gt;First I loaded the XML file into an &lt;code&gt;XDocument&lt;/code&gt;:&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;&lt;span style="color:#2b91af;"&gt;XDocument&lt;/span&gt; iTunes &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XDocument&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Load(&lt;span style="color:#800080;"&gt;@&amp;quot;O:\My Music\iTunes\iTunes Music Library.xml&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Then I applied Joshua&amp;#39;s LINQ expression to convert the iTunes XML into something more palatable:&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; rawtracks &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; track &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; iTunes&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Descendants(&lt;span style="color:#ff00ff;"&gt;&amp;quot;plist&amp;quot;&lt;/span&gt;)&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Descendants(&lt;span style="color:#ff00ff;"&gt;&amp;quot;dict&amp;quot;&lt;/span&gt;)&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Descendants(&lt;span style="color:#ff00ff;"&gt;&amp;quot;dict&amp;quot;&lt;/span&gt;)&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Descendants(&lt;span style="color:#ff00ff;"&gt;&amp;quot;dict&amp;quot;&lt;/span&gt;)
                &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt;(&lt;span style="color:#ff00ff;"&gt;&amp;quot;track&amp;quot;&lt;/span&gt;,
                    &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; key &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Descendants(&lt;span style="color:#ff00ff;"&gt;&amp;quot;key&amp;quot;&lt;/span&gt;)
                    &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt;(
                       ((&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;)key)&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Replace(&lt;span style="color:#ff00ff;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;, &lt;span style="color:#ff00ff;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;),
                       (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;)(&lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt;)key&lt;span style="color:#808000;"&gt;.&lt;/span&gt;NextNode)
                    );&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Remember, until I enumerate the data from the result set, the only thing that happens with this code is that an expression tree is built. No data has been harmed yet! The result set from this is a list of &lt;code&gt;XElement&lt;/code&gt;s each of whose names is the contents of the &lt;code&gt;&amp;lt;key&amp;gt;&lt;/code&gt; element, and whose content is the node that follows the &lt;code&gt;&amp;lt;key&amp;gt;&lt;/code&gt; node.&lt;/p&gt;

&lt;p&gt;Next, I want to select the actual tracks from this result set (by &amp;quot;actual&amp;quot; I mean that there is an MP3 file behind the track: for some reason the original XML file has a lot of empty entries) and in doing so I want to create an enumerable list of POCOs. First a couple of helper methods:&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; XElementToString(&lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt; e, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; defaultValue) {
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (e &lt;span style="color:#808000;"&gt;==&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) 
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; defaultValue;
      &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; e&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Value;
    }

    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt; XElementToTimeSpan(&lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt; e, &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt; defaultValue) {
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (e &lt;span style="color:#808000;"&gt;==&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; defaultValue;
      &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Int64&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Parse(e&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Value) &lt;span style="color:#808000;"&gt;*&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;10000&lt;/span&gt;);
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;And then the LINQ statement:&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; tracks &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; track &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; rawtracks
             &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Element(&lt;span style="color:#ff00ff;"&gt;&amp;quot;Location&amp;quot;&lt;/span&gt;) &lt;span style="color:#808000;"&gt;!=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null
&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; {
               Artist &lt;span style="color:#808000;"&gt;=&lt;/span&gt; XElementToString(track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Element(&lt;span style="color:#ff00ff;"&gt;&amp;quot;Artist&amp;quot;&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Empty),
               Album &lt;span style="color:#808000;"&gt;=&lt;/span&gt; XElementToString(track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Element(&lt;span style="color:#ff00ff;"&gt;&amp;quot;Album&amp;quot;&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Empty),
               Name &lt;span style="color:#808000;"&gt;=&lt;/span&gt; XElementToString(track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Element(&lt;span style="color:#ff00ff;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Empty),
               Time &lt;span style="color:#808000;"&gt;=&lt;/span&gt; XElementToTimeSpan(track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Element(&lt;span style="color:#ff00ff;"&gt;&amp;quot;TotalTime&amp;quot;&lt;/span&gt;), defaultTime)
             };&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;OK, a quick explanation is in order. For each track in the result set I&amp;#39;m creating a new anonymous object with four properties: Artist, Album, Name, and Time. The &lt;code&gt;tracks&lt;/code&gt; result set is what I need to attach to the &lt;code&gt;DataSource&lt;/code&gt; property of my grid. (Again, executing this last statement does not do anything with the data: that only happens when the grid enumerates the result set.)&lt;/p&gt;

&lt;p&gt;Now, this works very well for my original requirement, but there is a big problem for any other code. If I wrap this up in a method to return the &lt;code&gt;tracks&lt;/code&gt; object, what type does the method return? It&amp;#39;s an &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;, but what is &lt;code&gt;T&lt;/code&gt;? The only thing it can return is &lt;code&gt;object&lt;/code&gt;, which is not exactly informative at code time.&lt;/p&gt;

&lt;p&gt;Enter the Name Anonymous Type refactoring from Refactor! Pro. Place the caret on the &lt;code&gt;new&lt;/code&gt; keyword (it&amp;#39;s easier to hit than the opening brace, which is another activation site), press the refactor key, and select Name Anonymous Type. After renaming the default name, you will get this for the LINQ statement:&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; tracks &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; track &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; rawtracks
             &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Element(&lt;span style="color:#ff00ff;"&gt;&amp;quot;Location&amp;quot;&lt;/span&gt;) &lt;span style="color:#808000;"&gt;!=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null
&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Track&lt;/span&gt;(
               XElementToString(track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Element(&lt;span style="color:#ff00ff;"&gt;&amp;quot;Artist&amp;quot;&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Empty), 
               XElementToString(track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Element(&lt;span style="color:#ff00ff;"&gt;&amp;quot;Album&amp;quot;&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Empty), 
               XElementToString(track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Element(&lt;span style="color:#ff00ff;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Empty), 
               XElementToTimeSpan(track&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Element(&lt;span style="color:#ff00ff;"&gt;&amp;quot;TotalTime&amp;quot;&lt;/span&gt;), defaultTime));&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;It&amp;#39;s created a new type called &lt;code&gt;Track&lt;/code&gt; and news up another object of this type for every track found in the result set. And what does &lt;code&gt;Track&lt;/code&gt; look like?&lt;/p&gt;

&lt;div class="jmbcodeblock"&gt;
  &lt;pre&gt;    [&lt;span style="color:#2b91af;"&gt;DebuggerDisplay&lt;/span&gt;(&lt;span style="color:#ff00ff;"&gt;&amp;quot;\\{ Artist = {Artist}, Album = {Album}, Name = {Name}, Time = {Time} \\}&amp;quot;&lt;/span&gt;)]
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Track&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IEquatable&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Track&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;gt;&lt;/span&gt; {
      &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; artist;
      &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; album;
      &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name;
      &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt; time;

      &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Track(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; artist, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; album, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name, &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt; time) {
        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;artist &lt;span style="color:#808000;"&gt;=&lt;/span&gt; artist;
        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;album &lt;span style="color:#808000;"&gt;=&lt;/span&gt; album;
        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;name &lt;span style="color:#808000;"&gt;=&lt;/span&gt; name;
        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;time &lt;span style="color:#808000;"&gt;=&lt;/span&gt; time;
      }

      &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; Equals(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; obj) {
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (obj &lt;span style="color:#0000ff;"&gt;is&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Track&lt;/span&gt;)
          &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; Equals((&lt;span style="color:#2b91af;"&gt;Track&lt;/span&gt;)obj);
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
      }

      &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Equals(&lt;span style="color:#2b91af;"&gt;Track&lt;/span&gt; obj) {
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (obj &lt;span style="color:#808000;"&gt;==&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)
          &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#808000;"&gt;!&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EqualityComparer&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;gt;.&lt;/span&gt;Default&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Equals(artist, obj&lt;span style="color:#808000;"&gt;.&lt;/span&gt;artist))
          &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#808000;"&gt;!&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EqualityComparer&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;gt;.&lt;/span&gt;Default&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Equals(album, obj&lt;span style="color:#808000;"&gt;.&lt;/span&gt;album))
          &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#808000;"&gt;!&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EqualityComparer&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;gt;.&lt;/span&gt;Default&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Equals(name, obj&lt;span style="color:#808000;"&gt;.&lt;/span&gt;name))
          &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#808000;"&gt;!&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EqualityComparer&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;gt;.&lt;/span&gt;Default&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Equals(time, obj&lt;span style="color:#808000;"&gt;.&lt;/span&gt;time))
          &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; GetHashCode() {
        &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; hash &lt;span style="color:#808000;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;;
        hash &lt;span style="color:#808000;"&gt;^=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EqualityComparer&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;gt;.&lt;/span&gt;Default&lt;span style="color:#808000;"&gt;.&lt;/span&gt;GetHashCode(artist);
        hash &lt;span style="color:#808000;"&gt;^=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EqualityComparer&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;gt;.&lt;/span&gt;Default&lt;span style="color:#808000;"&gt;.&lt;/span&gt;GetHashCode(album);
        hash &lt;span style="color:#808000;"&gt;^=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EqualityComparer&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;gt;.&lt;/span&gt;Default&lt;span style="color:#808000;"&gt;.&lt;/span&gt;GetHashCode(name);
        hash &lt;span style="color:#808000;"&gt;^=&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EqualityComparer&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;&lt;span style="color:#808000;"&gt;&amp;gt;.&lt;/span&gt;Default&lt;span style="color:#808000;"&gt;.&lt;/span&gt;GetHashCode(time);
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; hash;
      }

      &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;string&lt;/span&gt; ToString() {
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;&lt;span style="color:#808000;"&gt;.&lt;/span&gt;Format(&lt;span style="color:#ff00ff;"&gt;&amp;quot;{{ Artist = {0}, Album = {1}, Name = {2}, Time = {3} }}&amp;quot;&lt;/span&gt;, artist, album, name, time);
      }

      &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Artist {
        &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; artist; }
      }
      &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Album {
        &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; album; }
      }
      &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name {
        &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; name; }
      }
      &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt; Time {
        &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; time; }
      }
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This class is not just a bag o&amp;#39; properties either. Just look at what the refactoring decorates it with:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A &lt;code&gt;DebuggerDisplay&lt;/code&gt; attribute for use when displaying objects of this type with the debugger. Nice. &lt;/li&gt;

  &lt;li&gt;The &lt;code&gt;IEquatable&amp;lt;T&amp;gt;&lt;/code&gt; interface. Objects of this class can be compared equal with the semantics and meaning you expect. &lt;/li&gt;

  &lt;li&gt;Readonly fields. The class is readonly from the start. &lt;/li&gt;

  &lt;li&gt;The &lt;code&gt;Equals()&lt;/code&gt; methods to fulfill the &lt;code&gt;IEquatable&amp;lt;T&amp;gt;&lt;/code&gt; contract &lt;/li&gt;

  &lt;li&gt;A meaningful &lt;code&gt;GetHashCode()&lt;/code&gt; implementation that uses all the class&amp;#39; properties. &lt;/li&gt;

  &lt;li&gt;A good &lt;code&gt;ToString()&lt;/code&gt; method that shows all the property values. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(I&amp;#39;ll note that this declaration is pretty much identical to what the C# compiler builds for you when it compiles an anonymous type.)&lt;/p&gt;

&lt;p&gt;Of course, now the code for the class has been created, I can alter it in any way I see fit. For example, I can change properties to be writable, I can reduce the influence of the &lt;code&gt;GetHashCode()&lt;/code&gt; method by removing some of the field values, and so on.&lt;/p&gt;

&lt;p&gt;But most of all I can change the return type of my putative method to &lt;code&gt;IEnumerable&amp;lt;Track&amp;gt;&lt;/code&gt; and move on. Just brilliant.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=286315" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/Refactor/default.aspx">Refactor</category></item><item><title>DevExpress Newsletter 16: Message from the CTO</title><link>http://community.devexpress.com/blogs/ctodx/archive/2009/12/02/devexpress-newsletter-16-message-from-the-cto.aspx</link><pubDate>Wed, 02 Dec 2009 17:01:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:285894</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=285894</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2009/12/02/devexpress-newsletter-16-message-from-the-cto.aspx#comments</comments><description>&lt;p&gt;Reprinting my Message from the CTO from the sixteenth newsletter so that you may comment on my thoughts. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Virtualizing your experiments&lt;/p&gt;    &lt;p&gt;At PDC this year, I wanted to show off some of the new things we have in v2009.3, but at the time I was setting up my laptop there was only a beta available. Rush-released that very morning, in fact, so I wasn&amp;#39;t hopeful it would last beyond the day. No matter, no problem, I just installed it in a virtual machine.&lt;/p&gt;    &lt;p&gt;Virtual machines have changed the lives of developers everywhere. Need a pristine PC? Just clone the pristine virtual machine you have ready for that purpose (mine has Windows 7 plus Visual Studio 2008 freshly installed, all updated) and boot it. Need to test some alpha build and you&amp;#39;re worried about it affecting your usual environment? Boot up another clone. Once you&amp;#39;re done with your experiments, you can just throw the virtual machine away. &lt;/p&gt;    &lt;p&gt;Back in the day, I used to have a spare physical PC and a copy of Norton Ghost. I&amp;#39;d create a pristine OS install, Ghost it, and then play merry havoc on the PC with dodgy software. Once I&amp;#39;d done, I&amp;#39;d reimage the pristine install from the Ghost image. But, compared with a VM, it took a long time to get to the &amp;quot;good&amp;quot; state.&lt;/p&gt;    &lt;p&gt;Since there are several hypervisors around, you have no excuse. I use VMWare Workstation, but there&amp;#39;s also Virtual PC and VirtualBox, both free, and on the Mac there&amp;#39;s Parallels and VMWare Fusion. Once you have a hypervisor, all that&amp;#39;s required is plenty of disk space to hold the virtual disks (these will be 20GB or so in size).&lt;/p&gt;    &lt;p&gt;So protect yourself with a VM and experiment with abandon.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Actually, virtualization is slowly being accepted by the non-programming masses too. For example, with the top-of-the-range Windows 7 package, you can download a specialized virtualization app that only works with Windows XP. I wonder how soon before all we do is run software in virtual machines, and our host OS is just a hypervisor.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=285894" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/ctodx/archive/tags/Newsletter/default.aspx">Newsletter</category></item><item><title>Sneak Peek: Refreshing UI in XtraReports v2009.3</title><link>http://community.devexpress.com/blogs/ctodx/archive/2009/12/01/sneak-peek-refreshing-ui-in-xtrareports-v2009-3.aspx</link><pubDate>Tue, 01 Dec 2009 22:40:36 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:286160</guid><dc:creator>Julian M Bucknall</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.devexpress.com/blogs/ctodx/rsscomments.aspx?PostID=286160</wfw:commentRss><comments>http://community.devexpress.com/blogs/ctodx/archive/2009/12/01/sneak-peek-refreshing-ui-in-xtrareports-v2009-3.aspx#comments</comments><description>&lt;p&gt;A few weeks ago I published a blog post about the new report designer in our reporting product. This is due to be released very soon and, to be honest, for such a great feature, my post left a little to be desired in terms of details. Alex, who writes for the XtraCharts and XtraReports teams, thought it would be a good idea for me to interview members of the development team and get them to reveal more about the new XtraReports. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 0px 0px 15px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="KonstantinK" border="0" alt="KonstantinK" align="right" src="http://community.devexpress.com/blogs/ctodx/KonstantinK_2ABA7D4C.jpg" width="316" height="212" /&gt; For this third and final article, he hooked me up with Konstantin Kosukhin, a.k.a. &lt;em&gt;Konstantin K&lt;/em&gt; in the forums. Konstantin rocked my world with the new look-and-feel for the designer: he and I are both fans of Mark Miller&amp;#39;s series of posts and talks on &lt;em&gt;The Science of Great UI&lt;/em&gt;. This time I&amp;#39;ll show lots of before and after pictures: he&amp;#39;s done a cracking good job in refreshing the UI. (Yes, I am most definitely punning in the title to this post.) Since this is the last article in this small series, I&amp;#39;d also just like to say thanks to Alex (who likes to be known as &lt;em&gt;Alan&lt;/em&gt; in the forums) for setting all this up and the work he did in making sure the interviews came off well. &lt;/p&gt;  &lt;p&gt;(Note: Although all screenshots in this article are from the End-User Report Designer, the Visual Studio report designer has all the same enhancements. The only exception is the toolbox and the property grid, which are native VS elements, only available at VS design time).&lt;/p&gt;  &lt;p&gt;JMB: &lt;strong&gt;What gave you the idea to revamp the designer UI?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Konstantin: Easy. Just look at the designer in v2009.2 and earlier:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/ctodx/CommonLook_92_70CB3A5F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Designer in 9.2" border="0" alt="Designer in 9.2" src="http://community.devexpress.com/blogs/ctodx/CommonLook_92_thumb_3EA3EA15.png" width="619" height="480" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;It&amp;#39;s functional in that you can design reports with it, but just look at that visual noise. It looks heavy. It&amp;#39;s hard to tell what visual objects are part of the report and what are part of the designer. It violates a lot of the guidance that Mark Miller laid down in &lt;a href="http://community.devexpress.com/blogs/markmiller/archive/tags/Great+UI/default.aspx"&gt;his &lt;em&gt;Science of Great UI&lt;/em&gt; blog posts&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So, we decided to make the designer&amp;#39;s appearance more lightweight and not beat you over the head with it. So we redid some design work and produced this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/ctodx/CommonLook_93_31B96E2A.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Designer in 9.3" border="0" alt="Designer in 9.3" src="http://community.devexpress.com/blogs/ctodx/CommonLook_93_thumb_07F5F337.png" width="624" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I&amp;#39;m sure everyone will agree it looks more restful, and it has not lost any of the functionality.&lt;/p&gt;  &lt;p&gt;JMB: &lt;strong&gt;Very nice, indeed. I like the attention you paid to reducing contrast and your better use of color. The visual noise is way down. &lt;/strong&gt;&lt;strong&gt;So, take us through the changes to get to this new version.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Konstantin: First up for the chop were the grid lines. Grid lines are shown on the report designer surface to make it easier to move and resize report elements. Previously, we used dotted lines but there was no difference between the major and minor lines. All grid lines were the same. Also, another problem was that the grid line increment was measured in pixels, which was most inconvenient for designing reports that were measured in inches or centimeters.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="GridLines 9.2" border="0" alt="GridLines 9.2" src="http://community.devexpress.com/blogs/ctodx/GridLines_92_3AB5D3DE.png" width="411" height="314" /&gt; &lt;/p&gt;  &lt;p&gt;We threw away the dotted lines and replaces them with thin low-contrast silver grid lines, with the major subdivision lines being slightly darker than the minor ones. The grid line increment is now measured in the units for the current report.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="GridLines 9.3" border="0" alt="GridLines 9.3" src="http://community.devexpress.com/blogs/ctodx/GridLines_93_19562E42.png" width="550" height="419" /&gt; &lt;/p&gt;  &lt;p&gt;Of course, &lt;a href="http://community.devexpress.com/blogs/ctodx/archive/2009/11/27/sneak-peek-the-snap-lines-feature-in-xtrareports-v2009-3.aspx"&gt;the new snap lines feature&lt;/a&gt; blends in with this new grid very nicely.&lt;/p&gt;  &lt;p&gt;JMB: &lt;strong&gt;Totally agree. The dotted grid was very 90s and this new version is much better. More modern. What else?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Konstantin: Next on the list was what a selected control looked like. Previously, when a report control was selected, it was drawn with a rather noisy selection rectangle. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Selection_92" border="0" alt="Selection_92" src="http://community.devexpress.com/blogs/ctodx/Selection_92_115E8BE0.png" width="260" height="121" /&gt; &lt;/p&gt;  &lt;p&gt;We wiped that design to replace it with a very lightweight selection box, with judicious use of some slight bluish color.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Selection 9.3" border="0" alt="Selection 9.3" src="http://community.devexpress.com/blogs/ctodx/Selection_93_3EDFABA3.png" width="291" height="119" /&gt; &lt;/p&gt;  &lt;p&gt;Already you can see that the high-contrast color of the control contents stands out from the infrastructure of the designer. Look back at the previous image: the dots were merging with the text to produce a very jagged look.&lt;/p&gt;  &lt;p&gt;JMB: &lt;strong&gt;I&amp;#39;m liking this new designer more and more. Looking back at the overall picture I see you also altered the report band strips.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Konstantin: Exactly. In the previous version, the strips that indicated the different report bands were brightly colored and used a saturated color as well. They really dragged your focus away from the report controls, arguably the most important elements on the designer surface, to something that was in essence a set of dividing lines.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/ctodx/BandStrips_92_37543C36.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="BandStrips 9.2" border="0" alt="BandStrips 9.2" src="http://community.devexpress.com/blogs/ctodx/BandStrips_92_thumb_6F268059.png" width="640" height="386" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I mean talk about visual noise: all you can see on the designer surface is band strips. And just look at the jaggies because of the dotted grid lines. For v2009.3 we turned the contrast and color of the strips way down. Just enough to indicate a division, and the name of that division:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/ctodx/BandStrips_93_45828F59.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="BandStrips 9.3" border="0" alt="BandStrips 9.3" src="http://community.devexpress.com/blogs/ctodx/BandStrips_93_thumb_1650A3C2.png" width="640" height="322" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;JMB: &lt;strong&gt;I think you just saved me from a headache.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Konstantin: The final change we made to the designer surface was how we treated the margins of the report. We were way too literal about margins in v2009.2 and earlier:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ReportMargins_92" border="0" alt="ReportMargins_92" src="http://community.devexpress.com/blogs/ctodx/ReportMargins_92_7F61AC78.png" width="557" height="370" /&gt; &lt;/p&gt;  &lt;p&gt;I mean, after all, the designer surface is supposed to represent a sheet of paper. To emphasize that similarity, we decided to draw indents from the left and top rulers, show the left report margin on the screen, along with making the top and bottom margins always visible on the report designer surface (previously, only the right report margin was visible). This makes it way easier for a user to change the report margins when designing a report without having to resort to using the Property Grid. Just drag and drop.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/ctodx/ReportMargins_93_178516D4.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ReportMargins 9.3" border="0" alt="ReportMargins 9.3" src="http://community.devexpress.com/blogs/ctodx/ReportMargins_93_thumb_61A021B9.png" width="640" height="335" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;JMB: &lt;strong&gt;I like it. I completely agree that being able to drag the margins to resize them is a much better user experience than having to search for and then select the right property in the Property Grid. I also notice you changed the toolbox.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Konstantin: Yes, this was the final major change we made. We decided that the dock panel we had been using as the toolbox was too heavy for regular use, and felt a simpler bar would be better. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="On the fourth day of DevExpress Christmas, Julian gave me slick new 3D charts for XtraCharts" border="0" alt="On the fourth day of DevExpress Christmas, Julian gave me slick new 3D charts for XtraCharts" align="right" src="http://community.devexpress.com/blogs/ctodx/DaysOfDXChristmas_7CBB4B42.jpg" width="50" height="48" /&gt; First, it allows us to provide more space for the designer surface, that is, the user&amp;#39;s report. Second, it means that someone who writes reports often is not distracted by the icon plus text of the old dock panel but can still locate controls very quickly. For the user who is just starting out with the designer, the names of the toolbox items are displayed in tooltips, and in the previous version (v2009.2) we&amp;#39;d already made the toolbox icons larger. These larger icons are already more recognizable and it becomes easier and quicker to learn which items correspond to which icons.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/ctodx/Toolbox_5B78D51E.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Toolbox" border="0" alt="Toolbox" src="http://community.devexpress.com/blogs/ctodx/Toolbox_thumb_07F1DF38.png" width="318" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If someone prefers the older dock panel, you can create a custom end-user designer form with the help of the &lt;code&gt;XRDesignDockManager&lt;/code&gt; component.&lt;/p&gt;  &lt;p&gt;JMB: &lt;strong&gt;I concur. As an example, I use Adobe Illustrator infrequently but regularly, and I certainly don&amp;#39;t need the text to go along with the toolbox icons. I&amp;#39;ve learned enough about the environment that I&amp;#39;m familiar with the 20% I use and I know I can always hover to get the tooltips to learn about the other 80%. &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Anyway, Konstantin, thank you for taking the time to explain about the new refreshing look of the XtraReports report designer. I think we&amp;#39;ll have to migrate some of your changes over to our other control designers...&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Konstantin: No problem, I&amp;#39;ll help out for sure. And it was fun to explain what we&amp;#39;ve done for v2009.3.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=286160" width="1" height="1"&gt;</description></item></channel></rss>