<?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>Developer Express Inc.</title><link>http://community.devexpress.com/blogs/</link><description>Download - Compare - Decide</description><dc:language>en-US</dc:language><generator>CommunityServer 2007.1 SP1 (Build: 30415.43)</generator><item><title>Keeping Fit With XAF #1</title><link>http://community.devexpress.com/blogs/garyshort/archive/2010/02/09/keeping-fit-with-xaf-1.aspx</link><pubDate>Tue, 09 Feb 2010 14:50:25 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:293832</guid><dc:creator>Gary Short (Developer Express)</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Hello XAFers! So January’s passed and all those great New Year’s resolutions for getting fit have fallen by the wayside. They have haven’t they, come on you can tell me? Yeah I thought so. Well don’t worry ‘cos I’m here to help. By, here to help, what I mean is that I too have a New Year’s resolution for losing weight and getting fit. Of course, when I start to lose motivation I turn to XAF to help me out, I mean what could be better than having a hot piece of software to help you? Okay, I admit, a hot personal trainer would be better, but it is what it is right?&lt;/p&gt;  &lt;p&gt;Anyway, today we’ll begin a short series of posts on an application that I threw together (yes I do mean threw together and not developed) to help me measure my weight lose and fitness program. So, the first order of business is going to be to record my weight as it heads down towards my target. Let’s add a domain object to our application and add properties for the date the record was made and my weight that day, in pounds:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;System;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;DevExpress.Xpo;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;DevExpress.Persistent.Base;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;DevExpress.Persistent.BaseImpl;

&lt;span style="color:blue;"&gt;namespace &lt;/span&gt;Fitness.Module
{
    [&lt;span style="color:#2b91af;"&gt;DefaultClassOptions&lt;/span&gt;]
    &lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;WeightRecord &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;BaseObject
    &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;public &lt;/span&gt;WeightRecord(&lt;span style="color:#2b91af;"&gt;Session &lt;/span&gt;session) : &lt;span style="color:blue;"&gt;base&lt;/span&gt;(session) { }

        &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DateTime &lt;/span&gt;date;
        &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DateTime &lt;/span&gt;Date
        {
            &lt;span style="color:blue;"&gt;get
            &lt;/span&gt;{
                &lt;span style="color:blue;"&gt;return &lt;/span&gt;date;
            }
            &lt;span style="color:blue;"&gt;set
            &lt;/span&gt;{
                SetPropertyValue(&lt;span style="color:#a31515;"&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;date, &lt;span style="color:blue;"&gt;value&lt;/span&gt;);
            }
        }

        &lt;span style="color:blue;"&gt;private int &lt;/span&gt;lBS;
        &lt;span style="color:blue;"&gt;public int &lt;/span&gt;LBS
        {
            &lt;span style="color:blue;"&gt;get
            &lt;/span&gt;{
                &lt;span style="color:blue;"&gt;return &lt;/span&gt;lBS;
            }
            &lt;span style="color:blue;"&gt;set
            &lt;/span&gt;{
                SetPropertyValue(&lt;span style="color:#a31515;"&gt;&amp;quot;LBS&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;lBS, &lt;span style="color:blue;"&gt;value&lt;/span&gt;);
            }
        }
   }
}&lt;/pre&gt;

&lt;p&gt;Okay, well working in pounds is fine for my American cousins, but here in the UK we work in stones and in Europe they work in Kilos, so we should really show those values too. We don’t want to input that information three times though and we don’t have to as we can calculate both of these fields from the lBS field. To do that, modify the class definition like so:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;System;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;DevExpress.Xpo;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;DevExpress.Persistent.Base;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;DevExpress.Persistent.BaseImpl;

&lt;span style="color:blue;"&gt;namespace &lt;/span&gt;Fitness.Module
{
    [&lt;span style="color:#2b91af;"&gt;DefaultClassOptions&lt;/span&gt;]
    &lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;WeightRecord &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;BaseObject
    &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;public &lt;/span&gt;WeightRecord(&lt;span style="color:#2b91af;"&gt;Session &lt;/span&gt;session) : &lt;span style="color:blue;"&gt;base&lt;/span&gt;(session) { }

        &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DateTime &lt;/span&gt;date;
        &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DateTime &lt;/span&gt;Date
        {
            &lt;span style="color:blue;"&gt;get
            &lt;/span&gt;{
                &lt;span style="color:blue;"&gt;return &lt;/span&gt;date;
            }
            &lt;span style="color:blue;"&gt;set
            &lt;/span&gt;{
                SetPropertyValue(&lt;span style="color:#a31515;"&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;date, &lt;span style="color:blue;"&gt;value&lt;/span&gt;);
            }
        }

        &lt;span style="color:blue;"&gt;private int &lt;/span&gt;lBS;
        &lt;span style="color:blue;"&gt;public int &lt;/span&gt;LBS
        {
            &lt;span style="color:blue;"&gt;get
            &lt;/span&gt;{
                &lt;span style="color:blue;"&gt;return &lt;/span&gt;lBS;
            }
            &lt;span style="color:blue;"&gt;set
            &lt;/span&gt;{
                SetPropertyValue(&lt;span style="color:#a31515;"&gt;&amp;quot;LBS&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;lBS, &lt;span style="color:blue;"&gt;value&lt;/span&gt;);
            }
        }

        [&lt;span style="color:#2b91af;"&gt;Persistent&lt;/span&gt;]
        &lt;span style="color:blue;"&gt;public double &lt;/span&gt;Stones
        {
            &lt;span style="color:blue;"&gt;get
            &lt;/span&gt;{
                &lt;span style="color:blue;"&gt;const double &lt;/span&gt;STONES_PER_POUND = 0.0714285714;
                &lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;.Round((lBS == 0) ? 0 : lBS * STONES_PER_POUND,2);
            }
        }

        [&lt;span style="color:#2b91af;"&gt;Persistent&lt;/span&gt;]
        &lt;span style="color:blue;"&gt;public double &lt;/span&gt;Kilos
        {
            &lt;span style="color:blue;"&gt;get 
            &lt;/span&gt;{
                &lt;span style="color:blue;"&gt;const double &lt;/span&gt;KILOS_PER_POUND = 0.45359237;
                &lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;.Round((lBS == 0) ? 0 : lBS * KILOS_PER_POUND,2);
            }
        }
    }
}&lt;/pre&gt;

&lt;p&gt;We mark the property with the persistent attribute as we want the value to be saved in the database. Notice there is no setter though, we just do the calculation in the getter. There is one more thing we need to do for this to work and that is to set the ImmediatePostData attribute to true on those calculated fields in the WeightRecord node on the Model Editor. First find these fields in the Model Editor:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/image_43F81C17.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/garyshort/image_thumb_5423E410.png" width="188" height="368" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Then set the ImmediatePostDataAttribute to true:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/image_662001D0.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/garyshort/image_thumb_69DDA6A0.png" width="197" height="283" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;This attribute specifies whether the property value is updated immediately when changes occur in the current Property Editor&amp;#39;s bound control.&lt;/p&gt;

&lt;p&gt;Now, let’s fire up the application and we can see that when we enter an amount for the pounds, we get a value calculated for stones and kilos too:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/image_610D9E54.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/garyshort/image_thumb_49FF1D18.png" width="290" height="308" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Looking at the list view, we can see that these values are persisted to the database:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/garyshort/image_7BAA14A0.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/garyshort/image_thumb_09B8DDD1.png" width="531" height="397" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Well that wraps it up for this post, next time we’ll add some training programs to the application – until then, happy XAFing! :-)&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=293832" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/garyshort/archive/tags/XAF/default.aspx">XAF</category></item><item><title>Free Plugin: Tweet Your Code From Visual Studio</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/02/08/tweet-your-code-from-visual-studio.aspx</link><pubDate>Mon, 08 Feb 2010 22:20:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292045</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;&lt;a href="http://twitter.com/tillig" target="_blank"&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 10px 15px 15px;display:inline;border-top:0px;border-right:0px;" title="Travis Illig" border="0" alt="Travis Illig" align="right" src="http://community.devexpress.com/blogs/aspnet/travisillig_2974305D.png" width="108" height="141" /&gt;&lt;/a&gt; Check out this great CodeRush plugin which allows you to share snippets of your code with the world.&amp;#160; Travis Illig is the mastermind who created this CodeRush plugin.&lt;/p&gt;  &lt;p&gt;Watch the “Share Code On Twitter (Travis Illig)” video below and learn how the plugin works:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tv.devexpress.com/CRtwitter.movie" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Video: CR_CodeTweet Plugin" border="0" alt="Video: CR_CodeTweet Plugin" src="http://community.devexpress.com/blogs/aspnet/image_76EEB36E.png" width="460" height="282" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Installation&lt;/h3&gt;  &lt;p&gt;Follow these 3 easy steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Download the free plugin here: &lt;a title="CR-CodeTweet" href="http://code.google.com/p/cr-codetweet/" target="_blank"&gt;CR-CodeTweet CodeRush Plugin&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Watch the &lt;a href="http://tv.devexpress.com/CRtwitter.movie" target="_blank"&gt;“Share Code On Twitter (Travis Illig)” video&lt;/a&gt; and follow the few steps to setup the plugin. &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;The plugin uses the &lt;a href="http://codepaste.net/"&gt;http://codepaste.net/&lt;/a&gt; website by uploading your selected code snippet from Visual Studio to CodePaste.net. Then it provides you a dialog to to enter a short twitter message with the shortened CodePaste.net url. Brilliant!&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Install and start sharing your code with the world. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;This is one of my favorite plugins and I’ve already used it a few times to &lt;a href="http://codepaste.net/list/user/k2ikyskh" target="_blank"&gt;help answer DevExpress ASP.NET questions on twitter&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Check out Travis&amp;#39;s free CR-CodeTweet plugin and drop me a line below with ideas on creative ways to use it.&lt;/p&gt;  &lt;p&gt;PS. – Post your CodePaste.net profile link too please.&lt;/p&gt;  &lt;div class="dxperience-blog-block"&gt;   &lt;h4&gt;Want to experience a better Visual Studio?&lt;/h4&gt;    &lt;p&gt;Install CodeRush by downloading the a lite free version here: &lt;a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/"&gt;CodeRush Xpress&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Or better yet, try the full blown package free for 30 days – &lt;a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/"&gt;CodeRush and Refactor Pro Download!&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292045" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/Video/default.aspx">Video</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/Twitter/default.aspx">Twitter</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/CodeRush/default.aspx">CodeRush</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/plugin/default.aspx">plugin</category></item><item><title>XAF 10.1 Sneak Peak</title><link>http://community.devexpress.com/blogs/garyshort/archive/2010/02/08/xaf-10-1-sneak-peak.aspx</link><pubDate>Mon, 08 Feb 2010 18:12:28 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:293686</guid><dc:creator>Gary Short (Developer Express)</dc:creator><slash:comments>12</slash:comments><description>&lt;p&gt;One of the major features that you will see as of 10.1 is the Typed Application Model.&lt;/p&gt;  &lt;p&gt;As you will know XAF allows developers to define business class and then builds the &lt;a href="http://www.devexpress.com/Help/?document=ExpressApp/CustomDocument2580.htm"&gt;Application Model&lt;/a&gt; from these declarations and generates a UI based on them. Thereafter if you want to change the UI you simply customise the Application Model using the &lt;a href="http://www.devexpress.com/Help/?document=ExpressApp/CustomDocument2582.htm"&gt;Model Editor&lt;/a&gt;. The Application Model is therefore a cornerstone of XAF and we have re-designed it from the bottom up in 10.1.&lt;/p&gt;  &lt;p&gt;Firstly, let’s take a look at what the Application Model is like now, prior to 10.1. It is currently defined by it’s &lt;a href="http://www.devexpress.com/Help/?document=ExpressApp/CustomDocument2596.htm"&gt;schema&lt;/a&gt; and looks something like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Application&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Views&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;ListView&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Variants&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Attribute &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Current&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Variant&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Attribute &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;ID&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Attribute &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Caption&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Attribute &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;ViewID&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;This snipped declares the Variants node, as a child node of the ListView node. As you can see, in this simplified example, the only thing that attributes haveare names. There are no types declared. So, even if the ID attribute is intended to hold an integer and Caption to hold a string, there is really no difference. The untyped Application Model stores its data as a set of string. For a caption this is fine, for an integer though, it’ll first need to be converted to a string representation. When retrieving its value, it’ll need to be converted again from a string to an integer. What’s more, you need to remember that an integer is stored there, because all the Application Model stores are plain strings. What a PITA!&lt;/p&gt;

&lt;p&gt;Now let’s take a look at how the Application Model worked under the hood. This’ll be a pretty simplified look but it’ll do for our purposes. When an application is started, the types info subsystem (see &lt;a href="http://www.devexpress.com/Help/?document=ExpressApp/CustomDocument3224.htm"&gt;HowTo: Access Business Class Metadata&lt;/a&gt;) collects metadata on all the business classes declared in the application. After this, the Application Model generation is started. Firstly, the BOModel node’s child nodes (see &lt;a href="http://www.devexpress.com/Help/?document=ExpressApp/CustomDocument2586.htm"&gt;BOModel Node&lt;/a&gt;) are generated and filled with values from the types info subsystem. Then all the other Application Model’s nodes and their attributes are filled with data.&lt;/p&gt;

&lt;p&gt;After this initial generation is complete, the Application Model is filled with custom data from all the Modules used in the application. &lt;/p&gt;

&lt;p&gt;At this point we have the initial Application Model, that part which can’t be changed by the user. Then the Application Model is filled with each user’s customizations . Now, the Application Model generation is complete, and we can use our application.&lt;/p&gt;

&lt;p&gt;Now that we know how our untyped Application Model works, we can see the disadvantages:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We COMPLETELY generate ALL THE Application Model at application startup. This is slow.&lt;/li&gt;

  &lt;li&gt;Memory consumption is far from being optimal. Each attribute contains a string value, not a reference. Usually, there are a lot of duplicate info. For example, a string holding the name of a business class can be found in: types info subsystem, a BOModel node’s attribute, an attribute of each of the Views declared for the class (usually, there are several Views for each business type, at least two or three) and so on. &lt;/li&gt;

  &lt;li&gt;The Application Model is untyped, and working with it isn’t straightforward. Though we can use node wrappers, the process is generally bulky.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, in general, the current Application Model, is suboptimal. :-)&lt;/p&gt;

&lt;p&gt;But it is improved in 10.1 and here’s how. What we’ve done is to do away with the schema and we now use interfaces instead. So the example above would now be declared like so:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelViewVariants &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IModelNode
&lt;/span&gt;{
    &lt;span style="color:#2b91af;"&gt;IModelVariants &lt;/span&gt;Variants { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
}

&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelVariants &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IModelNode&lt;/span&gt;, 
    &lt;span style="color:#2b91af;"&gt;IModelList&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IModelVariant&lt;/span&gt;&amp;gt;
{
    &lt;span style="color:#2b91af;"&gt;IModelVariant &lt;/span&gt;Current { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
}
&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelVariant &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IModelNode
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;int &lt;/span&gt;Id { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;string &lt;/span&gt;ViewID { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;string &lt;/span&gt;Caption { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
}&lt;/pre&gt;

&lt;p&gt;Now as you see, attributes not only have names, but they also have types. Also, there’s no need to use node wrappers or convert attribute values to and from string representations. That is much better, don’t you think?&lt;/p&gt;

&lt;p&gt;The basic Application Model structure is described by the base IModelApplication interface. This interface defines the root &lt;a href="http://www.devexpress.com/Help/?document=ExpressApp/CustomDocument2584.htm"&gt;Application node&lt;/a&gt; (its attributes and child nodes). Each Module can also extend the Application Model. This is done by specifying additional interfaces derived from the IModelNode interface.&lt;/p&gt;

&lt;p&gt;So, firstly, when an application is started, we collect all the interfaces that define the Application Model. Then we compile an object implementing all these interfaces. This object represents the Application Model. At this point the Application Model doesn’t hold any actual data. &lt;/p&gt;

&lt;p&gt;Secondly, we fill the Application Model with layers. Our new typed Application Model consists of unmerged layers. Each layer represents a separate data set. Each Module is represented by its own data layer. So, for each Module we create a separate layer and fill it with data supplied by the Module. We also create the user customizations layer and load the user customizations into it. Note that the base Application Model layer defined by the IModelApplication interface doesn’t contain any data at this point.&lt;/p&gt;

&lt;p&gt;At this point, the Application Model is ready to be used. When, for example, the Logon Detail View needs to be invoked, the Application Model is accessed, to retrieve the Detail View’s layout. The following code snippet illustrates this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;IModelView &lt;/span&gt;modelView = 
                &lt;span style="color:#2b91af;"&gt;Application&lt;/span&gt;.ModelApplication.Views[
                “Logon_DetailView”];&lt;/pre&gt;

&lt;p&gt;Since the Views node hasn’t been generated yet, a Views generator is invoked which in turn invokes the BOModel generator. As a result, the Views and BOModel nodes’ child nodes are created. Note however, that the created child nodes are NOT filled with data. Then, since we asked for the “Logon_DetailView” data, this node gets populated with data on the base layer. After this, XAF displays the specified View using the data.&lt;/p&gt;

&lt;p&gt;As you can see, the base layer of the Application Model is populated with data on-demand. In other words, if you launch an XAF application, and use only a Contact List View then only the Contact_ListView node will be populated with data. All the other View nodes of the Application Model will remain uninitialized.&lt;/p&gt;

&lt;p&gt;A note on ASP.NET Web XAF applications. Now, if users haven’t customized the Application Model, a single Application Model instance is shared between all the users. Moreover, even if users have customized the Application Model, the common part of it is still represented by a single instance which is also shared between the users.&lt;/p&gt;

&lt;p&gt;Now that we know how our typed Application Model works, we can outline its advantages:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We never completely generate all the Application Model. It’s created on demand (kind of a lazy initialization). This is fast (or at least we hope it will be).&lt;/li&gt;

  &lt;li&gt;Memory consumption is much more optimal. Each attribute holds a reference, not another value copy. So, for example, ideally, a string holding the name of a business class could only be found in the types info subsystem. In ASP.NET Web XAF applications, most of the Application Model (and sometimes ALL the Application Model) is shared between users.&lt;/li&gt;

  &lt;li&gt;The Application Model is typed, and working with it becomes more straightforward. No more need for string conversions and use of additional artificial wrappers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Okay, so let’s finish up with some before and after examples:&lt;/p&gt;

&lt;p&gt;Defining a key:&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Variant&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;KeyAttribute&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;ID&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;After:&lt;/pre&gt;

&lt;pre class="code"&gt;[KeyProperty(&lt;span style="color:#a31515;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelEditorStateRule &lt;/span&gt;: IEditorStateRule {
&lt;span style="color:blue;"&gt;string &lt;/span&gt;Id { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
}&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Declaring multiple child nodes:&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;ListView&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Variants&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Variant&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;Multiple&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;True&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelViewVariants &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IModelNode &lt;/span&gt;{
&lt;span style="color:#2b91af;"&gt;IModelVariants &lt;/span&gt;Variants { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
}
&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelVariants &lt;/span&gt;: 
    &lt;span style="color:#2b91af;"&gt;IModelNode&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;IModelList&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IModelVariant&lt;/span&gt;&amp;gt; {
}
&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelVariant &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IModelNode &lt;/span&gt;{ .. }&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Declaring a localisable attribute:&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Variant&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Attribute &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Caption&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;IsLocalized&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;True&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelVariant &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IModelNode &lt;/span&gt;{
[Localizable(&lt;span style="color:blue;"&gt;true&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;string &lt;/span&gt;Caption { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
}&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Specifying an image for an node:&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Variant&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;ImageName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;ModelEditor_ListView&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;pre class="code"&gt;[ImageName(&lt;span style="color:#a31515;"&gt;&amp;quot;ModelEditor_ListView&amp;quot;&lt;/span&gt;)] 
&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelVariant &lt;/span&gt;: IModelNode {...&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Specifying the display property:&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Variant&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;DisplayAttribute&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Caption&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;pre class="code"&gt;[DisplayProperty(&lt;span style="color:#a31515;"&gt;&amp;quot;Caption&amp;quot;&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelVariant &lt;/span&gt;: IModelNode {...&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Specifying a required attribute:&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Variant&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Attribute &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;ViewID&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;Required&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;True&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelVariant &lt;/span&gt;: IModelNode {
[Required()]
&lt;span style="color:blue;"&gt;string &lt;/span&gt;ViewID { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;

&lt;p&gt;Specifying a child node’s Index attribute used to order child nodes:&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Variant&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Attribute &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Index&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;IsNewNode&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;True&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;p&gt;Nothing to do here as the base IModelNode interface already declares such an attribute.&lt;/p&gt;

&lt;p&gt;Using an enumeration to specify the possible values for an attribute displayed in a dropdown:&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Element &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;NavigationItems&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Attribute &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot;
             &lt;span style="color:red;"&gt;DefaultChildItemsDisplayStyle&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot;&amp;quot;&amp;quot; 
             &lt;span style="color:red;"&gt;Choice&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot;&lt;span style="color:red;"&gt;List&lt;/span&gt;,&lt;span style="color:red;"&gt;LargeIcons&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IModelNavigationItems &lt;/span&gt;: IModelNode {
ItemsDisplayStyle DefaultChildItemsDisplayStyle { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;

&lt;p&gt;Getting data from the Application Model. Retrieving a node:&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;pre class="code"&gt;DictionaryNode viewsNode = 
    &lt;span style="color:#2b91af;"&gt;Application&lt;/span&gt;.Model.RootNode.GetChildNode(&lt;span style="color:#a31515;"&gt;&amp;quot;Views&amp;quot;&lt;/span&gt;);
DictionaryNode viewNode = 
    viewsNode.FindChildNode(
    BaseViewInfoNodeWrapper.IdAttribute, viewId);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;p&gt;IModelView modelView = 
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Application.ModelApplication.Views[viewId];&lt;/p&gt;

&lt;p&gt;Getting data from the Application Model. Retrieving an attribute value:&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;pre class="code"&gt;DictionaryNode viewNode = 
    viewsNode.FindChildNode(
    BaseViewInfoNodeWrapper.IdAttribute, viewId);

&lt;span style="color:blue;"&gt;string &lt;/span&gt;myCustomFilter = 
    viewNode.GetAttributeValue(&lt;span style="color:#a31515;"&gt;&amp;quot;MyCustomFilter&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;pre class="code"&gt;IModelViewMyExtention myModelView = 
    (&lt;span style="color:#2b91af;"&gt;IModelViewVariants&lt;/span&gt;)
        &lt;span style="color:#2b91af;"&gt;Application&lt;/span&gt;.ModelApplication.Views[viewId];

&lt;span style="color:blue;"&gt;string &lt;/span&gt;myCustomAttrValue = myModelView.MyCustomFilter;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Well that’s all for this post, until next time – happy XAF-ing! :-)&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=293686" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/garyshort/archive/tags/XAF/default.aspx">XAF</category><category domain="http://community.devexpress.com/blogs/garyshort/archive/tags/Sneak+Peak/default.aspx">Sneak Peak</category></item><item><title>How To Deploy DevExpress DLLs With Free Utility</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/02/05/free-tool-devexpress-server-installer.aspx</link><pubDate>Fri, 05 Feb 2010 18:15:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:293375</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>15</slash:comments><description>&lt;div&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/brendonmuck1_585CABA1.jpg"&gt;&lt;img height="178" width="151" src="http://community.devexpress.com/blogs/aspnet/brendonmuck1_thumb_097BE642.jpg" align="right" alt="Brendon Muck [DX-Squad]" border="0" title="Brendon Muck [DX-Squad]" style="border-bottom:0px;border-left:0px;margin:10px 0px 20px 15px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&amp;nbsp; Check out Brendon Muck&amp;rsquo;s awesome utility that helps you deploy DevExpress runtime DLLs to your servers. &lt;/em&gt;&lt;em&gt;Brendon has created a free and open source tool that&amp;rsquo;s built with DevExpress controls. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Check out Brendon&amp;rsquo;s guest post for this blog that describes the tool. &lt;/em&gt;&lt;em&gt;Oh and please ignore Brendon&amp;rsquo;s request in the PS line below. :)&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p align="left"&gt;----------------------------------------------------------&lt;/p&gt;
&lt;h3 align="left"&gt;DX Server Installer By Brendon Muck&lt;/h3&gt;
&lt;p align="left"&gt;----------------------------------------------------------&lt;/p&gt;
&lt;p align="left"&gt;Based on some of the comments from &lt;a target="_blank" href="http://community.devexpress.com/blogs/ctodx/archive/2010/02/01/curl-up-in-front-of-a-roaring-fire-with-our-eula.aspx" title="http://community.devexpress.com/blogs/ctodx/archive/2010/02/01/curl-up-in-front-of-a-roaring-fire-with-our-eula.aspx"&gt;Julian&amp;#39;s EULA blog&lt;/a&gt;, I whipped up a little application to handle deploying DevExpress assemblies to a list of target servers and installing them into the Global Assembly Cache of those target machines.&lt;/p&gt;
&lt;h3&gt;How it Works:&lt;/h3&gt;
&lt;p&gt;This application uses the &lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx" title="http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx"&gt;Microsoft PsExec&lt;/a&gt; tool to invoke console line commands on a remote machine. In this case, it calls the .NET GacUtil executable to install an assembly into the Global Assembly Cache. You select the assemblies you want to install, they are copied to the target server(s), and installed.&lt;/p&gt;
&lt;h3&gt;How to Use It:&lt;/h3&gt;
&lt;p&gt;Rather than retrieve assemblies from the Global Assembly&amp;nbsp; Cache, I went the lazy way and simply browse a directory for DevExpress dlls. This defaults at start-up to the directory where I have MY DevExpress dlls installed. Browse for a directory, or start typing one in (the ButtonEdit control will autocomplete your path for you--did you know that you can do that?) and click &amp;quot;Load Assemblies&amp;quot;.&lt;/p&gt;
&lt;p&gt;Next, select the file(s) you&amp;#39;d like to deploy, and then head on over to the Target Machines group and enter the machine name for any server you&amp;#39;d like to deploy to.&lt;/p&gt;
&lt;p&gt;Finally, click the big install button at the bottom, and cross your fingers that it works.&lt;/p&gt;
&lt;h3&gt;Requirements:&lt;/h3&gt;
&lt;p&gt;This was built using DevExpress v9.3.2.0, so that would help. If you have a higher version of DevExpress installed, then use the &lt;a target="_blank" href="http://community.devexpress.com/blogs/aspnet/archive/2007/09/10/how-to-easily-convert-your-project-to-a-new-devexpress-release.aspx"&gt;Project Converter tool&lt;/a&gt; to change the references.&lt;/p&gt;
&lt;p&gt;The PsExec and GacUtil executables are already included with the package, so there&amp;#39;s no need to download/install them.&lt;/p&gt;
&lt;p&gt;You will need appropriate network rights to be able to copy your files to the deployment target(s) and install into the GAC.&lt;/p&gt;
&lt;h3&gt;Screens:&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/aonnns_72DA0BB8.jpg"&gt;&lt;img height="419" width="644" src="http://community.devexpress.com/blogs/aspnet/aonnns_thumb_238D1364.jpg" alt="DX Server Installer Screenshot 1" border="0" title="DX Server Installer Screenshot 1" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/rwtfzm_1476348A.jpg"&gt;&lt;img height="418" width="644" src="http://community.devexpress.com/blogs/aspnet/rwtfzm_thumb_4EF1345E.jpg" alt="DX Server Installer Screenshot 2" border="0" title="DX Server Installer Screenshot 2" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt;
&lt;h3&gt;Downloads:&lt;/h3&gt;
&lt;p&gt;&lt;a target="_blank" href="http://dxserverinstaller.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=39968#DownloadId=104695" title="http://www.logisticdynamics.com/b/DxServerInstaller_Bin.zip"&gt;Binaries only&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://dxserverinstaller.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=39967#DownloadId=104694" title="http://www.logisticdynamics.com/b/DxServerInstaller_Source.zip"&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Feedback &lt;/h3&gt;
&lt;p&gt;Please leave suggestions and application issues through the CodePlex project page: &lt;a href="http://dxserverinstaller.codeplex.com/"&gt;http://dxserverinstaller.codeplex.com/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Support&lt;/h3&gt;
&lt;p&gt;Please keep in mind that this application is not sanctioned or affiliated with DevExpress in any way. Please do not contact them regarding it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: (Some web site I copy and pasted this from)&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PS. In lieu of sending me monetary donations to express your gratitude, feel free to just punch Mehul in the stomach next time you see him at a TechEd or similar event.&lt;/p&gt;
&lt;p align="left"&gt;---------------------------------------------------------------------------&lt;/p&gt;
&lt;p align="left"&gt;---------------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Download the DX Server Installer tool and it&amp;rsquo;s source code for free from the &lt;/em&gt;&lt;a target="_blank" href="http://dxserverinstaller.codeplex.com/"&gt;&lt;em&gt;CodePlex&lt;/em&gt;&lt;/a&gt;&lt;em&gt; project home page. However&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Please keep in mind that this application is not sanctioned or affiliated with DevExpress in any way. Please do not contact them regarding it. &amp;ndash;Brendon&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;You can leave Brendon feedback through the CodePlex project page: &lt;/em&gt;&lt;a href="http://dxserverinstaller.codeplex.com/" title="http://dxserverinstaller.codeplex.com/"&gt;&lt;em&gt;http://dxserverinstaller.codeplex.com/&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks Brendon for the guest post and fantastic utility!&lt;/em&gt;&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=293375" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/DXperience/default.aspx">DXperience</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/WinForms/default.aspx">WinForms</category></item><item><title>User Group Support and Resources</title><link>http://community.devexpress.com/blogs/rachelhawley/archive/2010/02/05/user-group-support-and-resources.aspx</link><pubDate>Fri, 05 Feb 2010 15:56:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:293438</guid><dc:creator>Rachel Hawley (Developer Express)</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;DevExpress is committed to trying to help as many community groups and events as we can. There are a lot of you out there, and at times the sheer number of requests that we receive can be overwhelming. But we know that with cuts in training budgets and justification for high value conferences getting harder, many of you are looking to local and regional events that can offer you great content and speakers at a significantly lower cost &amp;hellip; if not free!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/rachelhawley/image_69C2B708.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="image" alt="image" src="http://community.devexpress.com/blogs/rachelhawley/image_thumb_3AB05564.png" align="right" border="0" width="240" height="239" /&gt;&lt;/a&gt;I&amp;rsquo;m pretty sure it&amp;rsquo;s not just the financial side that offers benefits. Will Charles (&lt;a href="http://twitter.com/DotNetWill"&gt;@DotNetWill&lt;/a&gt;) recently &lt;a href="http://www.humblecoder.co.uk/?p=70"&gt;blogged&lt;/a&gt; about what he felt was the most important take-away he acquired from attending user groups:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;&lt;i&gt;User groups aren&amp;rsquo;t just about the presentations, they are about the community and improving yourself and workplace through other people&amp;rsquo;s experiences.&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt; Recently active community advocates and MVPs in the UK met with Microsoft staff in Reading, UK at the Community Leaders Day. &lt;/p&gt;
&lt;p&gt;For those that may not have attended, I wanted to draw some attention to a provision that Microsoft have facilitated with their community partners: &lt;a href="http://www.ineta.org/"&gt;INETA&lt;/a&gt;, the &lt;a href="http://www.sqlpass.org/"&gt;Professional Association of SQL Server&lt;/a&gt;, the &lt;a href="http://itpro.community.officelive.com/default.aspx"&gt;Global IT Community Association&lt;/a&gt; and the &lt;a href="http://www.aitp.org/"&gt;Association of Information Technology Professionals&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://www.usergroupsupportservices.com/MyUGSS.ugss"&gt;User Group Support Services&lt;/a&gt; offer &amp;hellip; well, just that, &lt;i&gt;support&lt;/i&gt; and &lt;i&gt;services&lt;/i&gt;: publicity, resources, funding. The things that community leaders need to make sure their groups can meet. They also offer community members facilities to help find groups and events happening in their area.&lt;/p&gt;
&lt;p&gt;If, like Will, you&amp;rsquo;re looking to find people outside your workplace to listen to, talk to and openly discuss ideas with then use the UGSS to find a group near you. If you&amp;rsquo;re a community leader and you&amp;rsquo;re trying to find support for your organisation or event drop me an email (&lt;a href="mailto:rachelh@devexpress.com"&gt;rachelh@devexpress.com&lt;/a&gt;), and then be sure to register your group with UGSS to gain benefits and resources from Microsoft and their community partners.&lt;/p&gt;
&lt;p&gt;Consider this a community service announcement :-) &lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=293438" width="1" height="1"&gt;</description></item><item><title>Video: Au Revoir Paris</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/02/04/au-revoir-paris.aspx</link><pubDate>Fri, 05 Feb 2010 07:45:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292772</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Check out this short 2 minute video of highlights from the Paris training class:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tv.devexpress.com/ParisMix.movie" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Video: Paris Training" border="0" alt="Video: Paris Training" src="http://community.devexpress.com/blogs/aspnet/image_34C98A3A.png" width="446" height="273" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/tags/training/default.aspx" target="_blank"&gt;2010 DevExpress European Training Road Show&lt;/a&gt; is over as Oliver and I have said goodbye to Paris. &lt;/p&gt;  &lt;p&gt;Paris is an amazing city and we had a great time meeting all the developers there. And we want to thank everyone who attended!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7323_4C148EAB.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="IMG_7323" border="0" alt="IMG_7323" src="http://community.devexpress.com/blogs/aspnet/IMG_7323_thumb_0B060F47.jpg" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7298_2A48B61A.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="IMG_7298" border="0" alt="IMG_7298" src="http://community.devexpress.com/blogs/aspnet/IMG_7298_thumb_491F29F8.jpg" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7377_443C763C.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="IMG_7377" border="0" alt="IMG_7377" src="http://community.devexpress.com/blogs/aspnet/IMG_7377_thumb_1576BD9A.jpg" width="184" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;div class="dxperience-blog-block"&gt;   &lt;h4&gt;DXperience? What&amp;#39;s That?&lt;/h4&gt;    &lt;p&gt;DXperience is the .NET developer&amp;#39;s secret weapon. Get full access to a complete suite of professional components that let you instantly drop in new features, designer styles and fast performance for your applications. Try a fully-functional version of DXperience for free now: &lt;a href="http://www.devexpress.com/Downloads/NET/"&gt;http://www.devexpress.com/Downloads/NET/&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292772" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/Video/default.aspx">Video</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/training/default.aspx">training</category></item><item><title>Video: Zurich Has A Warm Heart</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/02/02/video-zurich-has-a-warm-heart.aspx</link><pubDate>Wed, 03 Feb 2010 00:15:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:293020</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Check out this short mix of the developer feedback from the recent Zurich stop of DevExpress European road show/tour:&lt;/p&gt;  &lt;p&gt;Oliver and I began our &lt;a href="http://community.devexpress.com/blogs/oliverthinks/archive/2009/10/27/european-training-roadshow-2010.aspx"&gt;epic 4 city journey&lt;/a&gt; in &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/28/video-london-devs-share-training-feedback.aspx"&gt;London, UK&lt;/a&gt; then drove to &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/26/aufwiedersehen-germany-hallo-switzerland.aspx" target="_blank"&gt;Frankfurt, Germany&lt;/a&gt; and arrived at &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/30/ciao-switzerland-bonjour-france.aspx" target="_blank"&gt;Zurich, Switzerland&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Our goal is to train developers on the “Business Apps with DXperience ASP.NET” course. From the attendees feedback below, they enjoyed the class and experience very much:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tv.devexpress.com/ZurichMix.movie" target="_blank"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/aspnet/image_758F87CF.png" width="452" height="277" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Thanks to everyone in the Zurich class! &lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=293020" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/Video/default.aspx">Video</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/training/default.aspx">training</category></item><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><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>Ciao Switzerland, Bonjour France</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/01/30/ciao-switzerland-bonjour-france.aspx</link><pubDate>Sun, 31 Jan 2010 00:30:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292666</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;It’s time to say Ciao (goodbye) to Zurich and the excellent group of developer attendees we met there. To sum up the 3 days we spent here: It was incredible!&lt;/p&gt;  &lt;h3&gt;I’m On A Mountain!&lt;/h3&gt;  &lt;p&gt;Let’s start with the location: the Hotel Kulm in Zurich is where the 2 day training was held. This hotel sits at the top of &lt;a href="http://www.utokulm.ch/" target="_blank"&gt;Uteilberg&lt;/a&gt;, has fantastic views and at this time of the year, there is snow everywhere:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7161_2CE2400E.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="View From Hotel Kulm Tower" border="0" alt="View From Hotel Kulm Tower" src="http://community.devexpress.com/blogs/aspnet/IMG_7161_thumb_19C11362.jpg" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160; &lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7156_241237C2.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Oliver Checking In" border="0" alt="Oliver Checking In" src="http://community.devexpress.com/blogs/aspnet/IMG_7156_thumb_75D83C07.jpg" width="244" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The location put everyone in a good mood. Sort of. A snow storm followed us to Zurich, just &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/26/aufwiedersehen-germany-hallo-switzerland.aspx" target="_blank"&gt;the same as Day 1 in Frankfurt&lt;/a&gt;. While a couple of attendees were delayed, everyone made it to the class and enjoyed the course.&lt;/p&gt;  &lt;h3&gt;Fantastic Attendees!&lt;/h3&gt;  &lt;p&gt;The group of attendees here were a sharp bunch of developers. A few of them were also owners and founders of their own successful software companies. Check out the some of the pics from the class:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7065_3BE8F91B.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Oliver And His Instant Gratification CodeRush Plugin" border="0" alt="Oliver And His Instant Gratification CodeRush Plugin" src="http://community.devexpress.com/blogs/aspnet/IMG_7065_thumb_3B109331.jpg" width="184" height="244" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7068_2C65E74C.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Attendees Tackle The Labs" border="0" alt="Attendees Tackle The Labs" src="http://community.devexpress.com/blogs/aspnet/IMG_7068_thumb_395FC75D.jpg" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7080_43B0EBBD.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Break Time == Coffee" border="0" alt="Break Time == Coffee" src="http://community.devexpress.com/blogs/aspnet/IMG_7080_thumb_22BD7916.jpg" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7073_6FED72A1.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Time For Lunch!" border="0" alt="Time For Lunch!" src="http://community.devexpress.com/blogs/aspnet/IMG_7073_thumb_35FE2FB5.jpg" width="184" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7114_0E57B38B.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Zurich Attendess Group Photo" border="0" alt="Zurich Attendess Group Photo" src="http://community.devexpress.com/blogs/aspnet/IMG_7114_thumb_6D6440E3.jpg" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Special Guest&lt;/h3&gt;  &lt;p&gt;Marc Greiner also attended the class to both learn about the DevExpress ASP.NET controls but also meet with Oliver and myself. Both Oliver and I were humbled and honored to have Marc there and to finally meet him in person. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_0945_5EB994FE.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Marc Greiner [DX-Squad]" border="0" alt="Marc Greiner [DX-Squad]" src="http://community.devexpress.com/blogs/aspnet/IMG_0945_thumb_3DC62257.jpg" width="244" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Marc’s involvement with the DX-Squad goes back many years as he’s helped many developers in the &lt;a href="http://community.devexpress.com/members/Marc-Greiner-_5B00_DX_2D00_Squad_5D00_.aspx" target="_blank"&gt;DevExpress forums&lt;/a&gt;. Thanks Marc!&lt;/p&gt;  &lt;h3&gt;Paris Or Bust&lt;/h3&gt;  &lt;p&gt;Now we drive to the last stop, Paris! &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7176_0AF61BE3.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Oliver&amp;#39;s Land Rover" border="0" alt="Oliver&amp;#39;s Land Rover" src="http://community.devexpress.com/blogs/aspnet/IMG_7176_thumb_34F61A0B.jpg" width="244" height="184" /&gt;&lt;/a&gt; &lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_7178_1B21E3DC.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="DevExpress Road Show Car Sign" border="0" alt="DevExpress Road Show Car Sign" src="http://community.devexpress.com/blogs/aspnet/IMG_7178_thumb_7A2E7134.jpg" width="244" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Stay tuned for more news from the European Road Tour.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292666" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/training/default.aspx">training</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><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>Video: Frankfurt Devs Share Their DevExpress Passion</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/01/29/video-frankfurt-devs-share-their-devexpress-passion.aspx</link><pubDate>Fri, 29 Jan 2010 13:15:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292604</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Check out the 4 minute video from the Frankfurt stop of our European road show tour.&lt;/p&gt;  &lt;p&gt;Oliver and I began our &lt;a href="http://community.devexpress.com/blogs/oliverthinks/archive/2009/10/27/european-training-roadshow-2010.aspx" target="_blank"&gt;epic 4 city journey&lt;/a&gt; in &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/28/video-london-devs-share-training-feedback.aspx" target="_blank"&gt;London&lt;/a&gt;, then drove through France and in to Frankfurt, Germany. Our goal is to train developers on the “Business Apps with DXperience ASP.NET” course. &lt;/p&gt;  &lt;p&gt;The first day we arrived in &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/26/aufwiedersehen-germany-hallo-switzerland.aspx" target="_blank"&gt;Frankfurt, Germany&lt;/a&gt;, a snow storm hit. But the snow didn’t stop any of the attendees from getting to the “Business Apps with DXperience ASP.NET” course. We had a full house of 24 developers at the fabulous Maritim hotel.&lt;/p&gt;  &lt;p&gt;Many of the developers in the Frankfurt course were familiar with our tools and they had a lot to say. Check out their comments:&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://tv.devexpress.com/FrankfurtMix.movie" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Video: Frankfurt Devs Share Their DevExpress Passion" border="0" alt="Video: Frankfurt Devs Share Their DevExpress Passion" src="http://community.devexpress.com/blogs/aspnet/image_58688F17.png" width="438" height="269" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As a bonus to the 2 day course, we added a &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/25/frankfurt-free-seminar-recap.aspx" target="_blank"&gt;special “free roadshow” afternoon&lt;/a&gt; which was also a fun event.&lt;/p&gt;  &lt;p&gt;Keep an eye on this blog for news from the next city in the training tour: Zurich, Switzerland!&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292604" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/Video/default.aspx">Video</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/training/default.aspx">training</category></item><item><title>CodeMash 2010 over, gotta get me some CodeMash 2011</title><link>http://community.devexpress.com/blogs/rachelhawley/archive/2010/01/29/codemash-2010-over-gotta-get-me-some-codemash-2011.aspx</link><pubDate>Fri, 29 Jan 2010 12:32:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292611</guid><dc:creator>Rachel Hawley (Developer Express)</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/rachelhawley/image_3A991172.png"&gt;&lt;img style="border-right-width:0px;margin:0px 5px 5px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Codemash - Ruby, .NET and Python ... Oh y!" alt="Codemash - Ruby, .NET and Python ... Oh y!" src="http://community.devexpress.com/blogs/rachelhawley/image_thumb_791E5F18.png" align="left" border="0" width="204" height="204" /&gt;&lt;/a&gt;It&amp;rsquo;s a unique developer event. It covers a &lt;a href="http://www.codemash.org/Sessions"&gt;vast range of topics&lt;/a&gt;. It attracts &lt;a href="http://groups.google.com/group/codemash/web/speaker-slides-from-codemash-2010"&gt;terrific community speakers&lt;/a&gt;. It&amp;rsquo;s held in Sandusky, OH in January &amp;hellip; in a water park.&lt;/p&gt;
&lt;p&gt;Yes, that&amp;rsquo;s right, it&amp;rsquo;s held in a water park in the middle of winter. An &lt;i&gt;&lt;a href="http://www.kalahariresorts.com/oh/"&gt;indoor water park&lt;/a&gt;&lt;/i&gt; that is.&lt;/p&gt;
&lt;p&gt;Ladies and gentleman, I give you &lt;a href="http://www.codemash.org/"&gt;CodeMash&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/rachelhawley/image_5F4A28E9.png"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 0px 5px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Kalahari Water Park - Picture from Alan Barber&amp;#39;s Flickr Stream" alt="Kalahari Water Park - Picture from Alan Barber&amp;#39;s Flickr Stream" src="http://community.devexpress.com/blogs/rachelhawley/image_thumb_0F70B206.png" align="right" border="0" width="258" height="195" /&gt;&lt;/a&gt;Jim Holmes, Jason Follas and the staff at the Kalahari Resort in Sandusky, OH did an incredible job of creating an very friendly, inclusive and yet vibrant event that catered to every type of developer, be you a networker extraordinaire or more the quiet type. &lt;/p&gt;
&lt;p&gt;Attendees had the pick of 7 different tracks with topics covering all manner of different development practices, platforms and languages. Speakers bought sessions on not just .NET but also the likes of Ruby, Java and Clojure. And if the session format was not quite your style, there was ample (and I really mean &lt;b&gt;ample&lt;/b&gt;!) room for open spaces chats, mini breakout sessions and even a coding dojo available for you to meet with smaller groups of equally intrigued and enthused developers to learn more about what you were seeing in the sessions. On more than one occasion I happened upon Silverlight guru Jesse Liberty hanging out in the break out areas participating in various open spaces gatherings.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Another great part of CodeMash is its family-friendly nature. &lt;a href="http://www.flickr.com/photos/alan_barber/4276920271/in/set-72157623217323924/"&gt;KidzMash&lt;/a&gt; offer all day activities to mini geeks, and with the resort being so family focussed and vast in its services this offers a great opportunity to bring your family and take some time out with activities to suit everyone &amp;ndash; water park, spa, tech conference and a great atmosphere.&lt;/p&gt;
&lt;p&gt;The organizers put on a fantastic range of food and refreshments catering for a range of curious dietary needs, as well as bringing in the most innovative of attendee party guests that I have seen at a developer event. &lt;a href="http://www.enterthehaggis.com/"&gt;Enter the Haggis&lt;/a&gt;, a Canadian folk/rock/pop fusion band joined the attendees for a roof-raising evening at the attendee party mid-way through the event. These guys had bagpipes, I kid you not! They kicked off a phenomenal evening of festivities that ran into the small hours with new friends getting to know each other and old friends catching up. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/rachelhawley/image_189CC77A.png"&gt;&lt;img style="border-right-width:0px;margin:0px 5px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Keith Elder giving a convincing CodeRush pitch" alt="Keith Elder giving a convincing CodeRush pitch" src="http://community.devexpress.com/blogs/rachelhawley/image_thumb_6A8F2927.png" align="left" border="0" width="257" height="194" /&gt;&lt;/a&gt;Gary and I spent our non-exhibiting time mingling with the attendees and meeting DevExpress customers and supporters. We looked on as Keith Elder talked to attendees about CodeRush, we let Jason Follas loose with our swag (we might let him help out again, he was a pretty good &amp;ldquo;booth babe&amp;rdquo;), and we traded drinks vouchers with new friends. I&amp;rsquo;d like to thank &lt;a href="http://twitter.com/john_prideaux"&gt;John Prideaux&lt;/a&gt; for being my buddy for the night on Thursday and enjoying a bit of Enter the Haggis music with me, while I left Gary to fight off the onslaught of &lt;a href="http://twitter.com/cwoodruff"&gt;Chris &amp;ldquo;Woody&amp;rdquo; Woodruff&lt;/a&gt;&amp;rsquo;s eye-wateringly strong Long island Iced Teas.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you have been to this event you will know how truly fantastic it is. If you haven&amp;rsquo;t, I can only urge you to join the &lt;a href="http://groups.google.com/group/codemash"&gt;CodeMash Google Group&lt;/a&gt; and keep yourself up-to-date on the plans for the 2011 event. The 700 places for the 2010 event sold out in just 32 days. I have no doubt that 2011 will sell out in record time.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This event is like no other developer event you will attend. Do not miss out on your opportunity to experience it for yourself in 2011.&lt;/p&gt;
&lt;p&gt;I hope I&amp;rsquo;ll see you there! &lt;/p&gt;
&lt;p&gt;[Note: Alan Barber has some great shots of the 2010 event. Check out &lt;a href="http://www.flickr.com/photos/alan_barber/sets/72157623217323924/"&gt;his photographs on Flickr&lt;/a&gt;.] &lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292611" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/rachelhawley/archive/tags/Community/default.aspx">Community</category><category domain="http://community.devexpress.com/blogs/rachelhawley/archive/tags/Conferences/default.aspx">Conferences</category><category domain="http://community.devexpress.com/blogs/rachelhawley/archive/tags/CodeMash/default.aspx">CodeMash</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><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>Video: London Devs Share Training Feedback</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/01/28/video-london-devs-share-training-feedback.aspx</link><pubDate>Thu, 28 Jan 2010 17:59:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292510</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;Check out this short 3 minute video from the DevExpress ASP.NET training course we recently did in &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/22/london-or-bust.aspx" target="_blank"&gt;London&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tv.devexpress.com/DXeuropetraining01.movie" target="_blank"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Video: London Training Feedback" border="0" alt="Video: London Training Feedback" src="http://community.devexpress.com/blogs/aspnet/image3_11BE4C65.png" width="390" height="239" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="dxperience-blog-block"&gt;   &lt;h4&gt;DXperience? What&amp;#39;s That?&lt;/h4&gt;    &lt;p&gt;DXperience is the .NET developer&amp;#39;s secret weapon. Get full access to a complete suite of professional components that let you instantly drop in new features, designer styles and fast performance for your applications. Try a fully-functional version of DXperience for free now: &lt;a href="http://www.devexpress.com/Downloads/NET/"&gt;http://www.devexpress.com/Downloads/NET/&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292510" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/Video/default.aspx">Video</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/training/default.aspx">training</category></item><item><title>Mark Miller Humbled Again!</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/01/28/mark-miller-has-been-humbled-again.aspx</link><pubDate>Thu, 28 Jan 2010 16:00:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292417</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Mark created a hybrid coding input device with a &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2009/10/20/mark-miller-will-beat-you-with-a-guitar.aspx" target="_blank"&gt;Rock Band toy guitar and CodeRush&lt;/a&gt; to use in a coding contest where he demonstrated that even with only a few buttons to use, CodeRush enabled him to write code faster than dozens of challengers at PDC, including top notch talent like &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2009/12/16/video-coderush-guitar-code-challenge-at-pdc-2009.aspx" target="_blank"&gt;Scott Hanselman and Steve Smith&lt;/a&gt;. &lt;a title="Eiríkur Nilsson Wins Coding Challenge At PDC 2009" href="https://community.devexpress.com/blogs/ctodx/archive/2009/11/19/eir-237-kur-nilsson-wins-beatles-rockband-contest.aspx" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:10px 0px 20px 20px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="13542_182544642356_101685002356_2799631_1383446_n" border="0" alt="13542_182544642356_101685002356_2799631_1383446_n" align="right" src="http://community.devexpress.com/blogs/aspnet/13542_182544642356_101685002356_2799631_1383446_n_37EA12C7.jpg" width="184" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It was amazing! Mark + toy guitar controller * CodeRush took them all on and emerged victorious! Mostly. There were 2 lucky developers that were a little faster than the MarkCodeRushToyGuitar cyborg.&lt;/p&gt;  &lt;p&gt;Check out this great quote from one of the winners, Eiríkur Nilsson:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;I first tried out CodeRush Xpress and immediately knew I had to get the full package, it really does change how one writes code. The code generators are incredible, the way they allow you to write multiple lines of code with just a couple of keystrokes is ingenious, it&amp;#39;s quite hard to explain as it really needs to be witnessed. That applies as well to how CodeRush presents things in-line in your code editor, the way refactorings are presented is so visual and intuitive. It makes a huge difference not having to switch focus from the code editor in order to do something like renaming or moving arguments. Finally, the Code Navigation features really speed up moving around your code. &lt;/p&gt;    &lt;p&gt;All in all, CodeRush speeds up development in countless ways. So, after beating Mark on his Rock Band programming, I had to ask for a full CodeRush license in reward, and I&amp;#39;ve been really happy using it. &lt;/p&gt;    &lt;p&gt;-Eiríkur Nilsson&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Mark was humbled by Eirikur at PDC 2009 and again by his quote above (in a good way - thanks Eirikur). Mark especially liked this line that shows one of CodeRush’s core strengths:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;…the way refactorings are presented is so visual and intuitive. It makes a huge difference not having to switch focus from the code editor in order to do something like renaming or moving arguments.&lt;/p&gt;    &lt;p&gt;-Eiríkur Nilsson&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Thanks Eiríkur Nilsson. I can only imagine how fast you are now WITH CodeRush! &lt;/p&gt;  &lt;div class="dxperience-blog-block"&gt;   &lt;h4&gt;Want to experience a better Visual Studio?&lt;/h4&gt;    &lt;p&gt;Install CodeRush by downloading a lite and free version here: &lt;a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/" target="_blank"&gt;CodeRush Xpress&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Or better yet, try the full blown package free for 30 days – &lt;a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/" target="_blank"&gt;CodeRush and Refactor Pro Download!&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292417" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/CodeRush/default.aspx">CodeRush</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/Comment/default.aspx">Comment</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><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><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>Auf Wiedersehen Germany! Hallo Switzerland!</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/01/26/aufwiedersehen-germany-hallo-switzerland.aspx</link><pubDate>Tue, 26 Jan 2010 16:40:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292204</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>9</slash:comments><description>&lt;p&gt;Day 2 of the Frankfurt training course has just ended as we say Auf Wiedersehen (“Goodbye and see you again”) to Germany. &lt;/p&gt;  &lt;p&gt;When we first drove into Germany a few days ago, a snow storm followed us and created a beautiful winter scene:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_0922_5E69B0A5.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Snowy Morning In FrankFurt" border="0" alt="Snowy Morning In FrankFurt" src="http://community.devexpress.com/blogs/aspnet/IMG_0922_thumb_4682C97F.jpg" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6959_4B2248C8.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Day 2 view from meeting room" border="0" alt="Day 2 view from meeting room" src="http://community.devexpress.com/blogs/aspnet/IMG_6959_thumb_7656BA02.jpg" width="244" height="184" /&gt;&lt;/a&gt;     &lt;br /&gt;This didn’t stop anyone from getting to the course as we had a packed room of 24 attendees at the magnificent Maritim Hotel:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6956_13469016.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Frankfurt Training Class Front" border="0" alt="Frankfurt Training Class Front" src="http://community.devexpress.com/blogs/aspnet/IMG_6956_thumb_1195C442.jpg" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6957_7BCBDBE4.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Frankfurt Training Class Back" border="0" alt="Frankfurt Training Class Back" src="http://community.devexpress.com/blogs/aspnet/IMG_6957_thumb_6EF185C6.jpg" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2 full days of coverage on all of the DevExpress ASP.NET controls is a lot of information! The attendees didn’t mind as the course is designed to not be overwhelming. Besides, we took good care of them:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6948_4455A4E9.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Frankfurt Training Class Lunch" border="0" alt="Frankfurt Training Class Lunch" src="http://community.devexpress.com/blogs/aspnet/IMG_6948_thumb_098DFC13.jpg" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6954_4DFE131F.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Frankfurt Training Class - ASP.NET DevExpress Books " border="0" alt="Frankfurt Training Class - ASP.NET DevExpress Books " src="http://community.devexpress.com/blogs/aspnet/IMG_6954_thumb_7E44E7D5.jpg" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The class was a great mix of attendees from our current customers and a few that were just evaluating our tools! What a great way to get to know a vendor and their tools.&lt;/p&gt;  &lt;p&gt;The current customers brought many interesting questions and scenarios. Some of the questions are challenging and some einfach (easy). But all of them were fun and interesting to discuss with them.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Zurich Or Bust&lt;/h3&gt;  &lt;p&gt;Now it’s on to Zurich and the small town of Uetliberg. If you’re interested in the weather there, check out the hotel’s &lt;a href="http://www.utokulm.ch/nc/deutsch/news/webcam/" target="_blank"&gt;webcam&lt;/a&gt;. Better yet, sign up for one of the few seats left there:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Sign Up Now&lt;/h3&gt;  &lt;p&gt;There are a few seats left in the Paris class. &lt;a href="http://professional-developer-training.com/items.aspx?catId=c44"&gt;&lt;strong&gt;Click here and sign up now&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Why should you attend?&amp;#160; Because you will learn, feel super smart and have fun doing it. Check out &lt;a href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/13/why-you-should-attend-devexpress-asp-net-training.aspx"&gt;the short feedback video&lt;/a&gt; from past attendees.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292204" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/training/default.aspx">training</category></item><item><title>Michigan: An educationally rich community for developers</title><link>http://community.devexpress.com/blogs/rachelhawley/archive/2010/01/25/michigan-an-educationally-rich-community-for-developers.aspx</link><pubDate>Mon, 25 Jan 2010 16:16:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292051</guid><dc:creator>Rachel Hawley (Developer Express)</dc:creator><slash:comments>1</slash:comments><description>&lt;p align="justify"&gt;Those of you who follow me on &lt;a href="http://twitter.com/RachelHawley" target="_blank"&gt;Twitter&lt;/a&gt; will know that I have had terrible trouble getting back on board with the GMT time zone these past few days. To be honest, I was very much enjoying EST and all that Michigan had to offer &amp;hellip; lack of sleep kinda makes me want to go back again!&lt;/p&gt;
&lt;p align="justify"&gt;Gary and I have spent the past 2 weeks circumnavigating Michigan state and its surrounding area, visiting customers, attending user groups, catching up with DevExpress friends and attending the epic &lt;a href="http://www.codemash.org/" target="_blank"&gt;CodeMash&lt;/a&gt; conference in Sandusky, OH. It has been a non-stop rollercoaster trip that saw us cover almost 1400 miles in just 8 working days.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.wmdotnet.org/"&gt;&lt;img style="border-right-width:0px;margin:0px 5px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="West Michigan .NET User Group logo" alt="West Michigan .NET User Group logo" src="http://community.devexpress.com/blogs/rachelhawley/image_21360053.png" align="left" border="0" width="165" height="98" /&gt;&lt;/a&gt;I would like to send out a huge &amp;ldquo;thank you&amp;rdquo; to the organizers and attendees at &lt;a href="http://www.wmdotnet.org/" target="_blank"&gt;West Michigan .NET User Group&lt;/a&gt;, &lt;a href="http://www.nwnug.com/graffiti/" target="_blank"&gt;Northwest Ohio .NET User Group&lt;/a&gt; and &lt;a href="http://www.glugnet.org/" target="_blank"&gt;GLUGnet&lt;/a&gt;. These guys were so hospitable during our trip and helped us with an inordinate amount of stuff - getting us to and from the airport, finding local hotels, introducing us to their user groups &amp;ndash; all the stuff that really makes or breaks a business trip! &lt;/p&gt;
&lt;p align="justify"&gt;Michigan is an exceptionally fortunate state for developers. It has a huge amount of educational resources as well as willing participants that make it one of the richest developer communities I know. Off the top of my head I can think of at least six groups that can be easily reached from various towns in the state. That&amp;rsquo;s huge! &lt;a href="http://www.chriswoodruff.com/" target="_blank"&gt;Chris Woodruff&lt;/a&gt;, &lt;a href="http://jasonfollas.com/blog/" target="_blank"&gt;Jason Follas&lt;/a&gt; and &lt;a href="http://www.mcwherter.net/blog/" target="_blank"&gt;Jeff McWherter&lt;/a&gt; are just some of the people who are helping to support a thriving developer community in this area by cross-pollinating their extensive community contacts and supporting each other&amp;rsquo;s endeavours month on month.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.glugnet.org/"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 5px 5px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Greater Lansing .NET User Group logo" alt="Greater Lansing .NET User Group logo" src="http://community.devexpress.com/blogs/rachelhawley/image_6A78A54E.png" align="right" border="0" width="240" height="110" /&gt;&lt;/a&gt;If you aren&amp;rsquo;t a regular attendee of one of your local user groups or if you don&amp;rsquo;t know of one near you &lt;a href="http://www.ineta.org/UserGroups/FindUserGroups.aspx" target="_blank"&gt;please do a quick search&lt;/a&gt; to see if you can find a group that meets near you. INETA offers a vast amount of information for developers and user groups alike, and there are certainly ways and means of finding groups near you for other development platforms that you might be interested in.&lt;/p&gt;
&lt;p align="justify"&gt;The meetings put on by these groups are a great way to pick up information from interesting speakers, and, even better, they are also stuffed full of people from your area that could offer you advice, support, insights and maybe even job suggestions. If &lt;a href="http://www.ineta.org/" target="_blank"&gt;INETA&lt;/a&gt; can&amp;rsquo;t find one for you, then ask me and I&amp;rsquo;ll see what I can find!&lt;/p&gt;
&lt;p align="justify"&gt;Developer-led groups and events are a fun, friendly and open way of meeting other developers in your area and networking (to whatever extent you want to) with people who are as similarly passionate about what they do as you are. Even I enjoy these meetings, especially when there are &lt;a href="http://twitpic.com/z4q9p"&gt;delicious cupcakes&lt;/a&gt; on offer (thanks to Betsy Weber at TechSmith!) &lt;/p&gt;
&lt;p align="justify"&gt;And what is great about user group events is that they are &lt;b&gt;completely free&lt;/b&gt; to attend. You get pizza, prizes and presentations all for free! &lt;/p&gt;
&lt;p align="justify"&gt;What are you waiting for? Find your local user group!&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292051" width="1" height="1"&gt;</description></item><item><title>Frankfurt Free Seminar Recap</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/01/25/frankfurt-free-seminar-recap.aspx</link><pubDate>Mon, 25 Jan 2010 14:05:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:292024</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Thanks to everyone who came to see our free 2-3 hour seminar in Frankfurt yesterday. Here’s a quick shot of some of the local developers who stopped by:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_0918_3E684EB2.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="DevExpress Frankfurt Get Together" border="0" alt="DevExpress Frankfurt Get Together" src="http://community.devexpress.com/blogs/aspnet/IMG_0918_thumb_1438A0CA.jpg" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;The event was a fun and informal get together with a couple of presentations and some questions and answers. The group of developers varied from the local .NET user group members to curious developers who are considering our tools.&lt;/p&gt;  &lt;p&gt;Speaking of fun, we played some music, had a flight simulator game setup and, of course, presentations from Oliver and myself. I’m pretty sure that the attendees had as much as fun as we did.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_0919_0C40FE68.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Oliver @ Frankfurt Meeting" border="0" alt="Oliver @ Frankfurt Meeting" src="http://community.devexpress.com/blogs/aspnet/IMG_0919_thumb_6858270D.jpg" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now it’s back to work as we finish the 2 days of training for “Business Applications w/DXperience ASP.NET” in Frankfurt. Then it’s on to Zurich, Switzerland.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=292024" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/DXperience/default.aspx">DXperience</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/training/default.aspx">training</category></item><item><title>London Or Bust</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/01/22/london-or-bust.aspx</link><pubDate>Fri, 22 Jan 2010 17:05:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:291778</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>7</slash:comments><description>&lt;p&gt;The two day &amp;ldquo;Business Apps with DXperience ASP.NET&amp;rdquo; course in London has just finished and it was fun! The London group of developers were a great bunch and it was a pleasure to meet them. The majority of the attendees were from the United Kingdom but some also came from Spain, Denmark and Libya!&lt;/p&gt;
&lt;p&gt;From their early feedback, they found the course impressive and had a good time learning. Check out these pictures from the London training course:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_0913_1625CC50.jpg"&gt;&lt;img height="184" width="244" src="http://community.devexpress.com/blogs/aspnet/IMG_0913_thumb_5DB7A577.jpg" alt="Oliver Teaching ASPxGauges" border="0" title="Oliver Teaching ASPxGauges" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_0914_71648F0B.jpg"&gt;&lt;img height="184" width="244" src="http://community.devexpress.com/blogs/aspnet/IMG_0914_thumb_076AFA9E.jpg" alt="Meeting Room" border="0" title="Meeting Room" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6911_5EEC1889.jpg"&gt;&lt;img height="184" width="244" src="http://community.devexpress.com/blogs/aspnet/IMG_6911_thumb_50CD298C.jpg" alt="London Training Attendees" border="0" title="London Training Attendees" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_0915_3F538AB1.jpg"&gt;&lt;img height="184" width="244" src="http://community.devexpress.com/blogs/aspnet/IMG_0915_thumb_6253D654.jpg" alt="Class Watching Oliver" border="0" title="Class Watching Oliver" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;As a bonus for the London group, I gave an hour presentation on the ASPxHttpHandler. The dedicated group of developers stayed an extra hour to learn and I thank them for listening and bringing up good questions.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Sign Up Now&lt;/h3&gt;
&lt;p&gt;There are a few seats left in the Paris and Zurich classes. Did I mention that they are in PARIS and ZURICH?!? &lt;a target="_blank" href="http://professional-developer-training.com/items.aspx?catId=c44"&gt;&lt;strong&gt;Click here and sign up now&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Why should you attend?&amp;nbsp; Because you will learn, feel super smart and have fun doing it. Check out &lt;a target="_blank" href="http://community.devexpress.com/blogs/aspnet/archive/2010/01/13/why-you-should-attend-devexpress-asp-net-training.aspx"&gt;the short feedback video&lt;/a&gt; from past attendees.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;First Time Pictures&lt;/h3&gt;
&lt;p&gt;This was my first trip to London and the city is amazing. I rode the &amp;ldquo;underground&amp;rdquo; (or subway as it&amp;rsquo;s called in New York). I saw a few of the sites but the best part was meeting the people in the course. In fact, there&amp;rsquo;ll be videos of this event and the attendees later.&lt;/p&gt;
&lt;p&gt;Check out some of these pictures from the first day we arrived (hover your mouse over a picture for the picture description):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_0889_219B3DF5.jpg"&gt;&lt;img height="184" width="244" src="http://community.devexpress.com/blogs/aspnet/IMG_0889_thumb_171A69D5.jpg" alt="Arriving at London Hotel" border="0" title="Arriving at London Hotel" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6807_63DE306B.jpg"&gt;&lt;img height="184" width="244" src="http://community.devexpress.com/blogs/aspnet/IMG_6807_thumb_2A877DDC.jpg" alt="View From Novotel Hotel" border="0" title="View From Novotel Hotel" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6831_37152AF8.jpg"&gt;&lt;img height="184" width="244" src="http://community.devexpress.com/blogs/aspnet/IMG_6831_thumb_661766CF.jpg" alt="Oliver, Mehul &amp;amp; John in London" border="0" title="Oliver, Mehul &amp;amp; John in London" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6868_398E36E9.jpg"&gt;&lt;img height="184" width="244" src="http://community.devexpress.com/blogs/aspnet/IMG_6868_thumb_06FAB3AA.jpg" alt="London Eye, Big Ben &amp;amp; Parliament" border="0" title="London Eye, Big Ben &amp;amp; Parliament" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6861_73012113.jpg"&gt;&lt;img height="184" width="244" src="http://community.devexpress.com/blogs/aspnet/IMG_6861_thumb_1A0BBA89.jpg" alt="The Sherlock Holmes Restaurant" border="0" title="The Sherlock Holmes Restaurant" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://community.devexpress.com/blogs/aspnet/IMG_6879_3B5B3A58.jpg"&gt;&lt;img height="184" width="244" src="http://community.devexpress.com/blogs/aspnet/IMG_6879_thumb_4342B6ED.jpg" alt="Chrome Ad in Underground" border="0" title="Chrome Ad in Underground" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Frankfurt Or Bust&lt;/h3&gt;
&lt;p&gt;Now we head over to Frankfurt, Germany and prepare for the fully booked course. I&amp;rsquo;m looking forward to meet the devs there and I hope to meet you in Paris or Zurich too.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=291778" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/DXperience/default.aspx">DXperience</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/training/default.aspx">training</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/Europe/default.aspx">Europe</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><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><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><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>Why You Should Attend DevExpress ASP.NET Training</title><link>http://community.devexpress.com/blogs/aspnet/archive/2010/01/13/why-you-should-attend-devexpress-asp-net-training.aspx</link><pubDate>Wed, 13 Jan 2010 21:15:00 GMT</pubDate><guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:290369</guid><dc:creator>Mehul Harry (Developer Express)</dc:creator><slash:comments>7</slash:comments><description>&lt;p&gt;There are still a few seats left for the upcoming European training events. This is your chance to learn about the DevExpress ASP.NET controls and have some fun! &lt;/p&gt;  &lt;p&gt;Oliver and I will be presenting the “Business Apps with DXperience in ASP.NET” in four major cities in Europe starting next week. This 2 day course packs a lot of information on the DevExpress ASP.NET controls. Check out the video below to see how you’ll have a great time learning.&lt;/p&gt;  &lt;p&gt;For more details, check out Oliver’s recent blog posts:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://community.devexpress.com/blogs/oliverthinks/archive/2009/10/21/amsterdam-training-class-get-it-while-it-s-hot.aspx" target="_blank"&gt;Details on the “Business Apps with DXperience ASP.NET” course&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://community.devexpress.com/blogs/oliverthinks/archive/2010/01/05/update-european-training-events-in-january-2010.aspx" target="_blank"&gt;Few remaining seats for Europe&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://community.devexpress.com/blogs/oliverthinks/archive/2010/01/13/frankfurt-training-class-one-final-seat-available.aspx" target="_blank"&gt;And only one seat left for Frankfurt!&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;What do past attendees think of this course?&lt;/h3&gt;  &lt;p&gt;Check out this short video about the recent DevExpress ASP.NET training course from Las Vegas. The attendees share their thoughts on the course and DevExpress. These devs were all smart and working on interesting projects in either ASP.NET or WinForms: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://tv.devexpress.com/ASPxTraining.movie" target="_blank"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="DevExpress ASP.NET Training Comments From Las Vegas 2009" border="0" alt="DevExpress ASP.NET Training Comments From Las Vegas 2009" src="http://community.devexpress.com/blogs/aspnet/image7_493FE956.png" width="561" height="342" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Watch the short customer feedback video. Then sign-up for the few remaining seats for the European training events. I hope to meet you guys there.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=290369" width="1" height="1"&gt;</description><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/DXperience/default.aspx">DXperience</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://community.devexpress.com/blogs/aspnet/archive/tags/training/default.aspx">training</category></item></channel></rss>