<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>eXpandFramework RSS</title>
    <link>http://www.rssmix.com/</link>
    <description>This feed was created by mixing existing feeds from various sources.</description>
    <generator>RSSMix</generator>
    <item>
      <title>Compile your solution without DevExpress assemblies installed in 4 lines</title>
      <link>http://apobekiaris.blogspot.com/2019/01/compile-your-solution-without.html</link>
      <description>&lt;p&gt;Do you have a project, where you use &lt;em&gt;Azure&lt;/em&gt; pipelines to build it? How do you get the referenced &lt;em&gt;DevExpress&lt;/em&gt; assemblies? In this post I will discuss how we go for it in eXpandFramework. The process however is applicable in all other projects.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;After executing the next 4 lines your solution should compile:&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;div style="background: rgb(255, 255, 255); border-width: 0.1em 0.1em 0.1em 0.8em; border-style: solid; border-color: gray; padding: 0.2em 0.6em; border-image: none; width: auto; overflow: auto;"&gt;&lt;pre style="margin: 0px; line-height: 125%;"&gt;Install-Module XpandPosh&lt;br /&gt;&lt;span style="color: rgb(0, 112, 32);"&gt;Register-PackageSource&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0); background-color: rgb(255, 170, 170);"&gt;–&lt;/span&gt;ProviderName Nuget &lt;span style="color: rgb(255, 0, 0); background-color: rgb(255, 170, 170);"&gt;–&lt;/span&gt;Name DX_private &lt;span style="color: rgb(255, 0, 0); background-color: rgb(255, 170, 170);"&gt;–&lt;/span&gt;Location https&lt;span style="color: rgb(255, 0, 0); background-color: rgb(255, 170, 170);"&gt;:&lt;/span&gt;//nuget.devexpress.com/YOURTOKEN&lt;br /&gt;Install-DX -binPath YOURBIN -dxSources $(&lt;span style="color: rgb(0, 112, 32);"&gt;Get-PackageSourceLocations&lt;/span&gt; -join &lt;span style="background-color: rgb(255, 240, 240);"&gt;";"&lt;/span&gt;) -sourcePath YOURSOURCESPATH -dxVersion 18.2.5 &lt;br /&gt;&lt;span style="color: rgb(0, 112, 32);"&gt;Update-HintPath&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0); background-color: rgb(255, 170, 170);"&gt;–&lt;/span&gt;OutputPath YOURBIN &lt;span style="color: rgb(255, 0, 0); background-color: rgb(255, 170, 170);"&gt;–&lt;/span&gt;SourcesPath YOURSOURCESPATH&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;pre&gt;&lt;br&gt;&lt;/pre&gt;&lt;p&gt;For feedback drop an issue at &lt;a title="https://github.com/eXpandFramework/DevExpress.PackageContent" href="https://github.com/eXpandFramework/DevExpress.PackageContent"&gt;https://github.com/eXpandFramework/DevExpress.PackageContent&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=iznNgW3XrXs:okI2fQuA9gw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=iznNgW3XrXs:okI2fQuA9gw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=iznNgW3XrXs:okI2fQuA9gw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=iznNgW3XrXs:okI2fQuA9gw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?i=iznNgW3XrXs:okI2fQuA9gw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Mon, 28 Jan 2019 04:57:42 GMT</pubDate>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-3509234234245012858.post-3035426201417006329</guid>
      <dc:creator>noreply@blogger.com (Apostolis Bekiaris)</dc:creator>
      <dc:date>2019-01-28T04:57:42Z</dc:date>
    </item>
    <item>
      <title>Easy asynchronous web notifications</title>
      <link>http://apobekiaris.blogspot.com/2018/10/easy-asynchronous-web-notifications.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh3.googleusercontent.com/-b3Q1ud9LGSs/W78XC0dTiJI/AAAAAAAALNk/2SZEGmuANK8cfD03g67HeTe3gV9iqPOPwCHMYCw/s72-c/image_thumb2?imgmax=800" height="72" width="72" />
      <description>Today we will discuss another common case, how to create a progress bar to notify our web users about the state of their long running tasks. For this discussion we will work with&amp;nbsp; DevExpress XAF Business Application Framework. We will develop &lt;strong&gt;ONE SMALL CLASS, &lt;/strong&gt;we can then copy paste&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;to any XAF project&lt;strong&gt;.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;It is a good idea before starting any work to search the &lt;a href="https://search.devexpress.com/?q=web%20progress%20bar&amp;amp;m=SupportCenter" target="_blank"&gt;Support Center&lt;/a&gt; for ideas and ask the DevExpress support guys. Doing so we found many tickets with ready to work solutions. Some of them are good candidates e.g &lt;a href="https://www.devexpress.com/Support/Center/Question/Details/Q373722/how-to-start-a-long-running-operation-in-asp-net-application-using-the-threadpool" target="_blank"&gt;How to start a long running operation in ASP.NET application using the ThreadPool.QueueUserWorkItem method and show its progress in a browser using a WebService method&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The problem with the previous sample , is that uses a &lt;i&gt;WebService &lt;/i&gt;to periodically call back in a &lt;i&gt;Controller. &lt;/i&gt;I wanted to create a reusable implementation inside a library and a WebService cannot live in a library&lt;i&gt;.&lt;/i&gt;&lt;br /&gt;But I &lt;b&gt;got the idea &lt;/b&gt;on how to proceed&lt;b&gt;.&lt;/b&gt; I just need to create a &lt;i&gt;&lt;b&gt;ViewItem &lt;/b&gt;&lt;/i&gt;to host a &lt;i&gt;&lt;b&gt;ASPxProgressBar &lt;/b&gt;&lt;/i&gt;and with &lt;b&gt;periodic&lt;/b&gt; call-backs I will inject JavaScript code to &lt;b&gt;SetPosition &lt;/b&gt;on the &lt;b&gt;client &lt;/b&gt;side &lt;a href="https://documentation.devexpress.com/AspNet/DevExpress.Web.Scripts.ASPxClientProgressBar.class" target="_blank"&gt;ASPxClientProgressbar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;strong&gt;Step 1&lt;/strong&gt;&lt;/u&gt;&lt;br /&gt;First we need a sample project so let’s use the &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113624/Design-Time-Features/Solution-Wizard" target="_blank"&gt;XAF New Solution Wizard&lt;/a&gt; to create a new Web Project. We do not need any extra modules or security, just create it as simple as possible. After the solution is created add a very simple Domain Object so XAF can generate a web View for it.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;    [DefaultClassOptions]&lt;br /&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; MyObject : BaseObject {&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; MyObject(Session session) : &lt;span class="key"&gt;base&lt;/span&gt;(session) { }&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;u&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&lt;/u&gt;&lt;br /&gt;In addition we&amp;nbsp; need create a sequence of &lt;i&gt;Tasks &lt;/i&gt;that will return the state of our work. You can use any technology you prefer e.g. &lt;i&gt;webservices&lt;/i&gt;, &lt;i&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-parallel-library-tpl" target="_blank"&gt;TPL tasks&lt;/a&gt;&lt;/i&gt;etc. as long as it returns asynchronously it fits our case. For this discussion I will use the &lt;a href="https://msdn.microsoft.com/en-us/library/hh242985(v=vs.103).aspx" target="_blank"&gt;System.Reactive&lt;/a&gt; library. To create the sequence the next line will be enough.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;Observable&lt;br /&gt;    .Interval(TimeSpan.FromMilliseconds(1000))&lt;br /&gt;    .Subscribe(l =&amp;gt;  Console.WriteLine($&lt;span class="str"&gt;"Task {l} completed on Thread:Environment.CurrentManagedThreadId}"&lt;/span&gt;));&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;If you want to test how it behaves add it in a console app and you should see the following output.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://lh3.googleusercontent.com/-FtxiMkuqyFw/W78XB1lG25I/AAAAAAAALNg/GP1m6lBm5n4FR41gqht-3VjMlACQTVmoQCHMYCw/s1600-h/image4"&gt;&lt;img alt="image" border="0" height="206" src="https://lh3.googleusercontent.com/-b3Q1ud9LGSs/W78XC0dTiJI/AAAAAAAALNk/2SZEGmuANK8cfD03g67HeTe3gV9iqPOPwCHMYCw/image_thumb2?imgmax=800" style="background-image: none; border: 0px currentcolor; display: inline;" title="image" width="382" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;u&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/u&gt;&lt;u&gt;&lt;strong&gt;Step 3&lt;/strong&gt;&lt;/u&gt;&lt;br /&gt;In XAF we use &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112621/Concepts/Extend-Functionality/Controllers" target="_blank"&gt;Controllers&lt;/a&gt; to communicate with our &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112611/Concepts/UI-Construction/Views" target="_blank"&gt;Views&lt;/a&gt; so let’s create a very simple &lt;i&gt;Controller &lt;/i&gt;and add our sequence and later connect the progress bar.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; MyController : ViewController&amp;lt;DetailView&amp;gt; {&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; MyController() {&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; action = &lt;span class="key"&gt;new&lt;/span&gt; SimpleAction(&lt;span class="key"&gt;this&lt;/span&gt;, &lt;span class="str"&gt;"StartLongOperation"&lt;/span&gt;, PredefinedCategory.Tools);&lt;br /&gt;            action.Execute += action_Execute;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="key"&gt;void&lt;/span&gt; action_Execute(&lt;span class="key"&gt;object&lt;/span&gt; sender, SimpleActionExecuteEventArgs e) {&lt;br /&gt;            Observable.Interval(TimeSpan.FromMilliseconds(1000)).Subscribe();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class="cscode"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;This controller declares an &lt;em&gt;StartLongOperation&lt;/em&gt; &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112622/Concepts/Extend-Functionality/Actions" target="_blank"&gt;Action&lt;/a&gt; and starts our sequence, exactly as described on &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112622/Concepts/Extend-Functionality/Actions" target="_blank"&gt;XAF docs&lt;/a&gt;.&lt;br /&gt;Currently XAF already generated the web UI and actions. Here how the &lt;em&gt;DetailView&lt;/em&gt; of &lt;em&gt;MyObject&lt;/em&gt; looks like.&lt;br /&gt;&lt;a href="https://lh3.googleusercontent.com/-avty_8dEbaQ/W78XDvTe2xI/AAAAAAAALNo/WkOdTkR1l6wGYz5XSXTr_aaJS5Z_02eQgCHMYCw/s1600-h/image9"&gt;&lt;img alt="image" border="0" height="404" src="https://lh3.googleusercontent.com/-w27sW99fJbQ/W78XEl3SNvI/AAAAAAAALNs/LtxgSXPfRhEjamgIuyAp68j1MsetonaRACHMYCw/image_thumb5?imgmax=800" style="background-image: none; border: 0px currentcolor; display: inline;" title="image" width="1337" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;Step 4&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;Now its time to create the progress bar container. For this scenario we do not need to alter the state of &lt;em&gt;MyObject&lt;/em&gt;&amp;nbsp; so we will follow the XAF docs on how to create a &lt;em&gt;ViewItem&lt;/em&gt; rather than a &lt;em&gt;PropertyEditor&lt;/em&gt;. (&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112641/Task-Based-Help/Views/How-to-Implement-a-View-Item" target="_blank"&gt;How to implement a ViewItem&lt;/a&gt;). Our starting &lt;em&gt;ViewItem&lt;/em&gt; comes next:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;interface&lt;/span&gt; IModelProgressViewItem : IModelViewItem {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [ViewItem(&lt;span class="key"&gt;typeof&lt;/span&gt;(IModelProgressViewItem))]&lt;br /&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; ProgresViewItem : ViewItem {&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; ASPxProgressBar ProgressBar{ &lt;span class="key"&gt;get&lt;/span&gt;; &lt;span class="key"&gt;private&lt;/span&gt; &lt;span class="key"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; ProgresViewItem(IModelProgressViewItem info, Type classType)&lt;br /&gt;            : &lt;span class="key"&gt;base&lt;/span&gt;(classType, info.Id){&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="key"&gt;protected&lt;/span&gt; &lt;span class="key"&gt;override&lt;/span&gt; &lt;span class="key"&gt;object&lt;/span&gt; CreateControlCore() {&lt;br /&gt;            ProgressBar = &lt;span class="key"&gt;new&lt;/span&gt; ASPxProgressBar();&lt;br /&gt;            &lt;span class="key"&gt;return&lt;/span&gt; ProgressBar;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;/code&gt;&lt;/pre&gt;&lt;pre class="cscode"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;We override the &lt;em&gt;CreateControlCore &lt;/em&gt;method and just return an &lt;a href="https://documentation.devexpress.com/AspNet/11024/ASP-NET-WebForms-Controls/Data-Editors/ASPxProgressBar/Overview/ASPxProgressBar-Overview" target="_blank"&gt;ASPxProgressBar &lt;/a&gt;component included in DevExpress suite.&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;Step 5&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;As I mentioned before this sample (&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/Q373722/how-to-start-a-long-running-operation-in-asp-net-application-using-the-threadpool" target="_blank"&gt;How to start a long running operation in ASP.NET application using the ThreadPool.QueueUserWorkItem method and show its progress in a browser using a WebService method&lt;/a&gt;) use a &lt;em&gt;Javascript&amp;nbsp; T&lt;/em&gt;imer to periodically call a &lt;em&gt;WebService &lt;/em&gt;which communicates with a XAF &lt;em&gt;Controller. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Our scenario is very similar but we need to remove the dependency to the &lt;em&gt;WebService&lt;/em&gt; because we need to push the implementation to our &lt;a href="https://github.com/eXpandFramework/eXpand#excelimporter" target="_blank"&gt;ExcelImporter&lt;/a&gt;&lt;em&gt;&lt;/em&gt; module that is part of the &lt;a href="https://github.com/eXpandFramework/" target="_blank"&gt;eXpandFramework&lt;/a&gt; and is very hard to host a &lt;em&gt;WebService&lt;/em&gt; in a library so it can be reusable and with friction-less installation.&lt;br /&gt;&lt;br /&gt;So let’s introduce the &lt;em&gt;Javascript&lt;/em&gt; timer in our &lt;em&gt;ProgressViewItem &lt;/em&gt;and use &lt;em&gt;Callbacks&lt;/em&gt; to notify the server instead of the &lt;em&gt;WebService&lt;/em&gt; used in the SC sample. This is as always well document in the XAF docs (&lt;a href="https://docs.devexpress.com/eXpressAppFramework/119706/task-based-help/miscellaneous-ui-customizations/how-to-raise-xaf-callbacks-from-client-side-events-and-process-these-callbacks-on-server" target="_blank"&gt;How to: Raise XAF Callbacks from Client-Side Events and Process these Callbacks on Server&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;        &lt;span class="key"&gt;private&lt;/span&gt; XafCallbackManager CallbackManager =&amp;gt; ((ICallbackManagerHolder)WebWindow.CurrentRequestPage).CallbackManager;&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;int&lt;/span&gt; PollingInterval{ &lt;span class="key"&gt;get&lt;/span&gt;; &lt;span class="key"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; Start(&lt;span class="key"&gt;int&lt;/span&gt; maximum){&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; script = CallbackManager.GetScript(_handlerId, $&lt;span class="str"&gt;"'{ProgressBar.ClientInstanceName}'"&lt;/span&gt;,&lt;span class="str"&gt;""&lt;/span&gt;,&lt;span class="key"&gt;false&lt;/span&gt;);&lt;br /&gt;            ProgressBar.ClientSideEvents.Init =&lt;br /&gt;                $@&lt;span class="str"&gt;"function(s,e) {{ &lt;br /&gt;                        if(window.timer) window.clearInterval(window.timer);&lt;br /&gt;                        var controlToUpdate = s;&lt;br /&gt;                        window.timer = window.setInterval(function(){{&lt;br /&gt;                        var previous = startProgress;startProgress = function () {{ }}; //this line disables the Loading Panel see Q427477 in SC&lt;br /&gt;                        {script}startProgress = previous;}},&lt;br /&gt;            {PollingInterval});}}"&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;In short the &lt;em&gt;Start &lt;/em&gt;method use the build-in XAF &lt;em&gt;CallBackManager &lt;/em&gt;to generate a script with one parameter the &lt;em&gt;ProgressBar.ClientInstance &lt;/em&gt;name. We pass this parameter because we may want to use multiple progress-bars in the same view. Next the timer calls this script every &lt;em&gt;PollingInterval.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;Whats left is to implement the &lt;a href="https://docs.devexpress.com/eXpressAppFramework/119706/task-based-help/miscellaneous-ui-customizations/how-to-raise-xaf-callbacks-from-client-side-events-and-process-these-callbacks-on-server" target="_blank"&gt;IXafCallbackHandler&lt;/a&gt;&lt;em&gt; &lt;/em&gt;as shown.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;        &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;long&lt;/span&gt; Position{ &lt;span class="key"&gt;get&lt;/span&gt;; &lt;span class="key"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; ProcessAction(&lt;span class="key"&gt;string&lt;/span&gt; parameter){&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; script = $&lt;span class="str"&gt;"{parameter}.SetPosition('{Position}')"&lt;/span&gt;;&lt;br /&gt;            WebWindow.CurrentRequestWindow.RegisterStartupScript(_handlerId,script,&lt;span class="key"&gt;true&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Here we just created a script that uses the client side &lt;a href="https://documentation.devexpress.com/AspNet/11024/ASP-NET-WebForms-Controls/Data-Editors/ASPxProgressBar/Overview/ASPxProgressBar-Overview" target="_blank"&gt;ASPxProgressBar&lt;/a&gt; API to &lt;em&gt;SetPosition &lt;/em&gt;based on the new &lt;em&gt;ProgressViewItem&lt;/em&gt; &lt;em&gt;Position &lt;/em&gt;property.&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Step 6&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;To consume the &lt;em&gt;ProgressViewItem &lt;/em&gt;we modify the &lt;em&gt;MyController &lt;/em&gt;defined in Step 3 like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;        &lt;span class="key"&gt;void&lt;/span&gt; action_Execute(&lt;span class="key"&gt;object&lt;/span&gt; sender, SimpleActionExecuteEventArgs e) {&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; progresViewItem = View.GetItems&amp;lt;ProgresViewItem&amp;gt;().First();&lt;br /&gt;            progresViewItem.Start(maximum:100);&lt;span class="com"&gt;//Start the timer&lt;/span&gt;&lt;br /&gt;            Observable&lt;br /&gt;                .Interval(TimeSpan.FromMilliseconds(1000))&lt;br /&gt;                .Subscribe(l =&amp;gt; progresViewItem.Position=l );&lt;span class="com"&gt;//Update the position for each Task&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;&lt;u&gt;Step 7&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Finally let's add our &lt;i&gt;ProgressViewItem &lt;/i&gt;to the a View. We will use the &lt;a href="https://docs.devexpress.com/eXpressAppFramework/112582/concepts/application-model/model-editor" target="_blank"&gt;Model editor &lt;/a&gt;to create it and drag &amp;amp; drop to the Layout.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-5hQNdT0psMI/W7MlpzqeCuI/AAAAAAAALMs/Q7VdsnrYND4bn7Q12Fo7xgbLm8jYys2BQCLcBGAs/s1600/CreateViewItem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="674" data-original-width="1212" height="177" src="https://4.bp.blogspot.com/-5hQNdT0psMI/W7MlpzqeCuI/AAAAAAAALMs/Q7VdsnrYND4bn7Q12Fo7xgbLm8jYys2BQCLcBGAs/s320/CreateViewItem.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-FH-DQCPDMzA/W7MlwJ77YsI/AAAAAAAALMw/36DDRsMZkXUA-Cne8UNN3s4NLhiATmhWQCLcBGAs/s1600/CreateViewItem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="674" data-original-width="1212" height="177" src="https://3.bp.blogspot.com/-FH-DQCPDMzA/W7MlwJ77YsI/AAAAAAAALMw/36DDRsMZkXUA-Cne8UNN3s4NLhiATmhWQCLcBGAs/s320/CreateViewItem.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Below you can see how the ProgressViewItem works in runtime in our sample solution.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' src='https://www.blogger.com/video.g?token=AD6v5dxncOvfGExTzKLF1ZzOtBFrNiXw76T6fPU3DNxbvIwTgAxY8ozsM3b0xSkD1OyAzTSS9-VRvy1cG1CL79h6MA' class='b-hbp-video b-uploaded' frameborder='0' /&gt;&lt;/div&gt;&lt;br /&gt;I wrote this post as a proof of concept rather than a complete implementation, so I am not posting any samples. However you can download the the complete ProgressViewItem used if&amp;nbsp; you wish from this &lt;a href="https://gist.github.com/apobekiaris/c43264a86d216cdeaf496634012b3570" target="_blank"&gt;gist&lt;/a&gt;.&lt;br /&gt;Below you can verify that it works fine in a real world complex module like the &lt;a href="https://github.com/eXpandFramework/eXpand#excelimporter" target="_blank"&gt;ExcelImporter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' src='https://www.blogger.com/video.g?token=AD6v5dwQEchhExIg_Eri_Ji0fl-hs8rw-8Tfq0-ulhxXs9GgCNueton_Sj4QTb3RELW7XBLa6SQe2fPG0gKsakS1Qw' class='b-hbp-video b-uploaded' frameborder='0' /&gt;&lt;/div&gt;XAF can do Mobile and Windows as well, a Mobile implementation for this scenario does not make much sense but have a look how it looks in the Windows platform.&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dyC0kI4zMWlGbx_dHLDZb5pVyTz7Z1BW1Ywihnmg9AcqViAOSN754qweaF3w7qjqriDipzOmHXGtRxj2F1IIg' class='b-hbp-video b-uploaded' frameborder='0' /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;a href="https://gist.github.com/apobekiaris/c43264a86d216cdeaf496634012b3570" target="_blank"&gt;gist&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=6Zm1uCi8dr4:1EK0vQKoAo4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=6Zm1uCi8dr4:1EK0vQKoAo4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=6Zm1uCi8dr4:1EK0vQKoAo4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=6Zm1uCi8dr4:1EK0vQKoAo4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?i=6Zm1uCi8dr4:1EK0vQKoAo4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <category>Core.Web</category>
      <category>ExcelImporter</category>
      <pubDate>Thu, 11 Oct 2018 10:20:04 GMT</pubDate>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-3509234234245012858.post-3956039727502657945</guid>
      <dc:creator>noreply@blogger.com (Apostolis Bekiaris)</dc:creator>
      <dc:date>2018-10-11T10:20:04Z</dc:date>
    </item>
    <item>
      <title>Scheduled long running tasks with XAF</title>
      <link>http://apobekiaris.blogspot.com/2018/08/scheduled-long-running-tasks-with-xaf.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh3.googleusercontent.com/-mBEjZGX9P1A/W2AWDCz6zqI/AAAAAAAAKiU/y9bPyQgOG9kHZI2p0x5ycWD7Nyi9EgVFgCHMYCw/s72-c/image_thumb%255B3%255D?imgmax=800" height="72" width="72" />
      <description>Today I will detail about implementing Scheduled Long running tasks in an abstract and reusable way. &lt;br /&gt;&lt;br /&gt;&lt;u&gt;The Requirement&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;Usually, in my solution I have business objects that store time depended data e.g. Exceptions, Logs etc. There is a need to periodically clean up those tables. &lt;br /&gt;&lt;br /&gt;&lt;u&gt;The parameters&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;First we need to identify the problem parameters so &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113169/Concepts/Application-Model/Extend-and-Customize-the-Application-Model-in-Code" target="_blank"&gt;we can create a model interface&lt;/a&gt;. Parameterizing the problem in a model interface is very useful, because the end user can switch it off if something goes wrong.&lt;br /&gt;Parameters will be: the business &lt;strong&gt;object type &lt;/strong&gt;which we want to clear its records, the &lt;strong&gt;criterion &lt;/strong&gt;to filter the objects and the &lt;strong&gt;time&lt;/strong&gt; to execute this action. The interface along with its registration for this is bellow.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;&lt;span class="key"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="key"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span class="key"&gt;using&lt;/span&gt; DevExpress.ExpressApp;&lt;br /&gt;&lt;span class="key"&gt;using&lt;/span&gt; DevExpress.ExpressApp.Model;&lt;br /&gt;&lt;span class="key"&gt;using&lt;/span&gt; DevExpress.ExpressApp.Model.Core;&lt;br /&gt;&lt;br /&gt;&lt;span class="key"&gt;namespace&lt;/span&gt; PurgingRule.Module.Controllers{&lt;br /&gt;    &lt;span class="com"&gt;//rules container&lt;/span&gt;&lt;br /&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;interface&lt;/span&gt; IModelClassPurgingRules:IModelClass{&lt;br /&gt;        IModelPurgingRules PurgingRules{ &lt;span class="key"&gt;get&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [ModelNodesGenerator(&lt;span class="key"&gt;typeof&lt;/span&gt; (PurgingRulesModelNodesGenerator))] &lt;br /&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;interface&lt;/span&gt; IModelPurgingRules : IModelNode, IModelList&amp;lt;IModelPurgingRule&amp;gt;{&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;interface&lt;/span&gt; IModelPurgingRule:IModelNode{&lt;br /&gt;        &lt;span class="key"&gt;string&lt;/span&gt; Criteria{ &lt;span class="key"&gt;get&lt;/span&gt;; &lt;span class="key"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span class="key"&gt;bool&lt;/span&gt; ExecuteOnApplicationStart{ &lt;span class="key"&gt;get&lt;/span&gt;; &lt;span class="key"&gt;set&lt;/span&gt;; }&lt;br /&gt;        TimeSpan TimeSpan{ &lt;span class="key"&gt;get&lt;/span&gt;; &lt;span class="key"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [DefaultValue(500)]&lt;br /&gt;        &lt;span class="key"&gt;int&lt;/span&gt; ChunkSize{ &lt;span class="key"&gt;get&lt;/span&gt;; &lt;span class="key"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="com"&gt;//will help us generated more rules if needed&lt;/span&gt;&lt;br /&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; PurgingRulesModelNodesGenerator:ModelNodesGeneratorBase{&lt;br /&gt;        &lt;span class="key"&gt;protected&lt;/span&gt; &lt;span class="key"&gt;override&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; GenerateNodesCore(ModelNode node){&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; PurgingController:Controller,IModelExtender{&lt;br /&gt;&lt;br /&gt;        &lt;span class="com"&gt;//model interface registration&lt;/span&gt;&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; ExtendModelInterfaces(ModelInterfaceExtenders extenders){&lt;br /&gt;            extenders.Add&amp;lt;IModelClass,IModelClassPurgingRules&amp;gt;();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;pre class="cscode"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Now, it is possible to use the Model Editor to configure in which object we want to apply our rules.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://lh3.googleusercontent.com/-V1x40Txipdo/W2AWCHyRijI/AAAAAAAAKiQ/ybVH64MOG7cq5V2aM3JpwI8rm0x4ZlF1gCHMYCw/s1600-h/image%255B8%255D"&gt;&lt;img alt="image" border="0" height="280" src="https://lh3.googleusercontent.com/-mBEjZGX9P1A/W2AWDCz6zqI/AAAAAAAAKiU/y9bPyQgOG9kHZI2p0x5ycWD7Nyi9EgVFgCHMYCw/image_thumb%255B3%255D?imgmax=800" style="background-image: none; border: 0px currentcolor; display: inline;" title="image" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's nice! &lt;br /&gt;&lt;br /&gt;But I like to use an Editor to write the &lt;em&gt;Criteria&lt;/em&gt; and need to add a few more bits for this to happen. For this we need to use the &lt;a href="https://docs.devexpress.com/eXpressAppFramework/113567/concepts/business-model-design/data-types-supported-by-built-in-editors/criteria-properties/criteria-properties-in-domain-components" target="_blank"&gt;CriteriaOptions&lt;/a&gt; and Editor attributes as shown:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;interface&lt;/span&gt; IModelPurgingRule:IModelNode{&lt;br /&gt;        [Editor(&lt;span class="str"&gt;"DevExpress.ExpressApp.Win.Core.ModelEditor.CriteriaModelEditorControl, DevExpress.ExpressApp.Win"&lt;/span&gt; + XafAssemblyInfo.VersionSuffix + XafAssemblyInfo.AssemblyNamePostfix, &lt;span class="key"&gt;typeof&lt;/span&gt;(UITypeEditor))]&lt;br /&gt;        [CriteriaOptions(&lt;span class="str"&gt;"TypeInfo"&lt;/span&gt;)]&lt;br /&gt;        &lt;span class="key"&gt;string&lt;/span&gt; Criteria{ &lt;span class="key"&gt;get&lt;/span&gt;; &lt;span class="key"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [Browsable(&lt;span class="key"&gt;false&lt;/span&gt;)]&lt;br /&gt;        [ModelValueCalculator(&lt;span class="str"&gt;"((IModelClass) Parent.Parent).TypeInfo"&lt;/span&gt;)]&lt;br /&gt;        ITypeInfo TypeInfo { &lt;span class="key"&gt;get&lt;/span&gt;; }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Now it should be straight forward to construct any criterion with the help of this build-in editor.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://lh3.googleusercontent.com/-Z62mW5Kas1k/W2Bspm98cPI/AAAAAAAAKkA/JPSkEIDuITYCIzY7JxpGWuCkT3jVpAb_gCHMYCw/s1600-h/image%255B13%255D"&gt;&lt;img alt="image" border="0" height="336" src="https://lh3.googleusercontent.com/-Tqn5WPd98u0/W2Bsq6tJPsI/AAAAAAAAKkE/afNXKCaiYFQuPSy62BlGjHkYem1Rg4lCwCHMYCw/image_thumb%255B6%255D?imgmax=800" style="background-image: none; border: 0px currentcolor; display: inline;" title="image" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;u&gt;Making Thread Safe Database calls&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;Working in a multi threaded environment (long running tasks) is build-in in XAF's XPO ORM so we go for it. Just make sure you enable the switch as bellow.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;        &lt;span class="key"&gt;protected&lt;/span&gt; &lt;span class="key"&gt;override&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; CreateDefaultObjectSpaceProvider(CreateCustomObjectSpaceProviderEventArgs args) {&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; threadSafe = true &lt;span class="com"&gt;//enable threadsafe;&lt;/span&gt;&lt;br /&gt;            args.ObjectSpaceProviders.Add(&lt;span class="key"&gt;new&lt;/span&gt; XPObjectSpaceProvider(XPObjectSpaceProvider.GetDataStoreProvider(args.ConnectionString, args.Connection, &lt;span class="key"&gt;true&lt;/span&gt;), threadSafe));&lt;br /&gt;            args.ObjectSpaceProviders.Add(&lt;span class="key"&gt;new&lt;/span&gt; NonPersistentObjectSpaceProvider(TypesInfo, &lt;span class="key"&gt;null&lt;/span&gt;));&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class="cscode"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;u&gt;Scheduling the long running tasks&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;We will use the &lt;a href="https://github.com/expand/eXpand/blob/c40e4f571fbfd29af4321c60d7fa7cfc599a5474/Xpand/Xpand.Utils/Threading/TaskExtensions.cs#L38-L60" target="_blank"&gt;StartNewPeriodic&lt;/a&gt; extension method and will follow the next steps in our code.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Execute once at application startup .&lt;/li&gt;&lt;li&gt;Collect the model rules to execute.&lt;/li&gt;&lt;li&gt;Calculate the next execution time. For this we need to store the last execution time so I used the &lt;em&gt;RuleScheduleStorage&lt;/em&gt; BO class found at the end of the next snippet&lt;/li&gt;&lt;li&gt;Periodically schedule parallel calls to the PurgeObjects method for each rule.&lt;/li&gt;&lt;/ol&gt;&lt;ol&gt;&lt;/ol&gt;&lt;pre class="cscode"&gt;&lt;code&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; PurgingController:Controller,IModelExtender{&lt;br /&gt;        &lt;span class="key"&gt;protected&lt;/span&gt; &lt;span class="key"&gt;override&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; OnFrameAssigned(){&lt;br /&gt;            &lt;span class="key"&gt;base&lt;/span&gt;.OnFrameAssigned();&lt;br /&gt;            &lt;span class="com"&gt;//1.execute once at application startup .&lt;/span&gt;&lt;br /&gt;            &lt;span class="key"&gt;if&lt;/span&gt; (Frame.Context == TemplateContext.ApplicationWindow){&lt;br /&gt;                &lt;span class="com"&gt;//2.collect the model rules to execute.&lt;/span&gt;&lt;br /&gt;                &lt;span class="key"&gt;var&lt;/span&gt; purgingRules = Application.Model.BOModel.Cast&amp;lt;IModelClassPurgingRules&amp;gt;().SelectMany(rules =&amp;gt; rules.PurgingRules ).ToArray();&lt;br /&gt;                IEnumerable&amp;lt;(IModelPurgingRule rule, DateTime executed)&amp;gt; ruleExecutionTimes;&lt;br /&gt;                &lt;span class="com"&gt;//create an objectspace to query the last execution time from the database&lt;/span&gt;&lt;br /&gt;                &lt;span class="key"&gt;using&lt;/span&gt; (&lt;span class="key"&gt;var&lt;/span&gt; objectSpace = Application.CreateObjectSpace(typeof(RuleScheduleStorage))){&lt;br /&gt;&lt;br /&gt;                    DeleteObsoleteRules(objectSpace, purgingRules);&lt;br /&gt;                    &lt;span class="key"&gt;var&lt;/span&gt; rulesToSchedule = purgingRules.Where(rule =&amp;gt;rule.Interval!=TimeSpan.MinValue);&lt;br /&gt;                    &lt;span class="com"&gt;//get an enumerable of (IModelPurgingRule rule, DateTime executed)&lt;/span&gt;&lt;br /&gt;                    ruleExecutionTimes = CalculateExecutionTimes(rulesToSchedule, objectSpace);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                &lt;span class="key"&gt;foreach&lt;/span&gt; (&lt;span class="key"&gt;var&lt;/span&gt; ruleExecutionTime &lt;span class="key"&gt;in&lt;/span&gt; ruleExecutionTimes){&lt;br /&gt;                    &lt;span class="key"&gt;var&lt;/span&gt; timeSinceLastExecution = DateTime.Now.Subtract(ruleExecutionTime.executed);&lt;br /&gt;                    &lt;span class="com"&gt;//calculate if periodic task should start with a delay based time passed since last execution&lt;/span&gt;&lt;br /&gt;                    &lt;span class="key"&gt;int&lt;/span&gt; delay=timeSinceLastExecution&amp;lt;ruleExecutionTime.rule.Interval?(&lt;span class="key"&gt;int&lt;/span&gt;) ruleExecutionTime.rule.Interval.Subtract(timeSinceLastExecution).TotalMilliseconds:0;&lt;br /&gt;                    &lt;span class="com"&gt;//starts the task periodically&lt;/span&gt;&lt;br /&gt;                    Task.Factory.StartNewPeriodic(() =&amp;gt; PurgeObjects(ruleExecutionTime.rule),&lt;br /&gt;                        interval: (&lt;span class="key"&gt;int&lt;/span&gt;) ruleExecutionTime.rule.Interval.TotalMilliseconds, delay: delay);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="key"&gt;private&lt;/span&gt; &lt;span class="key"&gt;static&lt;/span&gt; IEnumerable&amp;lt;(IModelPurgingRule rule, DateTime executed)&amp;gt; CalculateExecutionTimes(IEnumerable&amp;lt;IModelPurgingRule&amp;gt; rulesToSchedule, IObjectSpace objectSpace){&lt;br /&gt;            &lt;span class="key"&gt;return&lt;/span&gt; rulesToSchedule.Select(rule =&amp;gt; {&lt;br /&gt;                &lt;span class="key"&gt;var&lt;/span&gt; ruleScheduleStorage = objectSpace.GetObjectsQuery&amp;lt;RuleScheduleStorage&amp;gt;()&lt;br /&gt;                                              .FirstOrDefault(storage =&amp;gt;storage.RuleScheduleType == RuleScheduleType.Purging &amp;amp;&amp;amp; storage.RuleId ==((ModelNode) rule).Id);&lt;br /&gt;                &lt;span class="key"&gt;return&lt;/span&gt; (rule:rule,executed:ruleScheduleStorage?.Executed ?? DateTime.MinValue);&lt;br /&gt;            });&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="key"&gt;private&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; DeleteObsoleteRules(IObjectSpace objectSpace, IModelPurgingRule[] purgingRules){&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; ids = purgingRules.Cast&amp;lt;ModelNode&amp;gt;().Select(node =&amp;gt; node.Id).ToArray();&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; rulesToDelete = objectSpace.GetObjectsQuery&amp;lt;RuleScheduleStorage&amp;gt;().Where(storage =&amp;gt;&lt;br /&gt;                storage.RuleScheduleType == RuleScheduleType.Purging &amp;amp;&amp;amp; !ids.Contains(storage.RuleId)).ToArray();&lt;br /&gt;            objectSpace.Delete(rulesToDelete);&lt;br /&gt;            objectSpace.CommitChanges();&lt;br /&gt;        }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;You might wonder why I inherit from a controller and used the OnFrameAssigned method as start signal and not simply write my code at &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/DevExpress.ExpressApp.XafApplication.SetupComplete.event" target="_blank"&gt;Application.SetupComplete.Event&lt;/a&gt;. The reason for this is that I like to keep my implementation in separate files and not pollute the Module.cs.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;The Long Running PurgeObjects method:&lt;/u&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt; Stores last execution time in the database.&lt;/li&gt;&lt;li&gt;Deletes filtered objects in chunks.&lt;/li&gt;&lt;/ol&gt;&lt;pre class="cscode"&gt;&lt;code&gt;        &lt;span class="key"&gt;private&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; PurgeObjects(IModelPurgingRule purgingRule){&lt;br /&gt;            &lt;span class="key"&gt;try&lt;/span&gt;{&lt;br /&gt;                Tracing.Tracer.LogVerboseText($&lt;span class="str"&gt;"Purging {purgingRule}"&lt;/span&gt;);&lt;br /&gt;                &lt;span class="key"&gt;var&lt;/span&gt; objectsCount = 0;&lt;br /&gt;                &lt;span class="key"&gt;using&lt;/span&gt; (&lt;span class="key"&gt;var&lt;/span&gt; objectSpace = Application.CreateObjectSpace(purgingRule.TypeInfo.Type)){&lt;br /&gt;                    StoreExecutionTime(purgingRule, objectSpace);&lt;br /&gt;                    &lt;span class="key"&gt;var&lt;/span&gt; criteriaOperator = objectSpace.ParseCriteria(purgingRule.Criteria);&lt;br /&gt;                    &lt;span class="key"&gt;var&lt;/span&gt; objects = objectSpace.GetObjects(purgingRule.TypeInfo.Type, criteriaOperator);&lt;br /&gt;                    objectSpace.SetTopReturnedObjectsCount(objects, purgingRule.ChunkSize);&lt;br /&gt;                    &lt;span class="key"&gt;while&lt;/span&gt; (objects.Count &amp;gt; 0){&lt;br /&gt;                        objectsCount += objects.Count;&lt;br /&gt;                        objectSpace.Delete(objects);&lt;br /&gt;                        objectSpace.CommitChanges();&lt;br /&gt;                        objectSpace.ReloadCollection(objects);&lt;br /&gt;                    }                    &lt;br /&gt;                }&lt;br /&gt;                Tracing.Tracer.LogVerboseText($&lt;span class="str"&gt;"Purged {purgingRule}-{objectsCount}"&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="key"&gt;catch&lt;/span&gt; (Exception e){&lt;br /&gt;                Tracing.Tracer.LogError(e);&lt;br /&gt;            }&lt;br /&gt;        }&lt;/code&gt;&lt;/pre&gt;&lt;pre class="cscode"&gt;&lt;code&gt;        &lt;span class="key"&gt;private&lt;/span&gt; &lt;span class="key"&gt;static&lt;/span&gt; &lt;span class="key"&gt;void&lt;/span&gt; StoreExecutionTime(IModelPurgingRule purgingRule, IObjectSpace objectSpace){&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; ruleId = ((ModelNode) purgingRule).Id;&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; ruleScheduleStorage =objectSpace.GetObjectsQuery&amp;lt;RuleScheduleStorage&amp;gt;().FirstOrDefault(storage =&amp;gt;&lt;br /&gt;                    storage.RuleScheduleType == RuleScheduleType.Purging &amp;amp;&amp;amp; storage.RuleId == ruleId) ?? objectSpace.CreateObject&amp;lt;RuleScheduleStorage&amp;gt;();&lt;br /&gt;            ruleScheduleStorage.RuleScheduleType = RuleScheduleType.Purging;&lt;br /&gt;            ruleScheduleStorage.RuleId = ((ModelNode) purgingRule).Id;&lt;br /&gt;            ruleScheduleStorage.Executed = DateTime.Now;&lt;br /&gt;            objectSpace.CommitChanges();&lt;br /&gt;        }&lt;/code&gt;&lt;/pre&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;u&gt;Last minute feature&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;I am happy with the &lt;em&gt;PurgingRules&lt;/em&gt;, but I would be more happy if I could invalidate them based on a &lt;em&gt;CSharp&lt;/em&gt; expression. For example I want to have some rules on my dev machine only.&lt;br /&gt;The &lt;em&gt;PurgingRules&lt;/em&gt; already have a criterion so we could &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113480/Concepts/Filtering/Custom-Function-Criteria-Operators" target="_blank"&gt;create a Custom Function&lt;/a&gt; to evaluate &lt;em&gt;CSharp&lt;/em&gt; expressions.&lt;br /&gt;I want to use this code in eXpandFramework which there is a &amp;lt;=.NET4 dependency so for evaluating CSharp expressions I chose compile on the fly + caching the from&lt;em&gt; &lt;a href="https://github.com/expand/eXpand/blob/626117d23a03e078369901c6482ac3e0ce71c955/Xpand/Xpand.Persistent/Xpand.Persistent.Base/General/CustomFunctions/EvaluateExpressionOperator.cs#L32-L41" target="_blank"&gt;ExpressionEvaluator.Eval&lt;/a&gt; &lt;/em&gt;method.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cscode"&gt;&lt;code&gt;    &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;class&lt;/span&gt; EvaluateExpressionOperator:ICustomFunctionOperator{&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; List&amp;lt;&lt;span class="key"&gt;string&lt;/span&gt;&amp;gt; Usings=&lt;span class="key"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="key"&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;const&lt;/span&gt; &lt;span class="key"&gt;string&lt;/span&gt; OperatorName = &lt;span class="str"&gt;"EvaluateExpression"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;static&lt;/span&gt; EvaluateExpressionOperator Instance{ &lt;span class="key"&gt;get&lt;/span&gt;; } = &lt;span class="key"&gt;new&lt;/span&gt; EvaluateExpressionOperator();&lt;br /&gt;&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; Type ResultType(&lt;span class="key"&gt;params&lt;/span&gt; Type[] operands){&lt;br /&gt;            &lt;span class="key"&gt;return&lt;/span&gt; &lt;span class="key"&gt;typeof&lt;/span&gt;(&lt;span class="key"&gt;object&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;object&lt;/span&gt; Evaluate(&lt;span class="key"&gt;params&lt;/span&gt; &lt;span class="key"&gt;object&lt;/span&gt;[] operands){&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; csCode = &lt;span class="key"&gt;string&lt;/span&gt;.Join(&lt;span class="str"&gt;""&lt;/span&gt;,operands);&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; usings = &lt;span class="key"&gt;string&lt;/span&gt;.Join(Environment.NewLine,Usings);&lt;br /&gt;            &lt;span class="key"&gt;var&lt;/span&gt; eval = ExpressionEvaluator.Eval(csCode, usings);&lt;br /&gt;            &lt;span class="key"&gt;return&lt;/span&gt; eval;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="key"&gt;public&lt;/span&gt; &lt;span class="key"&gt;string&lt;/span&gt; Name =&amp;gt; OperatorName;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class="cscode"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;a href="https://lh3.googleusercontent.com/-5DnJIOZmo8M/W2BsrmLiI3I/AAAAAAAAKkI/zYnt_VPyzpAWrOYqoifPsIkZY6Tnxq1zACHMYCw/s1600-h/image%255B18%255D"&gt;&lt;img alt="image" border="0" height="219" src="https://lh3.googleusercontent.com/-BcSziFaHq1g/W2Bss4mRggI/AAAAAAAAKkM/SNhp6A6EKjQE_NDHl6m-LByw-SsGe2hzACHMYCw/image_thumb%255B9%255D?imgmax=800" style="background-image: none; border: 0px currentcolor; display: inline;" title="image" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Working with such rich libraries like &lt;a href="https://www.devexpress.com/products/net/application_framework/" target="_blank"&gt;DevExpress XAF suite&lt;/a&gt; you make serious stuff in no time!&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=OjSuiU6EZPE:LDBp9yd4oVA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=OjSuiU6EZPE:LDBp9yd4oVA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=OjSuiU6EZPE:LDBp9yd4oVA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AbekiarisBlog?a=OjSuiU6EZPE:LDBp9yd4oVA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AbekiarisBlog?i=OjSuiU6EZPE:LDBp9yd4oVA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <category>Core.Web</category>
      <category>Core.Win</category>
      <pubDate>Mon, 20 Aug 2018 13:45:59 GMT</pubDate>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-3509234234245012858.post-3390693729814786009</guid>
      <dc:creator>noreply@blogger.com (Apostolis Bekiaris)</dc:creator>
      <dc:date>2018-08-20T13:45:59Z</dc:date>
    </item>
    <item>
      <title>ATTENTION !!!  This personal blog no longer gets new posts</title>
      <link>https://dennisgaravsky.blogspot.com/2018/06/winforms-v1813-beware-of.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-Ua-ubzSeFcY/VnrU3pX4QkI/AAAAAAAAAtw/HRjJ0pgOGo0_5_PxxKhZiLnYraiJWEy8QCPcBGAYYCw/s72-c/5000576310_63351104a8.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: #6aa84f; font-size: large;"&gt;&lt;b&gt;Please follow the official&amp;nbsp;&lt;a href="https://community.devexpress.com/blogs/xaf/default.aspx" target="_blank"&gt;XAF Team&lt;/a&gt; and &lt;a href="https://community.devexpress.com/blogs/xpo/default.aspx" target="_blank"&gt;XPO Team&lt;/a&gt; blogs, which are regularly updated by me and other DevExpress members. &lt;br /&gt;Thanks, Dennis.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;------------------------------------------&lt;br /&gt;In XAF, users of the Model Editor and Report Designer tools are likely to be affected by this issue. Well, advanced users who enabled the&amp;nbsp;&lt;a href="https://documentation.devexpress.com/WindowsForms/DevExpress.XtraLayout.OptionsCustomizationForm.ShowPropertyGrid.property"&gt;ShowPropertyGrid&lt;/a&gt;&amp;nbsp;property in the layout control or made custom&amp;nbsp;&lt;a href="https://documentation.devexpress.com/WindowsForms/DevExpress.XtraVerticalGrid.PropertyGridControl.class"&gt;PropertyGridControl&lt;/a&gt;&amp;nbsp;integrations may be affected too - at least we all know a few&#x1f609;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Our XtraVerticalGrid developers are aware of this problem and have already fixed it in &lt;b&gt;v18.1.4 &lt;/b&gt;(it should be out in 1.5-2 weeks). In the meantime, the hotfix is already available for download at&amp;nbsp;&lt;span style="background-color: white;"&gt;&lt;a data-ticket="T638535" href="https://www.devexpress.com/Support/Center/Question/Details/T638535/propertygridcontrol-the-nullreferenceexception-is-thrown-when-scrolling-and-an-editor-is"&gt;T638535: PropertyGridControl - The NullReferenceException is thrown when scrolling and an editor is active&lt;/a&gt;.&lt;/span&gt; Please accept sincerely apologies from our XAF, XtraReports and XtraVerticalGrid teams for all the inconvenience here.&lt;/div&gt;&lt;br /&gt;Here is the error callstack for your reference:&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif;"&gt;&lt;i&gt;&lt;span style="font-size: xx-small;"&gt;System.NullReferenceException at &lt;b&gt;DevExpress.XtraVerticalGrid.PGEditingState.MouseWheel(&lt;/b&gt;DevExpress.Utils.MouseWheelScrollClientArgs) at DevExpress.XtraVerticalGrid.BaseHandler.DevExpress.Utils.IMouseWheelScrollClient.OnMouseWheel(DevExpress.Utils.MouseWheelScrollClientArgs) at DevExpress.Utils.MouseWheelScrollHelper.OnScrollLine(DevExpress.Utils.DXMouseEventArgs, Int32, Boolean) at DevExpress.Utils.MouseWheelScrollHelper.OnMouseWheel(System.Windows.Forms.MouseEventArgs) at DevExpress.XtraVerticalGrid.BaseHandler.OnMouseWheel(System.Windows.Forms.MouseEventArgs) at DevExpress.XtraVerticalGrid.VGridControlBase.OnMouseWheelCore(System.Windows.Forms.MouseEventArgs) at DevExpress.XtraEditors.Container.EditorContainer.OnMouseWheel(System.Windows.Forms.MouseEventArgs) at System.Windows.Forms.Control.WmMouseWheel(System.Windows.Forms.Message ByRef) at System.Windows.Forms.Control.WndProc(System.Windows.Forms.Message ByRef) at DevExpress.XtraEditors.Container.EditorContainer.WndProc(System.Windows.Forms.Message ByRef) at DevExpress.XtraVerticalGrid.VGridControlBase.WndProc(System.Windows.Forms.Message ByRef) at System.Windows.Forms.Control+ControlNativeWindow.OnMessage(System.Windows.Forms.Message ByRef) at System.Windows.Forms.Control+ControlNativeWindow.WndProc(System.Windows.Forms.Message ByRef) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr, Int32, IntPtr, IntPtr)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: white; color: #333333; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;Tip 1: &lt;/strong&gt;The&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/A948/how-to-obtain-a-design-time-exception-call-stack"&gt;How to obtain a design-time exception call stack&lt;/a&gt;&amp;nbsp;KB article describes how to locate these important error details, especially if your Visual Studio crashed. This information is helpful when submitting to support. BTW, to improve your chances of getting a faster and helpful answer from support, check these related tips as well:&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&amp;nbsp; &amp;nbsp;&lt;a href="https://stackoverflow.com/help/how-to-ask"&gt;How do I ask a good question?&lt;/a&gt;&amp;nbsp;(StackOverFlow)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;a href="https://www.chiark.greenend.org.uk/~sgtatham/bugs.html"&gt;How to Report Bugs Effectively&lt;/a&gt;&amp;nbsp;(Simon Tatham)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;a href="https://community.devexpress.com/blogs/ctodx/archive/2009/01/08/a-request-for-simple-example-programs.aspx"&gt;A request for simple example programs&lt;/a&gt;&amp;nbsp;(Julian Bucknall)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/117344/Concepts/Debugging-and-Error-Handling/Collect-and-Analyze-the-Diagnostic-Information"&gt;Collect and Analyze the Diagnostic Information&lt;/a&gt;&amp;nbsp;(XAF documentation)&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Tip 2:&lt;/strong&gt;&amp;nbsp;When you located the call stack information and determined from it that an exception is raised from DevExpress code, I recommend you search for one or several topmost call stack method names in our support database. This behavior might be reported by someone else, e.g.:&amp;nbsp;&lt;a href="https://www.google.com/search?q=PGEditingState.MouseWheel"&gt;https://www.google.com/search?q=PGEditingState.MouseWheel&lt;/a&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-Ua-ubzSeFcY/VnrU3pX4QkI/AAAAAAAAAtw/HRjJ0pgOGo0_5_PxxKhZiLnYraiJWEy8QCPcBGAYYCw/s1600/5000576310_63351104a8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="FreeImages.com" border="0" data-original-height="360" data-original-width="480" height="300" src="https://2.bp.blogspot.com/-Ua-ubzSeFcY/VnrU3pX4QkI/AAAAAAAAAtw/HRjJ0pgOGo0_5_PxxKhZiLnYraiJWEy8QCPcBGAYYCw/s400/5000576310_63351104a8.jpg" title="FreeImages.com" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="background-color: white; color: #333333; font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">18.1.3</category>
      <category domain="http://www.blogger.com/atom/ns#">beware</category>
      <category domain="http://www.blogger.com/atom/ns#">bug</category>
      <category domain="http://www.blogger.com/atom/ns#">issue</category>
      <category domain="http://www.blogger.com/atom/ns#">Model Editor</category>
      <category domain="http://www.blogger.com/atom/ns#">property grid</category>
      <category domain="http://www.blogger.com/atom/ns#">Report Designer</category>
      <category domain="http://www.blogger.com/atom/ns#">WinForms</category>
      <pubDate>Sat, 09 Jun 2018 08:57:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-9181296515101237769</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-06-09T08:57:00Z</dc:date>
    </item>
    <item>
      <title>Concurrent Record Updates Merging in XPO-based XAF ASP.NET apps (v18.1)</title>
      <link>https://dennisgaravsky.blogspot.com/2018/06/concurrent-record-updates-merging-in.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-SW_s8do4ceA/WxD2kOFjOgI/AAAAAAAAIoI/bzVQsRC8sOEL0AykG5Z797fiMTG9N47jgCLcBGAs/s72-c/concurrencymergeweb.PNG" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;From the&amp;nbsp;&lt;a href="https://docs.devexpress.com/eXpressAppFramework/113596/concepts/business-model-design/business-model-design-with-xpo/optimistic-concurrency-control?tabs=tabid-csharp" style="background-color: yellow;"&gt;Optimistic Concurrency Control&lt;/a&gt;&amp;nbsp;help topic:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;"In multi-user data-aware applications, there are times when one user edits a record while another user is editing the same record. As long as the changes being made do not affect the same field (e.g., one user modifies the task description while another user attaches a file), XAF applications can resolve the situation, and merge simultaneous changes made by different users. To enable field-level locking, set the&amp;nbsp;&lt;a href="https://docs.devexpress.com/CoreLibraries/DevExpress.Xpo.XpoDefault.TrackPropertiesModifications" style="background-color: yellow;"&gt;XpoDefault.TrackPropertiesModifications&lt;/a&gt;&amp;nbsp;static property to&amp;nbsp;&lt;strong&gt;true&lt;/strong&gt;."&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Previously, this feature was available only for WinForms apps. With &lt;b&gt;v18.1&lt;/b&gt;, ASP.NET WebForms XAF applications can handle concurrent record updates by merging simultaneous changes (by two or more different users) as well:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-SW_s8do4ceA/WxD2kOFjOgI/AAAAAAAAIoI/bzVQsRC8sOEL0AykG5Z797fiMTG9N47jgCLcBGAs/s1600/concurrencymergeweb.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="304" data-original-width="627" height="193" src="https://4.bp.blogspot.com/-SW_s8do4ceA/WxD2kOFjOgI/AAAAAAAAIoI/bzVQsRC8sOEL0AykG5Z797fiMTG9N47jgCLcBGAs/s400/concurrencymergeweb.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="text-align: center;"&gt;Here is also a video from our MainDemo.Web app (run from the Demo Center):&lt;/span&gt;&lt;br /&gt;&lt;span style="text-align: center;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-fV3ZgPfk_gM/WxEMORY7hVI/AAAAAAAAIoU/0MU3kha1r6ke1JyfpogVd_ecfY9ILhWqACLcBGAs/s1600/2018-06-01_12-02-01.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="939" data-original-width="726" height="400" src="https://1.bp.blogspot.com/-fV3ZgPfk_gM/WxEMORY7hVI/AAAAAAAAIoU/0MU3kha1r6ke1JyfpogVd_ecfY9ILhWqACLcBGAs/s400/2018-06-01_12-02-01.gif" width="308" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="text-align: center;"&gt;Notice that two different users can edit different properties (e.g., NickName and SpouseName) and then merge&amp;nbsp; these non-conflicting changes.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="text-align: center;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Have you already enabled this feature in your XAF Web apps? Please let us know how this works for you.&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">18.1</category>
      <category domain="http://www.blogger.com/atom/ns#">asp.net</category>
      <category domain="http://www.blogger.com/atom/ns#">concurrency</category>
      <category domain="http://www.blogger.com/atom/ns#">CRUD</category>
      <category domain="http://www.blogger.com/atom/ns#">usability</category>
      <category domain="http://www.blogger.com/atom/ns#">web</category>
      <pubDate>Fri, 01 Jun 2018 09:08:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-5392533759821251326</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-06-01T09:08:00Z</dc:date>
    </item>
    <item>
      <title>How to access and manipulate a custom ASP.NET user control from a Controller in a Module project</title>
      <link>https://dennisgaravsky.blogspot.com/2018/06/how-to-access-and-manipulate-custom.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-F5JuyoAjifM/WxDzxtindpI/AAAAAAAAIn8/lyYvw2NaJW85ROn04gfFKcBi3VdJbPg6wCLcBGAs/s72-c/databoundcontrolweb_new_interface.png" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;We have updated our&amp;nbsp;&lt;a href="https://docs.devexpress.com/eXpressAppFramework/114160/task-based-help/views/how-to-show-a-custom-data-bound-control-in-an-xaf-view-asp.net" style="background-color: yellow;"&gt;How to: Show a Custom Data-Bound Control in an XAF View (ASP.NET)&lt;/a&gt;&amp;nbsp;tutorial with more information on how to pass external data to custom &lt;a href="https://msdn.microsoft.com/en-us/library/y6wb1a0e.aspx"&gt;Web user controls&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Previously, our customers had the following difficulties with this task:&lt;/div&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;- In which project to create web user controls. By default, ASP.NET suggests doing this in the&amp;nbsp;&lt;em&gt;YourSolution.Web&lt;/em&gt;&amp;nbsp;project. Adding an *.ASCX control into the &lt;i&gt;YourSolutionName.Module&lt;/i&gt;.Web project led to errors.&lt;/div&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;- How to deal with circular references when attempting to reference the&amp;nbsp;&lt;em&gt;YourSolution.Web&lt;/em&gt;&amp;nbsp;project from a Controller defined in the&amp;nbsp;&lt;em&gt;YourSolutionName.Module.Web&lt;/em&gt;&amp;nbsp;project.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- How to pass an IObjectSpace, XafApplication or current View object to a custom user control.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A common way to resolve such a dependency (unrelated to XAF itself) is to define an interface within your class library (a XAF module project) and implement it by using your custom user control.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-F5JuyoAjifM/WxDzxtindpI/AAAAAAAAIn8/lyYvw2NaJW85ROn04gfFKcBi3VdJbPg6wCLcBGAs/s1600/databoundcontrolweb_new_interface.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="463" data-original-width="806" height="227" src="https://1.bp.blogspot.com/-F5JuyoAjifM/WxDzxtindpI/AAAAAAAAIn8/lyYvw2NaJW85ROn04gfFKcBi3VdJbPg6wCLcBGAs/s400/databoundcontrolweb_new_interface.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">asp.net</category>
      <category domain="http://www.blogger.com/atom/ns#">control</category>
      <category domain="http://www.blogger.com/atom/ns#">controllers</category>
      <category domain="http://www.blogger.com/atom/ns#">custom</category>
      <category domain="http://www.blogger.com/atom/ns#">customization</category>
      <category domain="http://www.blogger.com/atom/ns#">extend</category>
      <category domain="http://www.blogger.com/atom/ns#">ViewController</category>
      <category domain="http://www.blogger.com/atom/ns#">ViewItem</category>
      <category domain="http://www.blogger.com/atom/ns#">web</category>
      <pubDate>Fri, 01 Jun 2018 07:22:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-6525701035662418723</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-06-01T07:22:00Z</dc:date>
    </item>
    <item>
      <title>WinForms - How to manage long text in DocumentManager tabs</title>
      <link>https://dennisgaravsky.blogspot.com/2018/05/winforms-how-to-manage-long-text-in.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-9g9wiHQo93M/Ww_5qvwQA8I/AAAAAAAAInw/RDnxAUNQXrUG3zdwmEOcS_3GDcLyN3LWgCLcBGAs/s72-c/LongTabText.png" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;Please check out the &lt;b&gt;Problem&lt;/b&gt; and&amp;nbsp;&lt;strong&gt;Solutions&lt;/strong&gt;&amp;nbsp;sections in the&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T629226/winforms-long-text-is-cut-off-in-documentmanager-tabs" style="background-color: yellow;"&gt;T629226: WinForms - Long text is cut off in DocumentManager tabs&lt;/a&gt;&amp;nbsp;ticket.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;We are going to improve this in the upcoming v18.1+. Our designer's favorite is #2, but we cannot implement it in a minor version due to a breaking change. BTW, option #1 shown in the screenshot below also looks fine. Take note of solution #3 as well - you can customize this behavior without writing any code.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Please let me know what option you prefer or if you are handling it differently. Thanks.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;BTW, have you modernized your XAF WinForms apps &lt;a href="https://www.devexpress.com/go/XAF_Try_SVG_Support_v18.1.aspx"&gt;using SVG icons&lt;/a&gt;&amp;nbsp;and &lt;a href="https://docs.devexpress.com/eXpressAppFramework/DevExpress.ExpressApp.Win.WinApplication.UseLightStyle?tabs=tabid-csharp"&gt;Light Style&lt;/a&gt;&amp;nbsp;in v18.1? Click the screenshot below to see the new look &amp;amp; feel. Do you like it?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-9g9wiHQo93M/Ww_5qvwQA8I/AAAAAAAAInw/RDnxAUNQXrUG3zdwmEOcS_3GDcLyN3LWgCLcBGAs/s1600/LongTabText.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="630" data-original-width="1200" height="210" src="https://3.bp.blogspot.com/-9g9wiHQo93M/Ww_5qvwQA8I/AAAAAAAAInw/RDnxAUNQXrUG3zdwmEOcS_3GDcLyN3LWgCLcBGAs/s400/LongTabText.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">feedback</category>
      <category domain="http://www.blogger.com/atom/ns#">Tabbed MDI</category>
      <category domain="http://www.blogger.com/atom/ns#">usability</category>
      <category domain="http://www.blogger.com/atom/ns#">UX</category>
      <category domain="http://www.blogger.com/atom/ns#">WinForms</category>
      <pubDate>Thu, 31 May 2018 13:40:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-5979064229528096311</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-05-31T13:40:00Z</dc:date>
    </item>
    <item>
      <title>Web - How to avoid issues with data-bound controls due to missing or non-unique key values</title>
      <link>https://dennisgaravsky.blogspot.com/2018/05/web-how-to-avoid-issues-with-data-bound.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-cUuXd6g0cCQ/V4gGNRxLNGI/AAAAAAAAA5s/5MbqVOYhNzI6w9GrrTKSLG76qwhACBnRQCPcBGAYYCw/s72-c/pins-1311988.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Check out the&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T639653/web-how-to-avoid-issues-with-data-bound-controls-due-to-missing-or-non-unique-key-values" style="background-color: yellow;"&gt;Web - How to avoid issues with data-bound controls due to missing or non-unique key values&lt;/a&gt;&amp;nbsp;KB article to make sure that your business model is aligned with the best practices. Here is a short extract:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;strong&gt;Symptoms&lt;/strong&gt;&lt;/i&gt;&lt;/div&gt;&lt;i&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;You may notice the following side-effects in a Web ListView while it may work fine in WinForms:&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;- A wrong DetailView may be selected when an unsaved record is clicked in ListView;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;- ListView may have no selection column;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;- In inline edit or batch mode, all records may become selected or editable.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;These effects are especially frequent in a non-persistent class ListView or a nested ListView for an aggregated details collection with newly added or unsaved records.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: bold; text-align: justify;"&gt;&lt;i&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;All new records added to the ListView and not yet saved to the database will be assigned with a temporary key value (e.g. -1 or an empty Guid/String value depending on your key type). In a Web application, ListView uses a business class&amp;nbsp;&lt;a href="https://documentation.devexpress.com/#CoreLibraries/clsDevExpressXpoKeyAttributetopic"&gt;key property&lt;/a&gt;&amp;nbsp;to identify records, because there is no way to access real business objects from the web browser. Hence, there is a requirement that each business object must have a unique value assigned to the key property.&amp;nbsp;ASPxGridView&amp;nbsp;and other data-bound controls require this for the correct operation of such features like selection, filtering, sorting, grouping and the standard XAF functionality that depends on them (see also&amp;nbsp;&lt;a href="https://documentation.devexpress.com/AspNet/DevExpress.Web.ASPxGridBase.class"&gt;ASPxGridBase&lt;/a&gt;&amp;nbsp;&amp;gt;&amp;nbsp;&lt;a href="https://documentation.devexpress.com/AspNet/DevExpress.Web.ASPxGridBase.KeyFieldName.property"&gt;KeyFieldName&lt;/a&gt;).&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;If&amp;nbsp;a key property&amp;nbsp;is missing in a business class completely or&amp;nbsp;if a key property is not initialized with a unique value immediately after the record is created, these duplicate or invalid records may&amp;nbsp;lead to a data-bound control malfunction as expected.&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;Please inform me of your health-check results!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-cUuXd6g0cCQ/V4gGNRxLNGI/AAAAAAAAA5s/5MbqVOYhNzI6w9GrrTKSLG76qwhACBnRQCPcBGAYYCw/s1600/pins-1311988.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="FreeImages.Com" border="0" data-original-height="384" data-original-width="800" height="191" src="https://1.bp.blogspot.com/-cUuXd6g0cCQ/V4gGNRxLNGI/AAAAAAAAA5s/5MbqVOYhNzI6w9GrrTKSLG76qwhACBnRQCPcBGAYYCw/s400/pins-1311988.jpg" title="FreeImages.Com" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">ASPxGridListEditor</category>
      <category domain="http://www.blogger.com/atom/ns#">ASPxGridView</category>
      <category domain="http://www.blogger.com/atom/ns#">best practice</category>
      <category domain="http://www.blogger.com/atom/ns#">business model design</category>
      <category domain="http://www.blogger.com/atom/ns#">List Editor</category>
      <category domain="http://www.blogger.com/atom/ns#">ListView</category>
      <category domain="http://www.blogger.com/atom/ns#">web</category>
      <pubDate>Fri, 25 May 2018 15:38:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-5975330532121482365</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-05-25T15:38:00Z</dc:date>
    </item>
    <item>
      <title>Improved diagnostics for ListView errors in Server Mode</title>
      <link>https://dennisgaravsky.blogspot.com/2018/05/improved-diagnostics-for-listview.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-75iDsLzJ84E/WvWxTPDQNSI/AAAAAAAAIj8/XuEN60qJSGsYMO5B8CqU1_vsObzhHTFIQCLcBGAs/s72-c/smlogs.png" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;From the&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T634449/core-listview-shows-blank-rows-or-freezes-in-certain-scenarios-in-server-mode"&gt;Core - ListView shows blank rows or freezes in certain scenarios in Server Mode&lt;/a&gt;&amp;nbsp;ticket:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;In certain scenarios, a list view with&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113683/Concepts/UI-Construction/Views/List-View-Data-Access-Modes/List-View-Data-Access-Modes-Overview"&gt;DataAccessMode&lt;/a&gt;&amp;nbsp;set to Server may show empty rows or operate slowly. This behavior is usually caused by exceptions thrown during data loading that are handled internally. Such situations can be diagnosed&amp;nbsp;using the debugger (see&amp;nbsp;&lt;a data-ticket="T228863" href="https://www.devexpress.com/Support/Center/p/T228863.aspx"&gt;What to do when the grid displays blank rows in Server Mode&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a data-ticket="T218612" href="https://www.devexpress.com/Support/Center/p/T218612.aspx"&gt;ASPxGridView displays empty rows when bound via Server Mode&lt;/a&gt;).&lt;/i&gt;&lt;/div&gt;&lt;i&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;Starting with &lt;b&gt;v18.1&lt;/b&gt;, we improved the XAF built-in diagnostics&amp;nbsp;for errors occurring in Server Mode data sources. Now, server-side errors (intercepted via the&amp;nbsp;&lt;a href="https://documentation.devexpress.com/CoreLibraries/DevExpress.Xpo.XPServerCollectionSource.ServerExceptionThrown.event"&gt;ServerExceptionThrown&lt;/a&gt;&amp;nbsp;event) are written to the application log. In addition, when the log level is set to 4 (&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112575/Concepts/Debugging-Testing-and-Error-Handling/Log-Files"&gt;Verbose&lt;/a&gt;), errors reported via the&amp;nbsp;InconsistencyDetected&amp;nbsp;event are also written to the log. While the latter event doesn't always indicate a problem, the error message may be helpful in researching the cause of performance issues.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-75iDsLzJ84E/WvWxTPDQNSI/AAAAAAAAIj8/XuEN60qJSGsYMO5B8CqU1_vsObzhHTFIQCLcBGAs/s1600/smlogs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="600" data-original-width="800" height="300" src="https://3.bp.blogspot.com/-75iDsLzJ84E/WvWxTPDQNSI/AAAAAAAAIj8/XuEN60qJSGsYMO5B8CqU1_vsObzhHTFIQCLcBGAs/s400/smlogs.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/i&gt;&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">18.1</category>
      <category domain="http://www.blogger.com/atom/ns#">18.1.3</category>
      <category domain="http://www.blogger.com/atom/ns#">ASPxGridListEditor</category>
      <category domain="http://www.blogger.com/atom/ns#">ASPxGridView</category>
      <category domain="http://www.blogger.com/atom/ns#">GridControl</category>
      <category domain="http://www.blogger.com/atom/ns#">GridView</category>
      <category domain="http://www.blogger.com/atom/ns#">logging</category>
      <category domain="http://www.blogger.com/atom/ns#">server mode</category>
      <category domain="http://www.blogger.com/atom/ns#">troubleshooting</category>
      <pubDate>Fri, 11 May 2018 15:09:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-6741683503186218110</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-05-11T15:09:00Z</dc:date>
    </item>
    <item>
      <title>Quick questions on our change log</title>
      <link>https://dennisgaravsky.blogspot.com/2018/05/quick-questions-on-our-change-log.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-GVOLAeW7la4/VRQ4pVHbPyI/AAAAAAAAAgM/fdTy1hLVQpw51pEa6snlU8D6FUsvcVY8gCPcBGAYYCw/s72-c/5000576310_63351104a8.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;Q1:&lt;/b&gt; How often do you check the "Resolved Issues", "Known Issues", "Breaking Changes" pages in &lt;a href="https://www.devexpress.com/Support/versions.xml"&gt;our What's New documentation&lt;/a&gt;? For instance: "n&lt;i&gt;ever, did not know about this page&lt;/i&gt;"; "&lt;i&gt;every minor&lt;/i&gt;"; "&lt;i&gt;every major&lt;/i&gt;"; "&lt;i&gt;rarely, only when I encounter an issue&lt;/i&gt;"; "&lt;i&gt;once 1-2 year when we upgrade&lt;/i&gt;"; your option.&lt;br /&gt;&lt;b&gt;Q2:&lt;/b&gt; What would you like to improve about these pages to make your work more comfortable?&lt;br /&gt;&lt;b&gt;Q3: &lt;/b&gt;Are you missing anything important from the "New Major Features" section&amp;nbsp;&lt;a href="https://www.devexpress.com/Subscriptions/New-2018-1.xml#xaf"&gt;like this for v18.1&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-GVOLAeW7la4/VRQ4pVHbPyI/AAAAAAAAAgM/fdTy1hLVQpw51pEa6snlU8D6FUsvcVY8gCPcBGAYYCw/s1600/5000576310_63351104a8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="360" data-original-width="480" height="300" src="https://1.bp.blogspot.com/-GVOLAeW7la4/VRQ4pVHbPyI/AAAAAAAAAgM/fdTy1hLVQpw51pEa6snlU8D6FUsvcVY8gCPcBGAYYCw/s400/5000576310_63351104a8.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This post idea came after looking at the fixed XAF issues for the upcoming v17.2.8:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-DPU5I6HSlQ0/WvLUv1eV04I/AAAAAAAAIjU/EZzZ2XJcmpQ0GbX-dRG58hA-18rAKIZAwCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="713" data-original-width="700" src="https://3.bp.blogspot.com/-DPU5I6HSlQ0/WvLUv1eV04I/AAAAAAAAIjU/EZzZ2XJcmpQ0GbX-dRG58hA-18rAKIZAwCLcBGAs/s1600/1.png" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;As you can see, titles have different formatting and it is not easy to find all issues for a certain platform or module, e.g. Mobile.&lt;br /&gt;&lt;br /&gt;This is how a bit better formatted&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/VersionHistory?VersionHistoryItemsType=ResolvedIssues&amp;amp;TechnologyName=.NET&amp;amp;PlatformName=Frameworks%20(XAF%20%26%20XPO)&amp;amp;ProductName=AllProducts&amp;amp;StartBuildName=17.2.8&amp;amp;EndBuildName=17.2.8"&gt;list looks now&lt;/a&gt;:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-W4Ro0c5RgcA/WvLU83o4mPI/AAAAAAAAIjY/-Tgkj-2-qOAEZ5-NwjWb8PjMwT1H0gf7QCLcBGAs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="713" data-original-width="700" src="https://4.bp.blogspot.com/-W4Ro0c5RgcA/WvLU83o4mPI/AAAAAAAAIjY/-Tgkj-2-qOAEZ5-NwjWb8PjMwT1H0gf7QCLcBGAs/s1600/2.png" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This needs a little bit more discipline from our team, but may be more helpful for our customers. I am&amp;nbsp; still hesitating because this problem may not exist for many, because Google Analytics reports low visits for these pages.&lt;br /&gt;&lt;br /&gt;I hope you can help us see whether to focus on more important things by answering my questions above. Your other thoughts and suggestions are welcome too, as always.&lt;br /&gt;&lt;br /&gt;See Also:&amp;nbsp;&lt;a href="https://documentation.devexpress.com/GeneralInformation/2216/General-Information"&gt;General Information&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&amp;nbsp;&amp;gt;&amp;nbsp;&lt;a href="https://documentation.devexpress.com/GeneralInformation/15661/Installation"&gt;Installation&lt;/a&gt;&amp;nbsp;&amp;gt;&amp;nbsp;&lt;a href="https://documentation.devexpress.com/GeneralInformation/2221/Installation/Upgrade-Notes"&gt;Upgrade Notes&lt;/a&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">feedback</category>
      <category domain="http://www.blogger.com/atom/ns#">usability</category>
      <category domain="http://www.blogger.com/atom/ns#">what's new</category>
      <pubDate>Wed, 09 May 2018 11:11:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-1650993582123322681</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-05-09T11:11:00Z</dc:date>
    </item>
    <item>
      <title>SVG images in RichTextPropertyEditor</title>
      <link>https://dennisgaravsky.blogspot.com/2018/05/svg-images-in-richtextpropertyeditor.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-EPJCbYGZw4Y/WvLDG74t4lI/AAAAAAAAIiw/OBmulkA3yo0oIETwKuUUvojaGEA8iGgdgCLcBGAs/s72-c/2018-05-09_11-26-10.png" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;UPDATED:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="background-color: yellow;"&gt;With v18.2, the ForcePngIcons option is no longer required. Use the &lt;a href="https://docs.devexpress.com/eXpressAppFramework/DevExpress.ExpressApp.Utils.ImageLoader._members"&gt;ImageLoader.Instance.UseSvgImages&lt;/a&gt; property instead.&lt;/span&gt;&lt;br /&gt;----------------------------&lt;br /&gt;We've temporarily disabled SVG icons in RichTextPropertyEditor (a part of &lt;a href="https://www.devexpress.com/go/XAF_Try_RichTextEditorModule_v18.1.aspx"&gt;the new Office module&lt;/a&gt; in v18.1.3) in an XAF app until we redraw all default PNG images (by the end of 2018). Our designers aimed to avoid bad UX after mixing PNG and SVG images within one screen. For instance, the merged main and RichEditControl's menus may look inconsistent. Different images in independent UI contexts are acceptable, e.g., SVG in a separate report designer and PNG in the main form.&lt;br /&gt;&lt;br /&gt;To force&amp;nbsp;SVG images in v18.1, set the static&amp;nbsp;&lt;b&gt;DevExpress.ExpressApp.Office.Win.OfficeWindowsFormsModule.ForcePngIcons &lt;/b&gt;property to&amp;nbsp;&lt;b&gt;False&amp;nbsp;&lt;/b&gt;in the&amp;nbsp;&lt;em&gt;Main&lt;/em&gt;&amp;nbsp;method of the&amp;nbsp;&lt;em&gt;YourSolutionName.Win/Program.xx&lt;/em&gt;&amp;nbsp;file (available in&amp;nbsp;&lt;strong&gt;v18.1.3+&lt;/strong&gt;).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-EPJCbYGZw4Y/WvLDG74t4lI/AAAAAAAAIiw/OBmulkA3yo0oIETwKuUUvojaGEA8iGgdgCLcBGAs/s1600/2018-05-09_11-26-10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="745" data-original-width="908" height="327" src="https://1.bp.blogspot.com/-EPJCbYGZw4Y/WvLDG74t4lI/AAAAAAAAIiw/OBmulkA3yo0oIETwKuUUvojaGEA8iGgdgCLcBGAs/s400/2018-05-09_11-26-10.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;To check our progress &lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;with regard to SVG icons support for WinForms and to help future development by answering questions from our team or sharing early feedback, please&amp;nbsp;&lt;a href="https://www.devexpress.com/go/XAF_Try_SVG_Support_v18.1.aspx" style="background-color: yellow;"&gt;&lt;strong&gt;visit&lt;/strong&gt;&lt;strong&gt; this knowledge base article&lt;/strong&gt;&lt;/a&gt;.&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">18.1</category>
      <category domain="http://www.blogger.com/atom/ns#">18.1.3</category>
      <category domain="http://www.blogger.com/atom/ns#">High DPI</category>
      <category domain="http://www.blogger.com/atom/ns#">images</category>
      <category domain="http://www.blogger.com/atom/ns#">svg</category>
      <category domain="http://www.blogger.com/atom/ns#">UI</category>
      <category domain="http://www.blogger.com/atom/ns#">usability</category>
      <pubDate>Wed, 09 May 2018 09:52:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-1307223461112188747</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-05-09T09:52:00Z</dc:date>
    </item>
    <item>
      <title>Update on WinForms SVG Images Support in v18.1</title>
      <link>https://dennisgaravsky.blogspot.com/2018/04/update-on-winforms-svg-images-support.html</link>
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Please do not miss our recent update in the&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T616414/winforms-svg-images-support-preview-in-v18-1"&gt;WinForms SVG Images Support - Preview in v18.1&lt;/a&gt;&amp;nbsp;KB article:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;We've extended the number of scenarios where SVG images are now correctly shown in a WinForms XAF application with the following:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;●&amp;nbsp;SVG images used for SingleChoiceAction itself and its items shown in the bar and ribbon controls.&lt;/span&gt;&lt;br /&gt;&lt;img data-image="79255196-566d-4493-af0f-f9812b7cdb05" src="https://www.devexpress.com/Support/Center/Attachment/GetAttachmentFile/79255196-566d-4493-af0f-f9812b7cdb05" /&gt;&lt;img data-image="18b4f24f-1348-41e3-b909-fe8d66397026" src="https://www.devexpress.com/Support/Center/Attachment/GetAttachmentFile/18b4f24f-1348-41e3-b909-fe8d66397026" /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;●&amp;nbsp;SVG images used for SingleChoiceAction shown in the popup menu.&lt;/span&gt;&lt;br /&gt;&lt;img data-image="64fe979c-d6cd-4636-996d-049cb107a1ff" src="https://www.devexpress.com/Support/Center/Attachment/GetAttachmentFile/64fe979c-d6cd-4636-996d-049cb107a1ff" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;●&amp;nbsp;SVG images used for ParametrizedAction&amp;nbsp;shown&amp;nbsp;in the bar and ribbon controls and in the popup menu.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img data-image="8b0b35d1-3c2c-4354-86ae-1e3a4da9aab7" src="https://www.devexpress.com/Support/Center/Attachment/GetAttachmentFile/8b0b35d1-3c2c-4354-86ae-1e3a4da9aab7" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;●&amp;nbsp;SVG images used for ParametrizedAction&amp;nbsp;shown&amp;nbsp;in ButtonsContainer on a detail view.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img data-image="f44f1221-4a09-43de-93c7-bcb292314815" src="https://www.devexpress.com/Support/Center/Attachment/GetAttachmentFile/f44f1221-4a09-43de-93c7-bcb292314815" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;●&amp;nbsp;SVG images used for nodes in TreeListEditor via the new&amp;nbsp;&lt;em&gt;DevExpress.Persistent.Base.General.ITreeNodeSvgImageProvider&lt;/em&gt;&amp;nbsp;interface.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img data-image="30faa1cc-2085-4bde-84ae-b802bc40cf96" src="https://www.devexpress.com/Support/Center/Attachment/GetAttachmentFile/30faa1cc-2085-4bde-84ae-b802bc40cf96" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;strong&gt;Your feedback is needed!&lt;/strong&gt;&lt;br /&gt;If you want to test this feature with your real world applications on a virtual machine (or another suitable test environment) prior to the official release, download the v18.1 preview&amp;nbsp;build here:&amp;nbsp;&lt;a href="https://www.devexpress.com/go/XAF_Try_v18.1_Preview_Build.aspx"&gt;DevExpress XAF v18.1 Preview installer&lt;/a&gt;&amp;nbsp;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">18.1</category>
      <category domain="http://www.blogger.com/atom/ns#">High DPI</category>
      <category domain="http://www.blogger.com/atom/ns#">images</category>
      <category domain="http://www.blogger.com/atom/ns#">svg</category>
      <category domain="http://www.blogger.com/atom/ns#">what's new</category>
      <pubDate>Thu, 26 Apr 2018 00:27:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-856664924515096603</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-04-26T00:27:00Z</dc:date>
    </item>
    <item>
      <title>UPDATE on Customization Forms - XAF WinForms v18.1.3+</title>
      <link>https://dennisgaravsky.blogspot.com/2018/04/update-on-customization-forms-xaf.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-aGW6TqJui-o/WuBzoFeX5iI/AAAAAAAAHnc/O4i2DDdhIDEBoSmes3esQR1OBUQgUtJTwCLcBGAs/s72-c/2018-04-25_15-06-06.gif" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;With &lt;b&gt;v18.1.3&lt;/b&gt;&amp;nbsp;(RTM or Beta2), a tooltip will be shown for complex property paths to avoid confusion from fields with the same name. Refer to the attached video:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-aGW6TqJui-o/WuBzoFeX5iI/AAAAAAAAHnc/O4i2DDdhIDEBoSmes3esQR1OBUQgUtJTwCLcBGAs/s1600/2018-04-25_15-06-06.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="639" data-original-width="710" height="360" src="https://4.bp.blogspot.com/-aGW6TqJui-o/WuBzoFeX5iI/AAAAAAAAHnc/O4i2DDdhIDEBoSmes3esQR1OBUQgUtJTwCLcBGAs/s400/2018-04-25_15-06-06.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Note that since multiple customization forms can be opened at the same time, now the form's header also includes the View's caption. We hope your end-users will&amp;nbsp;appreciate&amp;nbsp;these minor usability improvements. Refer to the &lt;a href="https://www.devexpress.com/Support/Center/Question/Details/S30014/winforms-customization-forms-it-is-difficult-to-distinguish-fields-with-the-same-name"&gt;&lt;b style="background-color: yellow;"&gt;original Support Center ticket for more details&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;strong&gt;See Also:&lt;/strong&gt;&lt;br /&gt;&lt;a href="https://dennisgaravsky.blogspot.com/2018/02/customization-forms-and-model-editor.html"&gt;Customization Forms and Model Editor Improvements - XAF v17.2.6&lt;/a&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">18.1.3</category>
      <category domain="http://www.blogger.com/atom/ns#">customization</category>
      <category domain="http://www.blogger.com/atom/ns#">form</category>
      <category domain="http://www.blogger.com/atom/ns#">what's new</category>
      <category domain="http://www.blogger.com/atom/ns#">WinForms</category>
      <pubDate>Wed, 25 Apr 2018 23:05:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-13182265436821281</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-04-25T23:05:00Z</dc:date>
    </item>
    <item>
      <title>The future of old RichTextPropertyEditor and HtmlPropertyEditor with the introduction of the new Office-inspired Word Processing Module - YOUR FEEDBACK IS NEEDED!!!</title>
      <link>https://dennisgaravsky.blogspot.com/2018/04/the-future-of-old-richtextpropertyedito.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-fMlPAhUqey4/WbwJzwXTqbI/AAAAAAAAFfI/0IqbIe8KShg0VJ3GnYIi3QXLY4HBH1djACPcBGAYYCw/s72-c/FreeImages_cassette-tape_Jeff%2BPrieb.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Why bothering?&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As many of you already heard, we are shipping &lt;a href="https://www.devexpress.com/go/XAF_Try_RichTextEditorModule_v18.1.aspx"&gt;the Office module with the Rich Text Editor&lt;/a&gt; in &lt;b&gt;v18.1&lt;/b&gt;. It allows end-users to create, load, change, print, save and convert documents in different formats, including HTML. At this stage, this new module is for WinForms only. We see ways to support more Office functionality and cover other platforms in the future.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As you know, there are two very old XAF Property Editors, which perform similar functions, but with lower quality. They are both based on standard Microsoft controls:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;DevExpress.ExpressApp.HtmlPropertyEditor.Win.HtmlPropertyEditor&lt;/b&gt; - this is a part of&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113140/Concepts/Extra-Modules/HTML-Property-Editor/HTML-Property-Editor-Module"&gt;HTML Property Editor Module&lt;/a&gt;&amp;nbsp;that integrates the &lt;a href="https://msdn.microsoft.com/library/system.windows.forms.webbrowser(v=vs.110).aspx"&gt;System.Windows.Forms.WebBrowser&lt;/a&gt; component.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;DevExpress.ExpressApp.Win.Editors.RichTextPropertyEditor&lt;/b&gt; - this is a part of the standard DevExpress.ExpressApp.Win module that integrates the &lt;a href="https://msdn.microsoft.com/library/system.windows.forms.richtextbox(v=vs.110).aspx"&gt;System.Windows.Forms.RichTextBox&lt;/a&gt; component.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;We created them almost 10 years ago when DevExpress did not provide controls with similar functions. Today, their usage is not justified also because of missing High DPI support, nice icons and useful functions like Mail Merge. Workarounds can be implemented for these standard controls too, but it does not make much sense to invest our resources into this when much better options are already available. These editors have not recently received updates in other areas anyway. This is still a maintenance work for our team that could have been spent on something else.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;What we want to change and how?&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;/b&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;1.&lt;/b&gt; We want to hide the&amp;nbsp;&lt;i&gt;DevExpress.ExpressApp.Win.Editors.RichTextPropertyEditor&lt;/i&gt; and its related APIs from Intellisense, the FeatureCenter demo and also from the Model Editor. This is all not to confuse new and existing users. Most Support Center tickets on it are from early days when users could not integrate our RichEditControl on their own with&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Example/Details/E1509/how-to-create-a-propertyeditor-based-on-the-xtrarichedit-control"&gt;E1509&lt;/a&gt;&amp;nbsp;and the like.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If a string property was decorated with the &lt;i&gt;[EditorAlias(EditorAliases.RichTextPropertyEditor)] &lt;/i&gt;attribute and no Office module is added, it will function as before for existing users. If the Office module is added into the app, its new PropertyEditor will be used instead. Since the &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/DevExpress.Persistent.Base.EditorAliasAttribute.class"&gt;EditorAliasAttribute&lt;/a&gt; feature has been documented only in 2017, the aforementioned declaration had almost zero usage according to our Support Center &lt;a href="https://search.devexpress.com/?q=EditorAliases.RichTextPropertyEditor&amp;amp;m=SupportCenter"&gt;stats&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If the DevExpress.ExpressApp.Win.Editors.RichTextPropertyEditor&amp;nbsp;was set in PropertyEditorType in the Model Editor, everything will continue to function as before, even with the new Office module plugged in.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If you test Beta v18.1, you may see that our new PropertyEditor is called "RichEditPropertyEditor". We also want to rename it to RichTextPropertyEditor, because we screwed up with the naming. Since the DevExpress.ExpressApp.Win.Editors.RichTextPropertyEditor will be hidden from everywhere, new and existing users should not be confused by the same name.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;2.&lt;/b&gt; We want to stop recommending &lt;i&gt;DevExpress.ExpressApp.HtmlPropertyEditor.Win.HtmlPropertyEditor&lt;/i&gt; for new projects, remove it from demos and mark as "obsolete" in learning materials like we did for&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112773/Concepts/Extra-Modules/Reports-Obsolete/Reports-Module-Obsolete"&gt;Reports Module (Obsolete)&lt;/a&gt;. Instead, we want to recommend our customers use the new Property Editor from the Office module (it also supports HTML content through the &lt;i&gt;DocumentStorageFormat&lt;/i&gt; setting). For instance, in our MainDemo app, you can make this Model Editor setting for the Note class (after Beta v18.1 the full type name will likely change):&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&amp;nbsp; &amp;lt;BOModel&amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;Class Name="DevExpress.Persistent.BaseImpl.Note"&amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;OwnMembers&amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Member Name="Text" PropertyEditorType="DevExpress.ExpressApp.Office.RichEdit.Win.RichEditPropertyEditor" DocumentStorageFormat="Html" /&amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/OwnMembers&amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/Class&amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&amp;nbsp; &amp;lt;/BOModel&amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If you do not want to migrate to the new editor, you can continue using the former one as you wish -&amp;nbsp; no problem. Also, it was thus far not critical for our team to think about the removal date at this stage, but we will see how it goes in the future. Anyway, we do not expect any further development to this editor by the reasons I described above.&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T515516/ways-to-migrate-old-xaf-reports-to-the-reportsv2-module"&gt;The same notes and procedures&lt;/a&gt;&amp;nbsp;apply here as for our Reports (Obsolete) module.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Your feedback is needed!&lt;/b&gt;&lt;/div&gt;&lt;/b&gt;&lt;div style="text-align: justify;"&gt;This plan is NOT YET realized, but I wish to do so by v18.1 release time (in 2-3 weeks). This is the right time to avoid changes when more customers use the new Office module in their projects. If you support this initiative, we will describe the migration path in the Breaking Changes section of our What's New docs, as always. This should help improve user experience for many XAF users and save our team resources.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I'd like to hear from you on what you think about this. Specifically:&lt;br /&gt;&lt;b&gt;Q1: &lt;/b&gt;Are you using DevExpress.ExpressApp.Win.Editors.RichTextPropertyEditor and DevExpress.ExpressApp.HtmlPropertyEditor.Win.HtmlPropertyEditor?&lt;br /&gt;&lt;b&gt;Q2:&lt;/b&gt; If so, what do you like about them, what problems did you experience so far and how important are they for you?&lt;br /&gt;&lt;b&gt;Q3:&lt;/b&gt; What do you think about the proposed changes and the migration path? How would you handle this yourself?&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-fMlPAhUqey4/WbwJzwXTqbI/AAAAAAAAFfI/0IqbIe8KShg0VJ3GnYIi3QXLY4HBH1djACPcBGAYYCw/s1600/FreeImages_cassette-tape_Jeff%2BPrieb.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="FreeImages.com/Jeff Prieb" border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://3.bp.blogspot.com/-fMlPAhUqey4/WbwJzwXTqbI/AAAAAAAAFfI/0IqbIe8KShg0VJ3GnYIi3QXLY4HBH1djACPcBGAYYCw/s400/FreeImages_cassette-tape_Jeff%2BPrieb.jpg" title="FreeImages.com/Jeff Prieb" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">18.1</category>
      <category domain="http://www.blogger.com/atom/ns#">beware</category>
      <category domain="http://www.blogger.com/atom/ns#">html</category>
      <category domain="http://www.blogger.com/atom/ns#">rich text editing</category>
      <category domain="http://www.blogger.com/atom/ns#">rtf</category>
      <category domain="http://www.blogger.com/atom/ns#">what's new</category>
      <pubDate>Wed, 25 Apr 2018 10:50:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-2336917926991030740</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-04-25T10:50:00Z</dc:date>
    </item>
    <item>
      <title>XAF v18.1 - An application will not start if there are non-existent member or type info for the Application Model elements</title>
      <link>https://dennisgaravsky.blogspot.com/2018/04/xaf-v181-application-will-not-start-if.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-TNM547u0d_k/WtmxZPUG9bI/AAAAAAAAHkA/BH5O_q89wt4DTgdb3vUJFBrPRE31SrnJQCLcBGAs/s72-c/2018-04-20_1205.png" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;Starting with&amp;nbsp;&lt;strong&gt;v18.1&lt;/strong&gt;, we have introduced checks for type and member info existence at the core level. If a type or member is not existent, the exception will be thrown by default:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-TNM547u0d_k/WtmxZPUG9bI/AAAAAAAAHkA/BH5O_q89wt4DTgdb3vUJFBrPRE31SrnJQCLcBGAs/s1600/2018-04-20_1205.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="381" data-original-width="549" src="https://2.bp.blogspot.com/-TNM547u0d_k/WtmxZPUG9bI/AAAAAAAAHkA/BH5O_q89wt4DTgdb3vUJFBrPRE31SrnJQCLcBGAs/s1600/2018-04-20_1205.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;NOTE:&lt;/strong&gt;&amp;nbsp;Type and member info is mandatory as ALL&amp;nbsp;standard and third-party modules rely on it. We do NOT recommend disabling this check in production, because your application will still fail later (you may not notice it and it will happen on an end-user machine).&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;strong&gt;Typical but not all scenarios where you may see this error are:&lt;/strong&gt;&lt;br /&gt;- Code changes to an underlying object type structure. For instance, class renaming or removing, namespace or assembly changing; member renaming, removing or its underlying type changing (also applied to custom fields added at runtime).&lt;br /&gt;- Invalid model differences for changed types and members are still present (e.g., for ListView columns and a DetailView layout, appearance and validation rules).&lt;br /&gt;&lt;br /&gt;Please refer to &lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T583980/" style="background-color: yellow;"&gt;this Support Center article&lt;/a&gt; for more details on possible solutions and ways to disable this behavior.&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">18.1</category>
      <category domain="http://www.blogger.com/atom/ns#">application model</category>
      <category domain="http://www.blogger.com/atom/ns#">attention</category>
      <category domain="http://www.blogger.com/atom/ns#">business model design</category>
      <category domain="http://www.blogger.com/atom/ns#">debugging</category>
      <category domain="http://www.blogger.com/atom/ns#">troubleshooting</category>
      <category domain="http://www.blogger.com/atom/ns#">usability</category>
      <category domain="http://www.blogger.com/atom/ns#">what's new</category>
      <pubDate>Fri, 20 Apr 2018 09:24:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-8758833549931358192</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-04-20T09:24:00Z</dc:date>
    </item>
    <item>
      <title>Capturing a user's signature in an XAF mobile application - UPDATE for v17.2.8+</title>
      <link>https://dennisgaravsky.blogspot.com/2018/04/capturing-users-signature-in-xaf-mobile.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-Vp0Rs5kWxzk/WiF0ilJTj3I/AAAAAAAAGdo/1Y5rfWVzDbUGy3qasz8QEeDBt3KWqV0RwCPcBGAYYCw/s72-c/signed-away-2-1549841.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;Starting with v17.2.8,&amp;nbsp;&lt;strong&gt;MobilePropertyEditor&lt;/strong&gt;&amp;nbsp;supports the Edit&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/DevExpress.ExpressApp.Editors.ViewEditMode.enum"&gt;ViewEditMode&lt;/a&gt;. We updated our&amp;nbsp;&lt;a data-ticket="T583166" href="https://isc.devexpress.com/Thread/WorkplaceDetails/T583166"&gt;How to use a Signature Pad in XAF Mobile&lt;/a&gt;&amp;nbsp;example and enabled&amp;nbsp;&lt;strong&gt;SignatureAction&lt;/strong&gt;&amp;nbsp;in the Edit mode accordingly. This improvement saves end-users time not only for this particular scenario (they no longer require to switch views), but also when working with regular image properties.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-Vp0Rs5kWxzk/WiF0ilJTj3I/AAAAAAAAGdo/1Y5rfWVzDbUGy3qasz8QEeDBt3KWqV0RwCPcBGAYYCw/s1600/signed-away-2-1549841.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="FreeImages.com/Carl Dwyer" border="0" data-original-height="600" data-original-width="942" height="253" src="https://1.bp.blogspot.com/-Vp0Rs5kWxzk/WiF0ilJTj3I/AAAAAAAAGdo/1Y5rfWVzDbUGy3qasz8QEeDBt3KWqV0RwCPcBGAYYCw/s400/signed-away-2-1549841.jpg" title="FreeImages.com/Carl Dwyer" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To see the difference in action, refer to the GIF file below and compare it with the one from&amp;nbsp;&lt;a href="https://dennisgaravsky.blogspot.com/2017/12/capturing-users-signature-in-xaf-mobile.html"&gt;my previous post&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-gxI8T9wXaRo/WtSQPiO40TI/AAAAAAAAHjg/f7tfDNTKp-4MK_3akc-9wBzsA6iypep-gCLcBGAs/s1600/DirectImageEditingForSignaturePad.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="892" data-original-width="694" height="640" src="https://4.bp.blogspot.com/-gxI8T9wXaRo/WtSQPiO40TI/AAAAAAAAHjg/f7tfDNTKp-4MK_3akc-9wBzsA6iypep-gCLcBGAs/s640/DirectImageEditingForSignaturePad.gif" width="497" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 12px; line-height: 1.5; margin-bottom: 0.5em; margin-top: 0.5em;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Your feedback is needed!&lt;/b&gt;&lt;br /&gt;For early testing, we published a daily build. You can download it using the following link:&amp;nbsp;&lt;a href="http://downloads.devexpress.com/HotFixes/DXP/v17.2/DevExpressNETComponents-17.2.7.18099.exe"&gt;DevExpressNETComponents-17.2.7.18099.exe&lt;/a&gt;. We look forward to hearing from you.&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">17.2</category>
      <category domain="http://www.blogger.com/atom/ns#">17.2.8</category>
      <category domain="http://www.blogger.com/atom/ns#">custom</category>
      <category domain="http://www.blogger.com/atom/ns#">customization</category>
      <category domain="http://www.blogger.com/atom/ns#">feedback</category>
      <category domain="http://www.blogger.com/atom/ns#">mobile</category>
      <category domain="http://www.blogger.com/atom/ns#">signature</category>
      <category domain="http://www.blogger.com/atom/ns#">usability</category>
      <pubDate>Mon, 16 Apr 2018 12:03:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-6316736793142812541</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-04-16T12:03:00Z</dc:date>
    </item>
    <item>
      <title>Updates to the new Rich Text Editor Module and ASPxGridLookup-based PropertyEditor in v18.1</title>
      <link>https://dennisgaravsky.blogspot.com/2018/04/updates-to-new-rich-text-editor-module.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-Q0ilmKvmCws/Ws9KQht6gbI/AAAAAAAAHhM/S3DmwS-5GmkqM8dQlvfhO5mG7tEGctx-wCLcBGAs/s72-c/test-me-1420159.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Please do not miss the updates to the following KB articles from our team:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.devexpress.com/go/XAF_Try_RichTextEditorModule_v18.1.aspx"&gt;https://www.devexpress.com/go/XAF_Try_RichTextEditorModule_v18.1.aspx&lt;/a&gt;&lt;br /&gt;&lt;i&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;We have moved further and added&amp;nbsp;&lt;a href="https://documentation.devexpress.com/WindowsForms/9330/Controls-and-Libraries/Rich-Text-Editor/Mail-Merge"&gt;Mail Merge&lt;/a&gt;&amp;nbsp;support to&amp;nbsp;the new module. To enable this feature, set the&amp;nbsp;MailMergeDataType&amp;nbsp;property in&amp;nbsp;RichEditWindowsFormsModule&amp;nbsp;in Application Designer. Now it's also possible to work with multiple rich text editors in the Ribbon mode. You can open the content of the selected&amp;nbsp;rich text editor in a popup window using the 'Show in Popup' context menu item.&amp;nbsp;&lt;/i&gt;&lt;i&gt;Also now you can view&amp;nbsp;rich text content in a&amp;nbsp;list view's columns.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.devexpress.com/go/XAF_Try_ASPxGridLookupPropertyEditor_v18.1.aspx"&gt;https://www.devexpress.com/go/XAF_Try_ASPxGridLookupPropertyEditor_v18.1.aspx&lt;/a&gt;&lt;br /&gt;&lt;i&gt;ASPxGridLookupPropertyEditors provides the capability&amp;nbsp;for&amp;nbsp;creating/modifying objects via a popup window.&amp;nbsp;The add and edit buttons open the popup window to&amp;nbsp;create&amp;nbsp;a new object&amp;nbsp;or to&amp;nbsp;modify a selected&amp;nbsp;one.&amp;nbsp;&lt;a href="https://documentation.devexpress.com/AspNet/DevExpress.Web.ClearButton.class"&gt;ClearButton&lt;/a&gt;&amp;nbsp;allows clearing the editor value.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Your feedback counts!&lt;/b&gt;&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;If you are an active Universal subscriber and would like to test these new features prior to the official release, download the&amp;nbsp;&lt;a href="https://www.devexpress.com/go/XAF_Try_v18.1_Preview_Build.aspx"&gt;&lt;strong&gt;DevExpress XAF v18.1 Preview installer&lt;/strong&gt;&lt;/a&gt;. By providing early build access, we hope to find out whether our new features and solutions address your requirements and issues. Your testing efforts and your feedback help us deliver the best possible final implementation.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-Q0ilmKvmCws/Ws9KQht6gbI/AAAAAAAAHhM/S3DmwS-5GmkqM8dQlvfhO5mG7tEGctx-wCLcBGAs/s1600/test-me-1420159.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1170" data-original-width="1599" height="292" src="https://1.bp.blogspot.com/-Q0ilmKvmCws/Ws9KQht6gbI/AAAAAAAAHhM/S3DmwS-5GmkqM8dQlvfhO5mG7tEGctx-wCLcBGAs/s400/test-me-1420159.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">18.1</category>
      <category domain="http://www.blogger.com/atom/ns#">testing</category>
      <category domain="http://www.blogger.com/atom/ns#">what's new</category>
      <pubDate>Thu, 12 Apr 2018 12:01:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-8083450233419132782</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-04-12T12:01:00Z</dc:date>
    </item>
    <item>
      <title>Old entries in the XPObjectType table - YOUR FEEDBACK IS NEEDED!</title>
      <link>https://dennisgaravsky.blogspot.com/2018/04/old-entries-in-xpobjecttype-table-your.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-gqiOI32XwR8/WsObnEoIxtI/AAAAAAAAHcM/22GCXLJ36yYT2o0T6wqhUzr9K0zg9wj6gCLcBGAs/s72-c/Question.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I am reviewing the priority of a quite dated &lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T451078"&gt;&lt;b&gt;SC item&lt;/b&gt;&lt;/a&gt;&amp;nbsp;on the subject and wanted to ask the community for help. The problem may occur when old business class libraries exist in the application folder. By default, XPO tries to load them by the &lt;a href="https://documentation.devexpress.com/CoreLibraries/2632/DevExpress-ORM-Tool/Fundamentals/When-and-Why-XPO-Extends-the-Database-Schema"&gt;XPObjectType&lt;/a&gt; info along with the new versions. This may lead to a conflict at runtime or startup performance degradation. In the latter case, assembly type resolution may come at a cost (see the point &lt;b&gt;3.5&lt;/b&gt; under&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T148978/how-to-measure-and-improve-the-application-s-performance"&gt;How to measure and improve the application's performance&lt;/a&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Why are we hesitating to remove old XPObjectType entries by default?&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;1.&lt;/b&gt;&amp;nbsp;Removing old XPObjectType records affects other apps accessing this database and is serious. Outdated service table records may relate to business class records too (&lt;a href="https://documentation.devexpress.com/CoreLibraries/2019/DevExpress-ORM-Tool/Feature-Center/Object-Relational-Mapping/Inheritance-Mapping"&gt;inheritance mapping&lt;/a&gt; is in use very often). So, deleting them will lead to foreign key constraint violation. Creating a sophisticated generic solution for this is not easy task.&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;2.&lt;/b&gt;&amp;nbsp; XPObjectType table updates are safe only with the full database and application knowledge. Users possessing this knowledge can use ready options like the&amp;nbsp;&lt;i&gt;ModuleUpdater.UpdateXPObjectType&lt;/i&gt; method (SQL Server-specific) shown in the&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113254/Task-Based-Help/Business-Model-Design/eXpress-Persistent-Objects-XPO/How-to-Handle-Renamings-and-Deletions-of-Business-Classes-and-their-Properties"&gt;How to: Handle Renamings and Deletions of Business Classes and their Properties&lt;/a&gt;&amp;nbsp;article. We also demonstrated a db-server agnostic updater in &lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T451078"&gt;the aforementioned ticket&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;3.&lt;/b&gt; We help XAF developers detect this fact by writing log messages. Check out your eXpressAppFramework.log file for the &lt;i&gt;"Resolve the 'DevExpress.ExpressApp.Workflow.v11.1' assembly"&lt;/i&gt; and similar messages referring to outdated DevExpress assemblies. Of course, a developer or DBA can preview the XPObjectType table using database engine tools.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;4.&lt;/b&gt; Old application assemblies living within the new application folder is unexpected in itself. At least, I would instinctively always prefer a fresh Windows install over an update.&amp;nbsp;Even though we are aware of some specific scenarios (e.g., with plugins or locked assemblies), it is still easy to install the new application version into the new folder. This natural action will avoid these risky circumstances completely.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;5.&lt;/b&gt; Finally, we heard less or almost nothing about this behavior lately. Most likely, this is because an XAF app stores&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113698/Task-Based-Help/Application-Model/How-to-Store-the-Application-Model-Differences-in-the-Database"&gt;user settings in the database&lt;/a&gt;&amp;nbsp;and not in a file system by default and thus the point #4 is simpler.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Your feedback counts!&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Regardless of the reasoning above, I want to learn better on how it looks from your side. Please answer two simple questions here in comments or use the&amp;nbsp;&lt;a href="https://www.devexpress.com/ask"&gt;https://www.devexpress.com/ask&lt;/a&gt; service:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Q1.&lt;/b&gt; Did you ever notice negative effects&amp;nbsp;from the outdated type and assembly references in the XPObjectType table?&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Q2.&lt;/b&gt; If so, describe your problems and use-case scenarios in greater detail. Also, comment on their frequency (e.g., once, every year, etc.) as well as on your current solution implementation and maintenance costs, if any.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In advance, thank you very much for your help! Hopefully, I am not looking this way from your side&#x1f61c;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-gqiOI32XwR8/WsObnEoIxtI/AAAAAAAAHcM/22GCXLJ36yYT2o0T6wqhUzr9K0zg9wj6gCLcBGAs/s1600/Question.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="FreeImages.com/Richard Dudley" border="0" data-original-height="890" data-original-width="1339" height="265" src="https://1.bp.blogspot.com/-gqiOI32XwR8/WsObnEoIxtI/AAAAAAAAHcM/22GCXLJ36yYT2o0T6wqhUzr9K0zg9wj6gCLcBGAs/s400/Question.jpg" title="FreeImages.com/Richard Dudley" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">advanced</category>
      <category domain="http://www.blogger.com/atom/ns#">database</category>
      <category domain="http://www.blogger.com/atom/ns#">DBUpdater</category>
      <category domain="http://www.blogger.com/atom/ns#">feedback</category>
      <category domain="http://www.blogger.com/atom/ns#">ModuleUpdater</category>
      <category domain="http://www.blogger.com/atom/ns#">upgrade</category>
      <category domain="http://www.blogger.com/atom/ns#">XPO</category>
      <pubDate>Tue, 03 Apr 2018 15:32:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-7728414871780789996</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-04-03T15:32:00Z</dc:date>
    </item>
    <item>
      <title>Integrating UnitOfWork and XPObjectSpace descendants into an XAF app</title>
      <link>https://dennisgaravsky.blogspot.com/2018/03/integrating-unitofwork-and.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-4zPD4EJfHHI/WrkmJV97NhI/AAAAAAAAHbM/ra4AvNE-rMcscwz8RqBfiPcay-Qu4GvbACLcBGAs/s72-c/rocket-engines-1255483.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;We've made some code changes for &lt;b&gt;v17.2.6+&lt;/b&gt;&amp;nbsp;as well as created two articles for advanced XAF developers who may need the subject for some low-level tuning:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T591324/how-to-customize-the-unitofwork-behavior-in-xpo-based-xaf-applications" style="background-color: yellow;"&gt;How to customize the UnitOfWork behavior in XPO-based XAF applications&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T590896/how-to-customize-the-object-space-behavior-in-xpo-based-xaf-applications" style="background-color: yellow;"&gt;How to customize the Object Space behavior in XPO-based XAF applications&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Sub-classing is itself easy.&amp;nbsp; The most interesting part comes for the two popular security configurations: the&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113436/Concepts/Security-System/Client-Side-Security-2-Tier-Architecture"&gt;Integrated&lt;/a&gt;&amp;nbsp; mode and the&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113439/Concepts/Security-System/Middle-Tier-Security-WCF-Service"&gt;Middle-Tier&lt;/a&gt;&amp;nbsp;Application Server. Thankfully, this is rarely required for complex or specific scenarios only.&amp;nbsp; Here are several customer tickets for your reference:&lt;/div&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/S39006/how-to-map-a-property-to-a-calculated-database-column-implement-a-read-only-persistent"&gt;How to map a property to a calculated database column (implement a read-only persistent property)&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/Q368491/xpo-and-sql-server-identity-fields"&gt;xpo and sql server identity fields&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/Q552435/using-inherited-unitofwork-object"&gt;Using inherited UnitOfWork object&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T544197/xaf-create-createcustomobjectspaceprovider-with-parameters-from-login-window"&gt;XAF: Create CreateCustomObjectSpaceProvider with parameters from login window&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/Q359904/securitystrategycomplex-how-to-modify-objects-properties-in-code-when-the-user-does-not"&gt;SecurityStrategyComplex: How to modify objects/properties in code when the user does not have the permission?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To learn more about low-level options to control how your application saves data and where, check out the&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Example/Details/E411/how-to-customize-the-underlying-database-provider-options-and-data-access-behavior-in-xaf"&gt;How to customize the underlying database provider options and data access behavior in XAF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Your feedback is needed!&lt;/b&gt;&lt;br /&gt;Finally, I am just curious: if you search your entire solution in Visual Studio (Control+Shift+F) for any of the &lt;i&gt;": UnitOfWork"&lt;/i&gt;, &lt;i&gt;": XPObjectSpace"&lt;/i&gt;, &lt;i&gt;": XPObjectSpaceProvider"&lt;/i&gt; strings or their VB.NET equivalents (e.g., &lt;i&gt;Inherits UnitOfWork&lt;/i&gt;),&amp;nbsp;how many occurrences&amp;nbsp; would you have and for what? Please let me know in the comments!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-4zPD4EJfHHI/WrkmJV97NhI/AAAAAAAAHbM/ra4AvNE-rMcscwz8RqBfiPcay-Qu4GvbACLcBGAs/s1600/rocket-engines-1255483.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="FreeImages.com/Terry Eaton" border="0" data-original-height="1071" data-original-width="1599" height="267" src="https://3.bp.blogspot.com/-4zPD4EJfHHI/WrkmJV97NhI/AAAAAAAAHbM/ra4AvNE-rMcscwz8RqBfiPcay-Qu4GvbACLcBGAs/s400/rocket-engines-1255483.jpg" title="FreeImages.com/Terry Eaton" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">17.2.6</category>
      <category domain="http://www.blogger.com/atom/ns#">advanced</category>
      <category domain="http://www.blogger.com/atom/ns#">data layer</category>
      <category domain="http://www.blogger.com/atom/ns#">data store</category>
      <category domain="http://www.blogger.com/atom/ns#">data store provider</category>
      <category domain="http://www.blogger.com/atom/ns#">database</category>
      <category domain="http://www.blogger.com/atom/ns#">middle-tier</category>
      <category domain="http://www.blogger.com/atom/ns#">SecuredObjectSpaceProvider</category>
      <category domain="http://www.blogger.com/atom/ns#">security</category>
      <category domain="http://www.blogger.com/atom/ns#">XPO</category>
      <pubDate>Mon, 26 Mar 2018 16:58:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-2412104734852544213</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-03-26T16:58:00Z</dc:date>
    </item>
    <item>
      <title>XAF WinForms v17.2.6 - Beware of missing icons in inactive tabs after restoring the Tabbed MDI layout</title>
      <link>https://dennisgaravsky.blogspot.com/2018/03/xaf-winforms-v1726-beware-of-missing.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-5uNZ6FbcpbU/WqEWLSRcPuI/AAAAAAAAHV4/tE5dh75J1Xse5mcILCHZC7ISAVJKWTY1gCLcBGAs/s72-c/MainDemo.Win.Ribbon_2018-03-06_16-27-00.png" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;I want to draw your attention to the&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T611846/" style="background-color: yellow;"&gt;T611846: DocumentManager - TabbedView does not show images for documents&lt;/a&gt;&amp;nbsp;issue already fixed in the XtraBars Suite and which XAF WinForms Tabbed MDI users might encounter after upgrading to v&lt;strong&gt;17.2.6&lt;/strong&gt;. The&amp;nbsp;number of users who already hit this exceeded a certain threshold, and the&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/VersionHistory?TechnologyName=.NET&amp;amp;PlatformName=AllPlatforms&amp;amp;ProductName=AllProducts&amp;amp;VersionHistoryItemsType=KnownIssues&amp;amp;StartBuildName=17.2.6&amp;amp;EndBuildName=17.2.6&amp;amp;version-mode=single-mode"&gt;known issues&lt;/a&gt;&amp;nbsp;section in the What's New documentation&amp;nbsp;or manual searching the Support Center may not help effectively discover it yourself. So, I am posting this here to widely inform those who have not yet upgraded their XAF/WinForms projects to v17.2.6.&lt;/div&gt;&lt;br /&gt;You can also download a&amp;nbsp;&lt;a href="http://downloads.devexpress.com/HotFixes/DXP/v17.2"&gt;hotfix build from here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;Please accept sincerely apologies from our XAF and XtraBars teams for all the inconvenience here.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-5uNZ6FbcpbU/WqEWLSRcPuI/AAAAAAAAHV4/tE5dh75J1Xse5mcILCHZC7ISAVJKWTY1gCLcBGAs/s1600/MainDemo.Win.Ribbon_2018-03-06_16-27-00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="308" data-original-width="498" height="245" src="https://4.bp.blogspot.com/-5uNZ6FbcpbU/WqEWLSRcPuI/AAAAAAAAHV4/tE5dh75J1Xse5mcILCHZC7ISAVJKWTY1gCLcBGAs/s400/MainDemo.Win.Ribbon_2018-03-06_16-27-00.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">17.2</category>
      <category domain="http://www.blogger.com/atom/ns#">17.2.6</category>
      <category domain="http://www.blogger.com/atom/ns#">beware</category>
      <category domain="http://www.blogger.com/atom/ns#">bug</category>
      <category domain="http://www.blogger.com/atom/ns#">images</category>
      <category domain="http://www.blogger.com/atom/ns#">issue</category>
      <category domain="http://www.blogger.com/atom/ns#">runtime</category>
      <category domain="http://www.blogger.com/atom/ns#">Tabbed MDI</category>
      <category domain="http://www.blogger.com/atom/ns#">WinForms</category>
      <pubDate>Thu, 08 Mar 2018 11:09:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-8979744139515768565</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-03-08T11:09:00Z</dc:date>
    </item>
    <item>
      <title>Diagnostic tool for Security System - YOUR FEEDBACK IS NEEDED!!!</title>
      <link>https://dennisgaravsky.blogspot.com/2018/03/diagnostic-tool-for-security-system.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-YVcH83nicWM/WqEIp_hYI_I/AAAAAAAAHVo/6vhv-KAEPk4bBjc-uP4BKxc6kEn5saClQCLcBGAs/s72-c/SecurityDemo.Win_2018-03-08_12-55-32.png" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="background-color: transparent; color: #111111; font-family: inherit; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;Earlier we described &lt;/span&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="background-color: transparent; color: #111111; font-family: inherit; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;&lt;a href="https://dennisgaravsky.blogspot.com/2017/12/how-to-diagnose-effective-access-rights.html"&gt;the prototype of diagnostic tool&lt;/a&gt;&lt;/span&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="background-color: transparent; color: #111111; font-family: inherit; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;. We created it to help a developer to understand why access to a certain object and its members&amp;nbsp;&lt;/span&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="background-color: transparent; color: #111111; font-family: inherit; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;is allowed&lt;/span&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="background-color: transparent; color: #111111; font-family: inherit; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;&amp;nbsp;or denied.&amp;nbsp;&lt;/span&gt;&lt;span class="EOP SCXW190877316" data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:1,&amp;quot;335551620&amp;quot;:1,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:259}" style="background-color: transparent; font-family: inherit; line-height: 22px; margin: 0px; padding: 0px;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/div&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: white; clear: both; cursor: text; direction: ltr; margin: 0px; overflow: visible; padding: 0px; position: relative; user-select: text; z-index: 0;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{6ad3b3d5-c6b7-49f3-9e19-ac2ef2a94f3f}{202}" paraid="538820125" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span class="TextRun EmptyTextRun SCXW190877316" lang="EN-US" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; font-variant-ligatures: none !important; line-height: 19px; margin: 0px; padding: 0px; user-select: text;" xml:lang="EN-US"&gt;&lt;/span&gt;&lt;span class="LineBreakBlob BlobObject DragDrop SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; line-height: 19px; margin: 0px; padding: 0px; user-select: text;"&gt;&lt;span class="SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; margin: 0px; padding: 0px; user-select: text; white-space: pre !important;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="TextRun EmptyTextRun SCXW190877316" lang="EN-US" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; font-variant-ligatures: none !important; line-height: 19px; margin: 0px; padding: 0px; user-select: text;" xml:lang="EN-US"&gt;&lt;/span&gt;&lt;span class="EOP SCXW190877316" data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:1,&amp;quot;335551620&amp;quot;:1,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:259}" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; line-height: 19px; margin: 0px; padding: 0px; user-select: text;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: white; clear: both; cursor: text; margin: 0px; overflow: visible; padding: 0px; position: relative; text-align: left; user-select: text;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{6ad3b3d5-c6b7-49f3-9e19-ac2ef2a94f3f}{206}" paraid="1339924311" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="color: #111111; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;We analyzed the feedback we got on this matter and provided the following improvements in &lt;b&gt;v17.2.6&lt;/b&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{6ad3b3d5-c6b7-49f3-9e19-ac2ef2a94f3f}{206}" paraid="1339924311" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span style="background-color: transparent; font-family: inherit;"&gt;&lt;span style="background-color: transparent; color: windowtext;"&gt;&amp;nbsp;- To enable the security diagnostic tool, use the familiar&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="background-color: transparent; color: #111111; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112818/Concepts/Extend-Functionality/Determine-Why-an-Action-Controller-or-Editor-is-Inactive"&gt;EnableDiagnosticActions&lt;/a&gt;&lt;/span&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="background-color: transparent; color: #111111; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;&amp;nbsp;option.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: white; margin: 0px; padding: 0px; text-align: left; user-select: text;"&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; clear: both; cursor: text; margin: 0px; overflow: visible; padding: 0px; position: relative; user-select: text; z-index: 0;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{6ad3b3d5-c6b7-49f3-9e19-ac2ef2a94f3f}{234}" paraid="840137810" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span style="background-color: transparent; font-family: inherit;"&gt;&amp;nbsp;- You can select a type and a member you wish to analyze.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; clear: both; cursor: text; margin: 0px; overflow: visible; padding: 0px; position: relative; user-select: text; z-index: 0;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{6ad3b3d5-c6b7-49f3-9e19-ac2ef2a94f3f}{243}" paraid="1621326445" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span style="background-color: transparent; font-family: inherit;"&gt;&amp;nbsp;- Results&amp;nbsp;&lt;/span&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="background-color: transparent; color: #111111; font-family: inherit; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;are presented&lt;/span&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="background-color: transparent; color: #111111; font-family: inherit; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;&amp;nbsp;in the XML format.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: white; margin: 0px; padding: 0px; user-select: text;"&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; clear: both; cursor: text; margin: 0px; overflow: visible; padding: 0px; position: relative; text-align: left; user-select: text; z-index: 0;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{0d6c9a2b-9367-421b-937c-3388d8cb7f78}{1}" paraid="816433477" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span style="background-color: transparent; font-family: inherit;"&gt;&amp;nbsp;- We provide more details on how the diagnostic tool calculates results.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; clear: both; cursor: text; direction: ltr; margin: 0px; overflow: visible; padding: 0px; position: relative; user-select: text; z-index: 0;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{0d6c9a2b-9367-421b-937c-3388d8cb7f78}{10}" paraid="2011532958" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; text-align: left; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span style="background-color: transparent; font-family: inherit;"&gt;&amp;nbsp;- There is a way to visualize criteria for easier analysis.&lt;/span&gt;&lt;/div&gt;&lt;span class="LineBreakBlob BlobObject DragDrop SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; line-height: 19px; margin: 0px; padding: 0px; user-select: text;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;span class="LineBreakBlob BlobObject DragDrop SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; line-height: 19px; margin: 0px; padding: 0px; user-select: text;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: white; clear: both; cursor: text; direction: ltr; margin: 0px; overflow: visible; padding: 0px; position: relative; user-select: text; z-index: 0;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{0d6c9a2b-9367-421b-937c-3388d8cb7f78}{19}" paraid="897622247" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span style="background-color: transparent; color: #111111; font-family: inherit;"&gt;You can get more info about the tool from the KB article below:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: #111111; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="clear: both; cursor: text; direction: ltr; margin: 0px; overflow: visible; padding: 0px; position: relative;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{0d6c9a2b-9367-421b-937c-3388d8cb7f78}{35}" paraid="482158282" style="padding: 0px; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="background-color: transparent; color: #111111; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="TextRun SCXW190877316" lang="EN-US" style="color: #111111; line-height: 22px; margin: 0px; padding: 0px;" xml:lang="EN-US"&gt;&lt;a href="https://www.devexpress.com/kb=T589182" style="background-color: yellow;"&gt;https://www.devexpress.com/kb=T589182&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;span class="EOP SCXW190877316" data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:1,&amp;quot;335551620&amp;quot;:1,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:259}" style="background-color: transparent; line-height: 22px; margin: 0px; padding: 0px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: white; clear: both; cursor: text; direction: ltr; margin: 0px; overflow: visible; padding: 0px; position: relative; user-select: text; z-index: 0;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{0d6c9a2b-9367-421b-937c-3388d8cb7f78}{37}" paraid="1766274713" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: white; clear: both; cursor: text; direction: ltr; margin: 0px; overflow: visible; padding: 0px; position: relative; user-select: text; z-index: 0;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{0d6c9a2b-9367-421b-937c-3388d8cb7f78}{45}" paraid="284577612" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;strong&gt;Your feedback is needed&lt;/strong&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="background-color: transparent;"&gt;Please test the tool and let us know whether it is useful in your development process and how you would change it. For instance, the more specific there are use cases of this tool where it was difficult to configure permissions for a user, the greater it is possible that we can arrive at technical solutions that will address them.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: white; clear: both; cursor: text; direction: ltr; margin: 0px; overflow: visible; padding: 0px; position: relative; user-select: text;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{0d6c9a2b-9367-421b-937c-3388d8cb7f78}{63}" paraid="1149367714" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="OutlineElement Ltr SCXW190877316" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: white; clear: both; cursor: text; direction: ltr; margin: 0px; overflow: visible; padding: 0px; position: relative; user-select: text;"&gt;&lt;div class="Paragraph SCXW190877316" paraeid="{0d6c9a2b-9367-421b-937c-3388d8cb7f78}{67}" paraid="627060897" style="-webkit-tap-highlight-color: transparent; -webkit-user-drag: none; background-color: transparent; color: windowtext; padding: 0px; user-select: text; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://www.blogger.com/blogger.g?blogID=1944926148473713281" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://www.blogger.com/blogger.g?blogID=1944926148473713281" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-YVcH83nicWM/WqEIp_hYI_I/AAAAAAAAHVo/6vhv-KAEPk4bBjc-uP4BKxc6kEn5saClQCLcBGAs/s1600/SecurityDemo.Win_2018-03-08_12-55-32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="624" data-original-width="986" height="253" src="https://3.bp.blogspot.com/-YVcH83nicWM/WqEIp_hYI_I/AAAAAAAAHVo/6vhv-KAEPk4bBjc-uP4BKxc6kEn5saClQCLcBGAs/s400/SecurityDemo.Win_2018-03-08_12-55-32.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">17.2.6</category>
      <category domain="http://www.blogger.com/atom/ns#">diagnostic</category>
      <category domain="http://www.blogger.com/atom/ns#">permissions</category>
      <category domain="http://www.blogger.com/atom/ns#">security</category>
      <category domain="http://www.blogger.com/atom/ns#">troubleshooting</category>
      <pubDate>Thu, 08 Mar 2018 10:30:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-6460906861805682780</guid>
      <dc:creator>Unknown</dc:creator>
      <dc:date>2018-03-08T10:30:00Z</dc:date>
    </item>
    <item>
      <title>AccessViolationException at Microsoft.VisualStudio.Shell.Interop.IVsRegisterEditors.UnregisterEditor may occur in Visual Studio 2010, 2012</title>
      <link>https://dennisgaravsky.blogspot.com/2018/02/accessviolationexception-at.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-GVOLAeW7la4/VRQ4pVHbPyI/AAAAAAAAAgM/fdTy1hLVQpw51pEa6snlU8D6FUsvcVY8gCPcBGAYYCw/s72-c/5000576310_63351104a8.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;This sporadic design time error might go away in Visual Studio 2013, 2015, 2017 and newer. &lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;Exception&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;strong&gt;&lt;em&gt;&lt;br /&gt;Type:&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&amp;nbsp;System.AccessViolationException&lt;/em&gt;&lt;strong&gt;&lt;em&gt;&lt;br /&gt;Message:&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&amp;nbsp;Attempted to read or write protected memory. This is often an indication that other memory is corrupt.&lt;br /&gt;&lt;/em&gt;&lt;strong&gt;&lt;em&gt;StackTrace:&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Microsoft.VisualStudio.Shell.Interop.IVsRegisterEditors.UnregisterEditor(UInt32 dwCookie)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Microsoft.VisualStudio.Shell.Package.Dispose(Boolean disposing)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DevExpress.ExpressApp.Design.Core.XAFPackageV4.Dispose(Boolean disposing)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Microsoft.VisualStudio.Shell.Package.Microsoft.VisualStudio.Shell.Interop.IVsPackage.Close()&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;We have been tracking this error for years from XAF users using &lt;a href="https://logify.devexpress.com/"&gt;https://logify.devexpress.com&lt;/a&gt;. We also received a few tickets, but could never replicate this behavior for debugging. Our attempts to log diagnostic information about this error did not help either. Well, it does not seem to relate to the &lt;i&gt;DevExpress.ExpressApp.Design.Core.XAFPackageV4.Dispose&lt;/i&gt; method itself. There are also many non-XAF reports devoted to the same error, but different packages on the Web. &lt;a href="https://www.google.com/search?q=Microsoft.VisualStudio.Shell.Interop.IVsRegisterEditors.UnregisterEditor+accessviolationexception"&gt;https://www.google.com/search?q=Microsoft.VisualStudio.Shell.Interop.IVsRegisterEditors.UnregisterEditor+accessviolationexception&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;From the Logify stats, we know that this error occurs only with these two old Visual Studio versions. It seems that something got fixed in newer IDE versions. If you are on Visual Studio 2010 or 2012 and encountered this error at design time, consider upgrading your IDE - it's 2018 after all:-)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-GVOLAeW7la4/VRQ4pVHbPyI/AAAAAAAAAgM/fdTy1hLVQpw51pEa6snlU8D6FUsvcVY8gCPcBGAYYCw/s1600/5000576310_63351104a8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="360" data-original-width="480" height="300" src="https://1.bp.blogspot.com/-GVOLAeW7la4/VRQ4pVHbPyI/AAAAAAAAAgM/fdTy1hLVQpw51pEa6snlU8D6FUsvcVY8gCPcBGAYYCw/s400/5000576310_63351104a8.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">2010</category>
      <category domain="http://www.blogger.com/atom/ns#">2012</category>
      <category domain="http://www.blogger.com/atom/ns#">bug</category>
      <category domain="http://www.blogger.com/atom/ns#">design time</category>
      <category domain="http://www.blogger.com/atom/ns#">designer</category>
      <category domain="http://www.blogger.com/atom/ns#">upgrade</category>
      <category domain="http://www.blogger.com/atom/ns#">Visual Studio</category>
      <pubDate>Mon, 26 Feb 2018 17:02:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-3567794163783285844</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-02-26T17:02:00Z</dc:date>
    </item>
    <item>
      <title>Usability change for SingleChoiceAction with a single visible sub-item - YOUR FEEDBACK IS NEEDED!!!</title>
      <link>https://dennisgaravsky.blogspot.com/2018/02/usability-change-for-singlechoiceaction.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-yil9hzBcOEI/WibxpzqJOsI/AAAAAAAAGeM/Wicc24PaiSIBI7QiUukytYqXolUW2JACQCPcBGAYYCw/s72-c/survey-opinion-research-voting-fill-159353.jpeg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">34</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;We have incorporated the usability improvement from &lt;a href="http://dennisgaravsky.blogspot.com/2017/03/how-to-customize-new-object-action-with.html"&gt;my past post&lt;/a&gt;&amp;nbsp;in v18.1 by default. It affects &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/DevExpress.ExpressApp.Actions.SingleChoiceAction.class"&gt;SingleChoiceAction&lt;/a&gt; with &lt;i&gt;ShowItemsOnlyClick = False&lt;/i&gt; and &lt;i&gt;ItemType = ItemIsOperation &lt;/i&gt;&amp;nbsp;and should improve UX for the majority of our users.&amp;nbsp;We also want to enable the same behavior in an upcoming minor update (e.g., v17.2.6 or next). Our team would appreciate your feedback to help us decide on the latter.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-yil9hzBcOEI/WibxpzqJOsI/AAAAAAAAGeM/Wicc24PaiSIBI7QiUukytYqXolUW2JACQCPcBGAYYCw/s1600/survey-opinion-research-voting-fill-159353.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="585" data-original-width="940" height="248" src="https://2.bp.blogspot.com/-yil9hzBcOEI/WibxpzqJOsI/AAAAAAAAGeM/Wicc24PaiSIBI7QiUukytYqXolUW2JACQCPcBGAYYCw/s400/survey-opinion-research-voting-fill-159353.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;b&gt;Questions/Risks&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;/b&gt;&lt;div style="text-align: justify;"&gt;While this behavior is always desired for the &lt;i&gt;New&lt;/i&gt; &amp;amp; &lt;i&gt;Clone &lt;/i&gt;Actions, because their meaning is clear from the context, certain custom and built-in Actions like &lt;i&gt;Show In Report&lt;/i&gt;, &lt;i&gt;Change State&lt;/i&gt; may be affected when they keep only a single sub-item. Examples:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;u&gt;17.2.5 and older versions&lt;/u&gt;:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-KAPcWN8keT4/Wo1ZWRKjx2I/AAAAAAAAHT0/z8kmMrINF4EnIZVCOs0y4dqxvLlQ7AVaQCLcBGAs/s1600/MainDemo.Win.Ribbon_2018-02-21_14-34-34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="160" data-original-width="222" height="230" src="https://3.bp.blogspot.com/-KAPcWN8keT4/Wo1ZWRKjx2I/AAAAAAAAHT0/z8kmMrINF4EnIZVCOs0y4dqxvLlQ7AVaQCLcBGAs/s320/MainDemo.Win.Ribbon_2018-02-21_14-34-34.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-OprRXKz0a9A/Wo1YfBMv8YI/AAAAAAAAHTg/agg2pGRgOtA7w6-9Nh-tghWga0LGp27KACLcBGAs/s1600/FeatureCenter.Win_2018-02-21_11-53-56.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="220" data-original-width="385" height="182" src="https://1.bp.blogspot.com/-OprRXKz0a9A/Wo1YfBMv8YI/AAAAAAAAHTg/agg2pGRgOtA7w6-9Nh-tghWga0LGp27KACLcBGAs/s320/FeatureCenter.Win_2018-02-21_11-53-56.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;u&gt;18.1 (and 17.2.6+, if the majority likes it)&lt;/u&gt;:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/--8geonTzL4s/Wo1YrrL6SqI/AAAAAAAAHTk/bH2IYJY4-2Y0cxzm2FA-3rFVitTwpd86QCLcBGAs/s1600/MainDemo.Win_2018-02-21_11-57-39.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="163" data-original-width="373" height="172" src="https://2.bp.blogspot.com/--8geonTzL4s/Wo1YrrL6SqI/AAAAAAAAHTk/bH2IYJY4-2Y0cxzm2FA-3rFVitTwpd86QCLcBGAs/s400/MainDemo.Win_2018-02-21_11-57-39.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-A3ACWEJWN-Y/Wo1YwEZAekI/AAAAAAAAHTo/S6D68xpkeXYF2z0glwbdXcYbmCtwQe30wCLcBGAs/s1600/FeatureCenter.Win_2018-02-21_12-02-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="216" data-original-width="435" height="197" src="https://2.bp.blogspot.com/-A3ACWEJWN-Y/Wo1YwEZAekI/AAAAAAAAHTo/S6D68xpkeXYF2z0glwbdXcYbmCtwQe30wCLcBGAs/s400/FeatureCenter.Win_2018-02-21_12-02-01.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Notice that we've replaced a dropdown/triangle glyph with a simple button. We believe that this visual change is still not breaking (and thus is acceptable for a minor version), and it all is more logical than it was before. Before, when ShowItemsOnClick = False, you could still press the SingleChoiceAction's button blindly, i.e., without expanding its items using the triangle glyph. To help you avoid mistakes, the button is now displayed in the ChoiceActionItem's tooltip. You can also control the default Action item behavior using the DefaultItemMode property. If you do not like the new behavior, you can always set&amp;nbsp;ShowItemsOnClick = True in the Model Editor.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Question:&lt;/b&gt; &lt;span style="background-color: yellow;"&gt;Are you OK to have this new behavior as default in v17.2.6+ too?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Please answer with&amp;nbsp;+1 or -1 with comments in this post. If you need to test your real apps live before making a decision, I can provide you with v17.2 or v18.1 hotfix builds. Thanks for your help in advance.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;UPDATE:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Thanks to everyone! With v17.2.6, this behavior is enabled by default.&lt;/div&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">17.2.6</category>
      <category domain="http://www.blogger.com/atom/ns#">18.1</category>
      <category domain="http://www.blogger.com/atom/ns#">Actions</category>
      <category domain="http://www.blogger.com/atom/ns#">controllers</category>
      <category domain="http://www.blogger.com/atom/ns#">custom</category>
      <category domain="http://www.blogger.com/atom/ns#">feedback</category>
      <category domain="http://www.blogger.com/atom/ns#">new action</category>
      <category domain="http://www.blogger.com/atom/ns#">usability</category>
      <pubDate>Wed, 21 Feb 2018 11:58:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-6032977641644573181</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-02-21T11:58:00Z</dc:date>
    </item>
    <item>
      <title>Learning through reading the source code</title>
      <link>https://dennisgaravsky.blogspot.com/2018/02/learning-through-reading-source-code.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-uJzsYnx5hmE/V6JdEXL87iI/AAAAAAAAA68/ZyK_mSWH6h84STSwS2FHqb15NU__JogfQCPcBGAYYCw/s72-c/book.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;I will start this post with the new Visual Studio 2017 function, which I hope will be helpful for XAF developers too. I have both RTM and Preview versions installed, but I am mostly using the latter one for testing. The new function I spotted in their&amp;nbsp;&lt;a href="https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2017-preview-relnotes"&gt;&lt;i&gt;change logs&lt;/i&gt;&lt;/a&gt;&amp;nbsp;is called&amp;nbsp;"&lt;b&gt;View decompiled source definitions instead of metadata (C#)&lt;/b&gt;".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As you can guess from its name, it changes the very often used "&lt;b&gt;Go To Definition&lt;/b&gt;" command (F12) so that it displays the actual code&amp;nbsp;of a C# type or member who's source code is unavailable - very useful and convenient, IMHO. It is&amp;nbsp;decompiled using &lt;b&gt;ILSpy&lt;/b&gt;, the tool I have already been using for years as default program association for opening *.dll files -&amp;nbsp; partially the reason of why this news got my attention. This experimental feature is new in&amp;nbsp;&lt;b&gt;Visual Studio 2017 version 15.6 preview 2+&amp;nbsp;&lt;/b&gt;and it must be turned on explicitly using the&amp;nbsp;&lt;b&gt;Tools&amp;nbsp;&amp;gt;&amp;nbsp;Options&amp;nbsp; &amp;gt;&amp;nbsp;&amp;nbsp;Text Editor&amp;nbsp;&amp;gt;&amp;nbsp;C#&amp;nbsp;&amp;gt;&amp;nbsp;Advanced &amp;gt;&amp;nbsp;Enable navigation to decompiled sources&lt;/b&gt;&amp;nbsp;menu item.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-uJzsYnx5hmE/V6JdEXL87iI/AAAAAAAAA68/ZyK_mSWH6h84STSwS2FHqb15NU__JogfQCPcBGAYYCw/s1600/book.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="440" data-original-width="586" height="300" src="https://2.bp.blogspot.com/-uJzsYnx5hmE/V6JdEXL87iI/AAAAAAAAA68/ZyK_mSWH6h84STSwS2FHqb15NU__JogfQCPcBGAYYCw/s400/book.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;When you focus an external library API whose source code you do not own, and press &lt;b&gt;F12&lt;/b&gt;, Visual Studio will first show a boring confirmation dialog (BTW, can it be avoided at all?):&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-hhnYlMldbW0/WnuNAwUvgII/AAAAAAAAHNk/43FUwHRpc1ogAQal_fUFY0jLEJ3FKtuDQCLcBGAs/s1600/devenv_2018-02-08_02-34-06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="560" data-original-width="603" height="297" src="https://2.bp.blogspot.com/-hhnYlMldbW0/WnuNAwUvgII/AAAAAAAAHNk/43FUwHRpc1ogAQal_fUFY0jLEJ3FKtuDQCLcBGAs/s320/devenv_2018-02-08_02-34-06.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="text-align: left;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;and then the actual code for you to learn:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img alt="Viewing a decompiled definition" height="166" src="https://docs.microsoft.com/en-us/visualstudio/ide/media/go-to-definition-decompiled-sources.png" width="400" /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Check out the&amp;nbsp;&lt;a href="https://docs.microsoft.com/en-us/visualstudio/ide/go-to-and-peek-definition#view-metadata-as-source-code-c"&gt;&lt;i&gt;the official docs&lt;/i&gt;&lt;/a&gt;&amp;nbsp;for more details.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I am paying attention to this primarily because in my opinion, it is difficult to become a good&amp;nbsp; developer quickly without reading various source code (this is not specific to XAF itself), and this new function helps on this long path.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If we talk about XAF specifically, then for certain &lt;b&gt;advanced tasks&lt;/b&gt; like &lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113610/Concepts/UI-Construction/Using-a-Custom-Control-that-is-not-Integrated-by-Default"&gt;&lt;i&gt;creating complex and powerful custom XAF UI elements&lt;/i&gt;&lt;/a&gt; (e.g., compared to the default ones by covered scenarios), &lt;b&gt;researching and debugging the XAF source code is strongly advised for better efficiency or troubleshooting.&lt;/b&gt; That's because the XAF source code of standard List and Property Editors, Actions Containers, Templates and other UI elements contain dozens of perfect real-world examples and best practices to learn besides often simpler code examples in demos, support knowledge base and online documentation. Just look at "&lt;i&gt;c:\Program Files (x86)\DevExpress 17.1\Components\Sources\DevExpress.ExpressApp\DevExpress.ExpressApp.Web\Editors\ASPx\"&lt;/i&gt; and other folders and you will see what I mean.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Practically, these examples should help you better understand how things work under the hood, remember more and more good patterns, compare&amp;nbsp; your code with the best practices and spot errors, missing standard scenarios in your own implementation. For those who forgot, the DevExpress source code can also be installed by our installation, so no external tools are required to inspect it (a valid license is required, though):&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/KA18677/where-can-i-get-demo-source-code-folder-installed-assemblies-or-source-code-on-machines"&gt;&lt;i&gt;Where can I get demo source code folder, installed assemblies, or source code on machines with different OS versions&lt;/i&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Debugging the source code is also part of the same learning process and is no less important in my opinion. For this, there is a standard approach with symbols can be helpful:&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/KA18843/how-can-i-debug-devexpress-net-source-code-using-pdb-files"&gt;&lt;i&gt;How can I debug DevExpress .NET source code using PDB files&lt;/i&gt;&lt;/a&gt;. It is also no secret that there are alternative options with paid or free tools like dotPeek that can be helpful for external libraries code inspection and debugging as well. What I am describing may look too advanced for an average XAF developer, but believe me this is not rocket science and mastering those techniques can really save you a lot of time and nerves.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;See Also:&lt;/b&gt;&lt;/div&gt;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112670/eXpressApp-Framework"&gt;eXpressApp Framework&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&amp;nbsp;&amp;gt;&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112683/Concepts"&gt;Concepts&lt;/a&gt;&amp;nbsp;&amp;gt;&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112572/Concepts/Debugging-Testing-and-Error-Handling"&gt;Debugging, Testing and Error Handling&lt;/a&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">best practice</category>
      <category domain="http://www.blogger.com/atom/ns#">custom</category>
      <category domain="http://www.blogger.com/atom/ns#">customization</category>
      <category domain="http://www.blogger.com/atom/ns#">List Editor</category>
      <category domain="http://www.blogger.com/atom/ns#">Property Editor</category>
      <category domain="http://www.blogger.com/atom/ns#">Reusable Modules</category>
      <category domain="http://www.blogger.com/atom/ns#">what's new</category>
      <pubDate>Thu, 15 Feb 2018 00:10:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-7204670882555243128</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-02-15T00:10:00Z</dc:date>
    </item>
    <item>
      <title>Customization Forms and Model Editor Improvements - XAF v17.2.6</title>
      <link>https://dennisgaravsky.blogspot.com/2018/02/customization-forms-and-model-editor.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-tRQjoCr0kYE/WoS36-oMrOI/AAAAAAAAHQc/9CtsG4PU5woeFxI6aOQ3Ke1cXi-dCo_PACLcBGAs/s72-c/MainDemo.Win.Ribbon_2018-02-15_01-27-29.png" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">14</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;Customizing&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/112833/Getting-Started/Comprehensive-Tutorial/UI-Customization/Customize-the-View-Items-Layout"&gt;&lt;i&gt;Views layout&lt;/i&gt;,&lt;/a&gt;&amp;nbsp;e.g., making certain fields visible, changing their locations is something that XAF developers usually learn and appreciate from day one. That is because you can drastically change the UI of your app by just moving the mouse and without any coding and recompilation, also at runtime.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The next maintenance release (&lt;b&gt;v17.2.6&lt;/b&gt;) should come with a few minor improvements to the customization forms in DetailView, ListView and the Model Editor, which we hope will be welcomed by both developers and end-users as well.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-tRQjoCr0kYE/WoS36-oMrOI/AAAAAAAAHQc/9CtsG4PU5woeFxI6aOQ3Ke1cXi-dCo_PACLcBGAs/s1600/MainDemo.Win.Ribbon_2018-02-15_01-27-29.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="339" data-original-width="641" height="211" src="https://1.bp.blogspot.com/-tRQjoCr0kYE/WoS36-oMrOI/AAAAAAAAHQc/9CtsG4PU5woeFxI6aOQ3Ke1cXi-dCo_PACLcBGAs/s400/MainDemo.Win.Ribbon_2018-02-15_01-27-29.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li style="text-align: justify;"&gt;The customization forms will preserve their size and position. In the Model Editor, the settings will be stored permanently either in the Application Model (runtime) or in the *.SUO file (design time). The same form at runtime will maintain its settings during application life time only. This small difference is intentional: it should still be convenient to make several extensive customizations at once, but will certainly avoid any possible confusion and support calls from end-users saving and forgetting their forms in some unexpected place/state. This must work fine with multiple monitors, tabbed MDI and SDI, multiple root and nested Views (last closed form settings win). Anyway, should you notice anything unexpected here during your tests, please let us know.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;The customization forms will have the search box enabled by default. In real world applications with 100-200 items it should greatly save time on searching a required item.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;The customization forms will handle the Up/Down Arrow and Delete keys to quickly navigate or remove items in the main list. Again, it must save time in complex apps.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;The last item added from the Object Model dialog will be focused in all the customization forms. We experimented with this&amp;nbsp;&lt;i&gt;&lt;a href="http://dennisgaravsky.blogspot.com/2017/09/focusing-newly-added-grid-column-in.html"&gt;a few months ago&lt;/a&gt;&amp;nbsp;&lt;/i&gt;and decided to enable this helpful function everywhere.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Finally and not related to the customization forms, we have enabled the behavior shown&amp;nbsp;&lt;a href="http://dennisgaravsky.blogspot.com/2017/10/how-to-group-validation-rules-by.html" style="text-align: justify;"&gt;&lt;i&gt;in this blog&lt;/i&gt;&lt;/a&gt;&lt;span style="text-align: justify;"&gt;&amp;nbsp;post by default. Note that here we intentionally did not add another grouping level by namespace, not to complicate access, but we welcome to your thoughts on it.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-4xb-LsF4VxQ/WoSut4uJ6eI/AAAAAAAAHP4/x0to3VT6tVc0MLlmputp1SClzfJKfZl1wCEwYBhgL/s1600/MainDemo.Win.Ribbon_2018-02-15_00-48-13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="425" data-original-width="674" height="251" src="https://1.bp.blogspot.com/-4xb-LsF4VxQ/WoSut4uJ6eI/AAAAAAAAHP4/x0to3VT6tVc0MLlmputp1SClzfJKfZl1wCEwYBhgL/s400/MainDemo.Win.Ribbon_2018-02-15_00-48-13.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As always, my team and I welcome your feedback on these improvements if you want to test the nightly 17.2 build:&amp;nbsp;&lt;i&gt;&lt;a href="http://downloads.devexpress.com/HotFixes/DXP/v17.2" style="text-align: left;"&gt;DevExpressNETComponents-17.2.exe&lt;/a&gt;.&lt;/i&gt;&amp;nbsp;This test build does NOT yet include certain functionalities for the PivotChart, TreeListEditor and PivotGridListEditor, so test them with the GridListEdior and DetailView's layout for now. Should you have problems with the customization forms or anything else, we will be more than happy to listen and help.&lt;/div&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">17.2.6</category>
      <category domain="http://www.blogger.com/atom/ns#">customization</category>
      <category domain="http://www.blogger.com/atom/ns#">Model Editor</category>
      <category domain="http://www.blogger.com/atom/ns#">Object Model</category>
      <category domain="http://www.blogger.com/atom/ns#">usability</category>
      <category domain="http://www.blogger.com/atom/ns#">Views</category>
      <pubDate>Wed, 14 Feb 2018 21:52:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-5314309021444510768</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-02-14T21:52:00Z</dc:date>
    </item>
    <item>
      <title>Beware of the failures when uploading JPEG/JPG images using the System.Drawing.Image type properties - XAF ASP.NET WebForms v17.2.5</title>
      <link>https://dennisgaravsky.blogspot.com/2018/02/beware-of-failures-when-uploading.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-GVOLAeW7la4/VRQ4pVHbPyI/AAAAAAAAAgM/fdTy1hLVQpw51pEa6snlU8D6FUsvcVY8gCPcBGAYYCw/s72-c/5000576310_63351104a8.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;I want to draw your attention to the&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T604395/web-jpeg-jpg-images-cannot-be-uploaded-to-properties-of-the-system-drawing-image-type" style="background-color: yellow;"&gt;T604395: Web - JPEG/JPG images cannot be uploaded to properties of the System.Drawing.Image type&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;issue, which is already fixed in XAF&amp;nbsp;&lt;strong&gt;v17.2.6&lt;/strong&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;We apologize for the inconvenience, and if you cannot wait for the hotfix or did not plan to spend additional time on upgrade right now, please consider using the workarounds.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;strong&gt;Important notes and workarounds&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;From v14.2, Image Property Editors (both WinForms and ASP.NET) support images saved as byte array objects (in addition to previously supported&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.image(v=vs.110).aspx"&gt;System.Drawing.Image&lt;/a&gt;&amp;nbsp;objects). This allows us to significantly decrease web server memory consumption because the byte array can contain an image in a compressed format and the server does not have to unpack it.&amp;nbsp;The previous approach with the System.Drawing.Image&amp;nbsp;type property is still supported, but&amp;nbsp;&lt;strong&gt;we recommend that you migrate to the byte array&lt;/strong&gt;&amp;nbsp;storage to improve performance. Refer to the&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/113545/Concepts/Business-Model-Design/Data-Types-Supported-by-built-in-Editors/BLOB-Image-Properties/BLOB-Image-Properties-in-XPO"&gt;BLOB Image Properties in XPO&lt;/a&gt;&amp;nbsp; and&amp;nbsp;&lt;a data-ticket="T161967" href="https://www.devexpress.com/Support/Center/p/T161967.aspx"&gt;How to change the image property type from System.Drawing.Image to byte array&lt;/a&gt;&amp;nbsp;help topics&amp;nbsp;for more details.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-GVOLAeW7la4/VRQ4pVHbPyI/AAAAAAAAAgM/fdTy1hLVQpw51pEa6snlU8D6FUsvcVY8gCPcBGAYYCw/s1600/5000576310_63351104a8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="360" data-original-width="480" height="300" src="https://1.bp.blogspot.com/-GVOLAeW7la4/VRQ4pVHbPyI/AAAAAAAAAgM/fdTy1hLVQpw51pEa6snlU8D6FUsvcVY8gCPcBGAYYCw/s400/5000576310_63351104a8.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">17.2.5</category>
      <category domain="http://www.blogger.com/atom/ns#">asp.net</category>
      <category domain="http://www.blogger.com/atom/ns#">best practice</category>
      <category domain="http://www.blogger.com/atom/ns#">beware</category>
      <category domain="http://www.blogger.com/atom/ns#">images</category>
      <category domain="http://www.blogger.com/atom/ns#">web</category>
      <pubDate>Thu, 08 Feb 2018 13:35:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-3385885778531021314</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-02-08T13:35:00Z</dc:date>
    </item>
    <item>
      <title>Minor improvements to the ConditionalAppearance and ViewVariants modules - XAF v17.2.6</title>
      <link>https://dennisgaravsky.blogspot.com/2018/02/minor-improvements-to.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-EIeurvxmGOk/WnuKSUpab_I/AAAAAAAAHNU/s_6PzY-ZWEcXkmGJp9pIXzD5wruPEM6DACLcBGAs/s72-c/fix-it.jpg" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I also wanted to inform you of some "home work" done by us in &lt;b&gt;v17.2.6&lt;/b&gt; to improve your XAF development experience with these modules:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T579144/gridlisteditor-an-appearance-rule-has-no-effect-in-the-new-item-row-until-a-value-is"&gt;GridListEditor - An appearance rule has no effect in the new item row until a value is entered into any cell&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T601207/view-variants-module-listview-variant-always-takes-the-dataaccessmode-value-from-the"&gt;View Variants Module - ListView variant always takes the DataAccessMode value from the root node instead of own model differences, which may cause an exception due to an incompatible ListEditor type&lt;/a&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-EIeurvxmGOk/WnuKSUpab_I/AAAAAAAAHNU/s_6PzY-ZWEcXkmGJp9pIXzD5wruPEM6DACLcBGAs/s1600/fix-it.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="FreeImages.com/linusb4" border="0" data-original-height="800" data-original-width="1200" height="266" src="https://2.bp.blogspot.com/-EIeurvxmGOk/WnuKSUpab_I/AAAAAAAAHNU/s_6PzY-ZWEcXkmGJp9pIXzD5wruPEM6DACLcBGAs/s400/fix-it.jpg" title="FreeImages.com/linusb4" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;While the first scenario is quite specific (we heard about it from our largest XAF customer and a few others), the second one was likely encountered if you use the ViewVariants module. For instance, when having one variant as a grid operating in server mode while having another variant as tree, pivot, scheduler or whatever ListView editor that does not support server mode. In the past, this unsupported configuration could cause an exception at runtime. Starting with v17.2.6, it all works as the majority our users expect - at least we believe so based on the feedback we received. The online documentation on the ViewVariants module will be updated accordingly by release time, of course. Finally, many&amp;nbsp;&lt;span style="text-align: left;"&gt;thanks to Dave Hesketh, Martin Praxmarer, our MVPs, as well as other customers for bringing this to our attention.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If you cannot wait for the next maintenance&amp;nbsp;update (v17.2.6) to test both things, install this&amp;nbsp;&lt;strong&gt;night build&lt;/strong&gt;:&amp;nbsp;&lt;a href="http://downloads.devexpress.com/HotFixes/DXP/v17.2"&gt;DevExpressNETComponents-17.2.exe&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As always, my team and I are looking forward to hearing what you think, even on such small things and maybe others that could make your life a bit easier.&lt;br /&gt;&lt;span style="background-color: #e3a327; color: #666666; font-family: &amp;quot;arial&amp;quot; , &amp;quot;tahoma&amp;quot; , &amp;quot;helvetica&amp;quot; , &amp;quot;freesans&amp;quot; , sans-serif; font-size: 13px; text-align: justify;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">17.2.6</category>
      <category domain="http://www.blogger.com/atom/ns#">ConditionalAppearance</category>
      <category domain="http://www.blogger.com/atom/ns#">customization</category>
      <category domain="http://www.blogger.com/atom/ns#">ListView</category>
      <category domain="http://www.blogger.com/atom/ns#">new item row</category>
      <category domain="http://www.blogger.com/atom/ns#">server mode</category>
      <category domain="http://www.blogger.com/atom/ns#">ViewVariants</category>
      <pubDate>Thu, 08 Feb 2018 08:08:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-3955638636779233431</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-02-08T08:08:00Z</dc:date>
    </item>
    <item>
      <title>No Visual Studio designers for generic ViewController versions</title>
      <link>https://dennisgaravsky.blogspot.com/2018/02/no-visual-studio-designers-for-generic.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-fOpabTH8fsI/WnuC4QkSqNI/AAAAAAAAHNA/3GxbLcqbMuoZZNo_IKJdQ_P5-IxreFiBwCLcBGAs/s72-c/generic-controller-error.png" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total>
      <content:encoded>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;XAF Controllers are technically descendants of the&amp;nbsp;&lt;i&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.component?view=netframework-4.7"&gt;System.ComponentModel.Component&lt;/a&gt;&lt;/i&gt;&amp;nbsp;class,&amp;nbsp;primarily&amp;nbsp;to be smoothly integrated with the Visual Studio design time features. The standard&amp;nbsp;Component&amp;nbsp;designer does not support &lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/generics/"&gt;generic classes&lt;/a&gt; due to a&amp;nbsp;Visual Studio limitation:&amp;nbsp;&lt;a href="https://stackoverflow.com/questions/6877217/can-visual-studio-designer-show-classes-inheriting-generic-types"&gt;https://stackoverflow.com/questions/6877217/can-visual-studio-designer-show-classes-inheriting-generic-types&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This is a Microsoft functionality and we cannot do much about it on our side. So, if you have a class like this,&amp;nbsp;and try to double click it or use the Enter key for it in the Solution Explorer, you will receive this error, which is expected here:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-fOpabTH8fsI/WnuC4QkSqNI/AAAAAAAAHNA/3GxbLcqbMuoZZNo_IKJdQ_P5-IxreFiBwCLcBGAs/s1600/generic-controller-error.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="661" data-original-width="700" height="377" src="https://1.bp.blogspot.com/-fOpabTH8fsI/WnuC4QkSqNI/AAAAAAAAHNA/3GxbLcqbMuoZZNo_IKJdQ_P5-IxreFiBwCLcBGAs/s400/generic-controller-error.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This has always caused support calls to us from day one and still causes them today. Check out&amp;nbsp;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T584395/no-visual-designer-available-for-view-controllers-with-the-base-generic-base-class"&gt;this support article&lt;/a&gt;&amp;nbsp;to learn more about this situation and our previous recommendations.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Starting with &lt;b&gt;v17.2.6&lt;/b&gt;, we have removed the visual designer association&amp;nbsp;from the base&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/DevExpress.ExpressApp.ViewController~ViewType~.class"&gt;ViewController&amp;lt;ViewType&amp;gt;&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://documentation.devexpress.com/eXpressAppFramework/DevExpress.ExpressApp.ObjectViewController~ViewType~ObjectType~.class"&gt;ObjectViewController&amp;lt;ViewType, ObjectType&amp;gt;&lt;/a&gt;&amp;nbsp;classes&amp;nbsp;- they will always be opened directly in the Code Editor now. This should work fine in Visual Studio 2015, 2017 and newer versions. This does not work for Visual Studio 2013 and older versions and we decided not to investigate this further, because of the very low usage rate of these IDEs nowadays.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="https://www.blogger.com/null" name="_dx_frag_StartFragment"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;We believe that this new behavior is most expected here and really hope that it will not cause new questions&#x1f600;. Originally, generic View Controllers&amp;nbsp;were specially designed for users who prefer to do everything manually and want to have a more elegant and compact code. So, opening the Code Editor for such classes is naturally expected. Taking this opportunity, we also improved our online documentation to further promote generic View Controllers, since most of our Support Center answers, demos and docs use this concise code approach anyway.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;My team and I are looking forward to hear from you on what you think of the new behavior.&lt;/div&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">17.2.6</category>
      <category domain="http://www.blogger.com/atom/ns#">controllers</category>
      <category domain="http://www.blogger.com/atom/ns#">design time</category>
      <category domain="http://www.blogger.com/atom/ns#">designer</category>
      <category domain="http://www.blogger.com/atom/ns#">usability</category>
      <category domain="http://www.blogger.com/atom/ns#">ViewController</category>
      <category domain="http://www.blogger.com/atom/ns#">Views</category>
      <category domain="http://www.blogger.com/atom/ns#">Visual Studio</category>
      <pubDate>Wed, 07 Feb 2018 22:54:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1944926148473713281.post-550039649499869746</guid>
      <dc:creator>Dennis Garavsky</dc:creator>
      <dc:date>2018-02-07T22:54:00Z</dc:date>
    </item>
    <item>
      <title>Proof of Concept with DevExpress XAF Mobile</title>
      <link>https://sqlnetcon.blogspot.com/2016/06/proof-of-concept-with-devexpress-xaf.html</link>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-IAoUoypb0_s/V12dGCqAHII/AAAAAAAAAms/ge05SiQsZqATMtbkR-ODOu820J8qRM16gCLcB/s72-c/pocYcs01_web.png" height="72" width="72" />
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total>
      <content:encoded>&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;u&gt;Some words upfront:&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;DevExpress XAF Framework is one of our .net Dev Tools with it we creates lot of our Business Apps in the last&amp;nbsp;couple&amp;nbsp;of years.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;Now DevExpress was understand his customer needs to support also the Mobile&amp;nbsp;Devices.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;The mobile apps will reuse the database, as well as certain aspects of the data model, application logic and UI&amp;nbsp;settings of our existing XAF applications.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;More Information on XAF :(&lt;a href="https://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;https://www.devexpress.com/Products/NET/Application_Framework/&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;More Information on XAF Mobile :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;(&lt;a href="https://sqlnetcon.blogspot.de/2016/06/xaf-goes-mobile-ctp-version-ships-with.html" target="_blank"&gt;https://sqlnetcon.blogspot.de/2016/06/xaf-goes-mobile-ctp-version-ships-with.html&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;u&gt;Why i wrote this Post:&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;We need to test the new XAF Mobile Solutions for our LOB Apps&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;and try to find out how we use it, and how fast end&amp;nbsp;efficient&amp;nbsp;is the tool to meet our customer Requirement for Mobile Apps.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;let's&amp;nbsp;start: &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;Download the&amp;nbsp;latest&amp;nbsp;Version of DevExpress from Download Center&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;in my Case:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;eXpressApp Framework v15.2.9 ( currently i use 16.1. Beta )&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;Visual Studio 2015 &amp;nbsp;( it works from VS2012ff )&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;XAF Data Service Visual Studio Template Download it here :( &lt;a href="http://downloads.devexpress.com/XAF/MobilePreview/15.2.9/XAFDataServiceCS.vsix" target="_blank"&gt;C#&lt;/a&gt; / &lt;a href="http://downloads.devexpress.com/XAF/MobilePreview/15.2.9/XAFDataServiceVB.vsix" target="_blank"&gt;VB.net&lt;/a&gt; )&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;ASP.NET MVC 4 ( that's installed in VS2012 ff - in case not : &amp;nbsp;( &lt;a href="http://www.asp.net/mvc/mvc4" target="_blank"&gt;you can download it here &lt;/a&gt;) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;we use our Yoga Classroom Schedule Reservation System.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;This App is used for Yoga or Training Studios to handle Scheduling, Customer Communication, Contract Administration and Invoicing. &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;Here is the Sample Screen Shot&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-IAoUoypb0_s/V12dGCqAHII/AAAAAAAAAms/ge05SiQsZqATMtbkR-ODOu820J8qRM16gCLcB/s1600/pocYcs01_web.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="https://3.bp.blogspot.com/-IAoUoypb0_s/V12dGCqAHII/AAAAAAAAAms/ge05SiQsZqATMtbkR-ODOu820J8qRM16gCLcB/s400/pocYcs01_web.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;That's the Web UI.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;The Mobile App needs to following functions: A Student needs to check the next Events, Contract Details and Invoice/Payments. Event Reservation and Canceling must be possible.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;back to VS Solution and add the DataService to the Project.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-W0HkmPR_QX4/V16mxglN3DI/AAAAAAAAAnE/uHxLCXsCTfAnKxKJZ0kqN0AyYPMOwQMeACLcB/s1600/pocYcs01_dataSrv.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="https://4.bp.blogspot.com/-W0HkmPR_QX4/V16mxglN3DI/AAAAAAAAAnE/uHxLCXsCTfAnKxKJZ0kqN0AyYPMOwQMeACLcB/s400/pocYcs01_dataSrv.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;common pitfall:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;after adding the DataService you need to recompile one Time the Project to update the NUGet&amp;nbsp;Packages. Do nothing else odd .. ( a coffee is possible )&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;now change the Application Name in new MobileApplication.cs&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;in my Case:&amp;nbsp;pncYCRS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-CyHjlxmX5Ww/V16plbSJYnI/AAAAAAAAAnY/Q3lIxOvvf64rJEm1sxHxo07H36pG5swOgCLcB/s1600/pocYcs01_dataSrv02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://4.bp.blogspot.com/-CyHjlxmX5Ww/V16plbSJYnI/AAAAAAAAAnY/Q3lIxOvvf64rJEm1sxHxo07H36pG5swOgCLcB/s320/pocYcs01_dataSrv02.png" width="292" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;now let's add the Module Classes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;if you miss the Model Class in Tool Box,&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;validate the &lt;/span&gt;&lt;b style="font-family: &amp;quot;trebuchet ms&amp;quot;, sans-serif;"&gt;framework&lt;/b&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt; Settings in DataService Project in my Case all Projects&amp;nbsp;running&amp;nbsp;on &amp;nbsp;( Default for DataService is 4.0.0.0 but the DevExpress Default for new Projects is &amp;gt; 4.0.0.0 &amp;nbsp;so compare and set it all the same. &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;a href="https://4.bp.blogspot.com/-ZggzLgEY1Ms/V16xMEaNgvI/AAAAAAAAAns/pQU_vYDYXbEhxbS6mXDEokfTWpPBsd2rgCLcB/s1600/pocYcs01_dataSrv03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="52" src="https://4.bp.blogspot.com/-ZggzLgEY1Ms/V16xMEaNgvI/AAAAAAAAAns/pQU_vYDYXbEhxbS6mXDEokfTWpPBsd2rgCLcB/s320/pocYcs01_dataSrv03.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;now we can add the &lt;b&gt;Module&lt;/b&gt; to DataService Project:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-KmUvc5sJPfI/V16yXy8Q34I/AAAAAAAAAn4/MimnU2Wh2toQocBi_DEzb1DUBbNosHUPQCLcB/s1600/pocYcs01_dataSrv04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" src="https://1.bp.blogspot.com/-KmUvc5sJPfI/V16yXy8Q34I/AAAAAAAAAn4/MimnU2Wh2toQocBi_DEzb1DUBbNosHUPQCLcB/s320/pocYcs01_dataSrv04.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;after this Step the Module and all Reference Modules are loaded.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;now open the web.config in DataService Project and change the&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;b&gt;connectionString="" &lt;/b&gt;to your SQL Server and Database.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;DataServcice is ready.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;Now go back to the&amp;nbsp;Mobile App&amp;nbsp;and change Security, Views and&amp;nbsp;Navigation.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;MobileApplication&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;Security:&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;In our App we&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;use &lt;/span&gt;&lt;b style="font-family: &amp;quot;trebuchet ms&amp;quot;, sans-serif;"&gt;AuthenticationStandard&lt;/b&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt; so we need to modify the&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;b&gt;MobileApplication.cs&lt;/b&gt; file&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;protected override void &lt;b&gt;OnSetLogonParametersForUIBuilder&lt;/b&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // If your application requires authentication before building a mobile application UI,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // create a test user in DatabaseUpdater and provide these test user credentials through SecuritySystem.LogonParameters here.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AuthenticationStandardLogonParameters logonParameters = (AuthenticationStandardLogonParameters)SecuritySystem.LogonParameters;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logonParameters.UserName = "Admin";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logonParameters.Password = "";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //base.OnSetLogonParametersForUIBuilder();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;[edit:] is only needed for Simulator to run an App with Authentication&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;add the EventHandler for&amp;nbsp;&lt;b&gt;OnSetLogonParametersForUIBuilder()&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;in My PoC i use a very Secure way : Admin without Password ;-) &amp;nbsp;( don't do it in PROD ;-)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;u&gt;&lt;b style="font-family: &amp;quot;trebuchet ms&amp;quot;, sans-serif;"&gt;MobileApplication&amp;nbsp;&lt;/b&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;b&gt;Model Editor Views:&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;[edit:] in Mobile Application open the Model Editor&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;you need to modify the Property:&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;Mobile&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;visible = true&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;the Views with the&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-PEPdCp5yV7g/V1_gpd01TNI/AAAAAAAAAo0/WZKgIkkclsIzM_QcmZ1dXEZv0EL2FXHYQCLcB/s1600/pocYcs01_dataSrv09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="87" src="https://2.bp.blogspot.com/-PEPdCp5yV7g/V1_gpd01TNI/AAAAAAAAAo0/WZKgIkkclsIzM_QcmZ1dXEZv0EL2FXHYQCLcB/s400/pocYcs01_dataSrv09.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;don't forget to flat the Navigation,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;currently no SubItems are supported:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;u&gt;&lt;b style="font-family: &amp;quot;trebuchet ms&amp;quot;, sans-serif;"&gt;MobileApplication&amp;nbsp;&lt;/b&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;b&gt;Model Editor Navigation:&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-8xesVue71l4/V1_hGa8soLI/AAAAAAAAAo8/vyjHyz8OeXQsim0usX3j-KxVJG5ViqJxQCLcB/s1600/pocYcs01_dataSrv08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://2.bp.blogspot.com/-8xesVue71l4/V1_hGa8soLI/AAAAAAAAAo8/vyjHyz8OeXQsim0usX3j-KxVJG5ViqJxQCLcB/s320/pocYcs01_dataSrv08.png" width="212" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;save, compile&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;and&amp;nbsp;&lt;b&gt;Run the MobileApplication&lt;/b&gt;&amp;nbsp;&lt;b&gt;in VS Studio &amp;nbsp;( Start DEBUG&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;( Default Port is 62695 )&amp;nbsp;&lt;/span&gt;&lt;b style="font-family: &amp;quot;trebuchet ms&amp;quot;, sans-serif;"&gt;)&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b style="font-family: &amp;quot;trebuchet ms&amp;quot;, sans-serif;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;b style="font-family: &amp;quot;trebuchet ms&amp;quot;, sans-serif;"&gt;if the Browser is open, open a new TAB and paste the App Simulator URL&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://maindemo.cloudapp.net/Simulator/?appPage=/player.cshtml?app=http://localhost:62695/MetadataService.svc/AppConfig?dataServiceUrl=http://localhost:62695/DataService.svc" style="font-family: &amp;quot;trebuchet ms&amp;quot;, sans-serif;"&gt;http://maindemo.cloudapp.net/Simulator/?appPage=/player.cshtml?app=http://localhost:62695/MetadataService.svc/AppConfig?dataServiceUrl=http://localhost:62695/DataService.svc&lt;/a&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;and run the App Simulator:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;... so and drums .... ( the VS Studio is in Debug Mode at this Time &amp;nbsp;)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-G65Ky5R1V_s/V17EvZVXlII/AAAAAAAAAoY/QjRiGXlYAIkQnmhzDBR4Epp0ELyqLgXDACLcB/s1600/pocYcs01_Mobile01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://2.bp.blogspot.com/-G65Ky5R1V_s/V17EvZVXlII/AAAAAAAAAoY/QjRiGXlYAIkQnmhzDBR4Epp0ELyqLgXDACLcB/s320/pocYcs01_Mobile01.png" width="183" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;so a Student can now ( after the very secure Login ) set a seat in a Class Room ..&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;u&gt;Work Hours&amp;nbsp;spent&amp;nbsp;on this effort:&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;b&gt;4 hours &lt;/b&gt;&amp;nbsp;: Programming for DataService and configuration&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;b&gt;12 hours&lt;/b&gt; Model Design View Column shaping,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;Details Page Shaping to prepare the Mobile UX / UI.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot;, sans-serif;"&gt;&lt;b&gt;&lt;span style="color: red;"&gt;well done DevExpress !! I love it :-) &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot;, sans-serif;"&gt;my Next Steps&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;use the production Code base&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;add Mobile App there&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;deploy the Mobile App to App Store&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;prepare the PROD Environment with Load Balancer and 2 Web Servers&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;this point will be new Posts in next Days.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;so enjoy&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;Cheers Lars&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">.net</category>
      <category domain="http://www.blogger.com/atom/ns#">DevExpress</category>
      <category domain="http://www.blogger.com/atom/ns#">Mobile Solutions</category>
      <category domain="http://www.blogger.com/atom/ns#">XAF</category>
      <pubDate>Mon, 13 Jun 2016 14:39:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-4333179738132974798.post-7283693519548578619</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2016-06-13T14:39:00Z</dc:date>
    </item>
    <item>
      <title>XAF Goes Mobile: CTP Version Ships with v15.2.9</title>
      <link>https://sqlnetcon.blogspot.com/2016/06/xaf-goes-mobile-ctp-version-ships-with.html</link>
      <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total>
      <content:encoded>&lt;span style="background-color: #fefefe; color: #212121; line-height: 20px; white-space: pre-wrap;"&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;with the new Release of XAF we can provide our Solution also to Mobile Devices. So we reach a new State for all our Business Solutions. WIN, WEB and Mobile. That's awesome. Thank you DevExpress!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fefefe; color: #212121; line-height: 20px; white-space: pre-wrap;"&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://community.devexpress.com/blogs/eaf/15.2/xaf-mobile-apps-smartphones-blog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;img border="0" height="200" src="https://community.devexpress.com/blogs/eaf/15.2/xaf-mobile-apps-smartphones-blog.png" width="320" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="background-color: #fefefe; color: #212121; line-height: 20px; white-space: pre-wrap;"&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #212121; font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;span style="background-color: #fefefe; line-height: 20px; white-space: pre-wrap;"&gt;Some more infos about you can find on devexpress Web Site:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fefefe; color: #212121; line-height: 20px; white-space: pre-wrap;"&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: #fefefe; color: #212121; line-height: 20px; white-space: pre-wrap;"&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;a href="https://community.devexpress.com/blogs/eaf/archive/2016/04/21/xaf-goes-mobile.aspx" target="_blank"&gt;https://community.devexpress.com/blogs/eaf/archive/2016/04/21/xaf-goes-mobile.aspx&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;"&gt;Cheers Lars&lt;/span&gt;</content:encoded>
      <category domain="http://www.blogger.com/atom/ns#">DevExpress</category>
      <category domain="http://www.blogger.com/atom/ns#">Mobile Solutions</category>
      <category domain="http://www.blogger.com/atom/ns#">XAF</category>
      <pubDate>Sat, 11 Jun 2016 10:18:00 GMT</pubDate>
      <author>noreply@blogger.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-4333179738132974798.post-9059571987942798555</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2016-06-11T10:18:00Z</dc:date>
    </item>
    <item>
      <title>Smart hiding of the selection boxes in XAF web applications</title>
      <link>http://ZeroSharp.github.com/smart-hiding-of-the-selection-boxes-in-xaf-web-applications/</link>
      <content:encoded>&lt;p&gt;When an &lt;a href="https://www.devexpress.com/products/net/application_framework/"&gt;XAF&lt;/a&gt; list view has no selection-based actions available, the selection box still appears in the grid. Users get confused. In this post, we&amp;#8217;ll look at a workaround.&lt;/p&gt;

&lt;h2&gt;The problem&lt;/h2&gt;

&lt;p&gt;In the XAF MainDemo, lets make Departments read-only for the User role.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Updater.cs&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;userRole&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddTypePermissionsRecursively&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;(&lt;/span&gt;&lt;span class="n"&gt;SecurityOperations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SecurityPermissionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Deny&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;userRole&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddTypePermissionsRecursively&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;(&lt;/span&gt;&lt;span class="n"&gt;SecurityOperations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SecurityPermissionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Deny&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;userRole&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddTypePermissionsRecursively&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;Department&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;(&lt;/span&gt;&lt;span class="n"&gt;SecurityOperations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Delete&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SecurityPermissionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Deny&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Then start the web application, login as John and navigate to the Departments list view. There is a column selection box, but it serves no purpose. There are no actions that depend on a grid selection.&lt;/p&gt;

&lt;p&gt;&lt;span class='caption-wrapper'&gt;&lt;img class='caption' src='http://ZeroSharp.github.com/images/blog/selection-visibility-controller-001.png' width='' height='' title='Without the SelectionColumnVisibilityController'&gt;&lt;span class='caption-text'&gt;Without the SelectionColumnVisibilityController&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;The fix&lt;/h2&gt;

&lt;p&gt;Here is a controller which calculates whether there are any available actions which require one or more rows to be selected. If there are none, the selection box will not appear.&lt;/p&gt;

&lt;p&gt;Add the following controller to the MainDemo.Module.Web project. It hides the selection box if there are no actions which depend on a grid selection.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;SelectionColumnVisibilityController.cs&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;span class='line-number'&gt;36&lt;/span&gt;
&lt;span class='line-number'&gt;37&lt;/span&gt;
&lt;span class='line-number'&gt;38&lt;/span&gt;
&lt;span class='line-number'&gt;39&lt;/span&gt;
&lt;span class='line-number'&gt;40&lt;/span&gt;
&lt;span class='line-number'&gt;41&lt;/span&gt;
&lt;span class='line-number'&gt;42&lt;/span&gt;
&lt;span class='line-number'&gt;43&lt;/span&gt;
&lt;span class='line-number'&gt;44&lt;/span&gt;
&lt;span class='line-number'&gt;45&lt;/span&gt;
&lt;span class='line-number'&gt;46&lt;/span&gt;
&lt;span class='line-number'&gt;47&lt;/span&gt;
&lt;span class='line-number'&gt;48&lt;/span&gt;
&lt;span class='line-number'&gt;49&lt;/span&gt;
&lt;span class='line-number'&gt;50&lt;/span&gt;
&lt;span class='line-number'&gt;51&lt;/span&gt;
&lt;span class='line-number'&gt;52&lt;/span&gt;
&lt;span class='line-number'&gt;53&lt;/span&gt;
&lt;span class='line-number'&gt;54&lt;/span&gt;
&lt;span class='line-number'&gt;55&lt;/span&gt;
&lt;span class='line-number'&gt;56&lt;/span&gt;
&lt;span class='line-number'&gt;57&lt;/span&gt;
&lt;span class='line-number'&gt;58&lt;/span&gt;
&lt;span class='line-number'&gt;59&lt;/span&gt;
&lt;span class='line-number'&gt;60&lt;/span&gt;
&lt;span class='line-number'&gt;61&lt;/span&gt;
&lt;span class='line-number'&gt;62&lt;/span&gt;
&lt;span class='line-number'&gt;63&lt;/span&gt;
&lt;span class='line-number'&gt;64&lt;/span&gt;
&lt;span class='line-number'&gt;65&lt;/span&gt;
&lt;span class='line-number'&gt;66&lt;/span&gt;
&lt;span class='line-number'&gt;67&lt;/span&gt;
&lt;span class='line-number'&gt;68&lt;/span&gt;
&lt;span class='line-number'&gt;69&lt;/span&gt;
&lt;span class='line-number'&gt;70&lt;/span&gt;
&lt;span class='line-number'&gt;71&lt;/span&gt;
&lt;span class='line-number'&gt;72&lt;/span&gt;
&lt;span class='line-number'&gt;73&lt;/span&gt;
&lt;span class='line-number'&gt;74&lt;/span&gt;
&lt;span class='line-number'&gt;75&lt;/span&gt;
&lt;span class='line-number'&gt;76&lt;/span&gt;
&lt;span class='line-number'&gt;77&lt;/span&gt;
&lt;span class='line-number'&gt;78&lt;/span&gt;
&lt;span class='line-number'&gt;79&lt;/span&gt;
&lt;span class='line-number'&gt;80&lt;/span&gt;
&lt;span class='line-number'&gt;81&lt;/span&gt;
&lt;span class='line-number'&gt;82&lt;/span&gt;
&lt;span class='line-number'&gt;83&lt;/span&gt;
&lt;span class='line-number'&gt;84&lt;/span&gt;
&lt;span class='line-number'&gt;85&lt;/span&gt;
&lt;span class='line-number'&gt;86&lt;/span&gt;
&lt;span class='line-number'&gt;87&lt;/span&gt;
&lt;span class='line-number'&gt;88&lt;/span&gt;
&lt;span class='line-number'&gt;89&lt;/span&gt;
&lt;span class='line-number'&gt;90&lt;/span&gt;
&lt;span class='line-number'&gt;91&lt;/span&gt;
&lt;span class='line-number'&gt;92&lt;/span&gt;
&lt;span class='line-number'&gt;93&lt;/span&gt;
&lt;span class='line-number'&gt;94&lt;/span&gt;
&lt;span class='line-number'&gt;95&lt;/span&gt;
&lt;span class='line-number'&gt;96&lt;/span&gt;
&lt;span class='line-number'&gt;97&lt;/span&gt;
&lt;span class='line-number'&gt;98&lt;/span&gt;
&lt;span class='line-number'&gt;99&lt;/span&gt;
&lt;span class='line-number'&gt;100&lt;/span&gt;
&lt;span class='line-number'&gt;101&lt;/span&gt;
&lt;span class='line-number'&gt;102&lt;/span&gt;
&lt;span class='line-number'&gt;103&lt;/span&gt;
&lt;span class='line-number'&gt;104&lt;/span&gt;
&lt;span class='line-number'&gt;105&lt;/span&gt;
&lt;span class='line-number'&gt;106&lt;/span&gt;
&lt;span class='line-number'&gt;107&lt;/span&gt;
&lt;span class='line-number'&gt;108&lt;/span&gt;
&lt;span class='line-number'&gt;109&lt;/span&gt;
&lt;span class='line-number'&gt;110&lt;/span&gt;
&lt;span class='line-number'&gt;111&lt;/span&gt;
&lt;span class='line-number'&gt;112&lt;/span&gt;
&lt;span class='line-number'&gt;113&lt;/span&gt;
&lt;span class='line-number'&gt;114&lt;/span&gt;
&lt;span class='line-number'&gt;115&lt;/span&gt;
&lt;span class='line-number'&gt;116&lt;/span&gt;
&lt;span class='line-number'&gt;117&lt;/span&gt;
&lt;span class='line-number'&gt;118&lt;/span&gt;
&lt;span class='line-number'&gt;119&lt;/span&gt;
&lt;span class='line-number'&gt;120&lt;/span&gt;
&lt;span class='line-number'&gt;121&lt;/span&gt;
&lt;span class='line-number'&gt;122&lt;/span&gt;
&lt;span class='line-number'&gt;123&lt;/span&gt;
&lt;span class='line-number'&gt;124&lt;/span&gt;
&lt;span class='line-number'&gt;125&lt;/span&gt;
&lt;span class='line-number'&gt;126&lt;/span&gt;
&lt;span class='line-number'&gt;127&lt;/span&gt;
&lt;span class='line-number'&gt;128&lt;/span&gt;
&lt;span class='line-number'&gt;129&lt;/span&gt;
&lt;span class='line-number'&gt;130&lt;/span&gt;
&lt;span class='line-number'&gt;131&lt;/span&gt;
&lt;span class='line-number'&gt;132&lt;/span&gt;
&lt;span class='line-number'&gt;133&lt;/span&gt;
&lt;span class='line-number'&gt;134&lt;/span&gt;
&lt;span class='line-number'&gt;135&lt;/span&gt;
&lt;span class='line-number'&gt;136&lt;/span&gt;
&lt;span class='line-number'&gt;137&lt;/span&gt;
&lt;span class='line-number'&gt;138&lt;/span&gt;
&lt;span class='line-number'&gt;139&lt;/span&gt;
&lt;span class='line-number'&gt;140&lt;/span&gt;
&lt;span class='line-number'&gt;141&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;DevExpress.ExpressApp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;DevExpress.ExpressApp.Actions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;DevExpress.ExpressApp.Editors&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;DevExpress.ExpressApp.SystemModule&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;DevExpress.Web&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Linq&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;MainDemo.Module.Web.Controllers&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SelectionColumnVisibilityController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ViewController&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SelectionColumnVisibilityController&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;TargetViewType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ViewType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsSelectionColumnVisible&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isSelectionColumnRequired&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="c1"&gt;// remove checkbox if there are no available actions&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Controller&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Controllers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;allowEdit&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Frame&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;NestedFrame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;#38;&amp;#38;&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;NestedFrame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;ViewItem&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;PropertyEditor&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="n"&gt;allowEdit&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)((&lt;/span&gt;&lt;span class="n"&gt;PropertyEditor&lt;/span&gt;&lt;span class="p"&gt;)((&lt;/span&gt;&lt;span class="n"&gt;NestedFrame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;ViewItem&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;AllowEdit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ActionBase&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectionDependencyType&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;SelectionDependencyType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequireMultipleObjects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Active&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;IsActionInactiveBySelectionContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;IsActionDisabledBySelectionContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                                &lt;span class="n"&gt;isSelectionColumnRequired&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isSelectionColumnRequired&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;isSelectionColumnRequired&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsActionInactiveBySelectionContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ActionBase&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Active&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetKeys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ActionBase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequireMultipleObjectsContext&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ActionBase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequireSingleObjectContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Active&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsActionDisabledBySelectionContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ActionBase&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetKeys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ActionBase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequireMultipleObjectsContext&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ActionBase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequireSingleObjectContext&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ActionsCriteriaViewController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnabledByCriteriaKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnViewControlsCreated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OnViewControlsCreated&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;ASPxGridView&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ListView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Control&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ASPxGridView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;grid_Load&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataBound&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;grid_DataBound&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnDeactivated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OnDeactivated&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;ASPxGridView&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ListView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Control&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ASPxGridView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataBound&lt;/span&gt; &lt;span class="p"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;grid_DataBound&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt; &lt;span class="p"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;grid_Load&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;grid_Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;SetSelectionColumnVisibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;grid_DataBound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;SetSelectionColumnVisibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SetSelectionColumnVisibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isSelectionColumnVisible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IsSelectionColumnVisible&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;isSelectionColumnVisible&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ASPxGridView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;selectionBoxColumn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Columns&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OfType&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;GridViewCommandColumn&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;#62;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ShowSelectCheckbox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;selectionBoxColumn&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="n"&gt;selectionBoxColumn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Visible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Run the application again and see the difference. Now the grid looks like this. Notice, there is no longer a selection box on the row.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/selection-visibility-controller-002.png" title="With the SelectionColumnVisibilityController" &gt;&lt;/p&gt;

&lt;p&gt;By the way, this is how it looks with old-style XAF web apps.&lt;/p&gt;

&lt;p&gt;&lt;span class='caption-wrapper'&gt;&lt;img class='caption' src='http://ZeroSharp.github.com/images/blog/selection-visibility-controller-003.png' width='' height='' title='Without the SelectionColumnVisibilityController'&gt;&lt;span class='caption-text'&gt;Without the SelectionColumnVisibilityController&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class='caption-wrapper'&gt;&lt;img class='caption' src='http://ZeroSharp.github.com/images/blog/selection-visibility-controller-004.png' width='' height='' title='With the SelectionColumnVisibilityController'&gt;&lt;span class='caption-text'&gt;With the SelectionColumnVisibilityController&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/smart-hiding-of-the-selection-boxes-in-xaf-web-applications</guid>
    </item>
    <item>
      <title>An XAF workaround for 'Prevent this page from creating additional dialogs.'</title>
      <link>http://ZeroSharp.github.com/an-xaf-workaround-for-prevent-this-page-from-creating-additional-dialogs-dot/</link>
      <content:encoded>&lt;p&gt;Both Chrome and Firefox have a &amp;#8216;feature&amp;#8217; which allows a user to ignore future calls to &lt;code&gt;confirm()&lt;/code&gt;. Once this has been checked, any subsequent calls to &lt;code&gt;confirm()&lt;/code&gt; return false immediately without showing the window.&lt;/p&gt;

&lt;p&gt;In XAF, this behaviour prevents the application from working correctly. For instance, it becomes impossible to confirm a deletion.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/prevent-this-page-001.png"&gt;&lt;/p&gt;

&lt;p&gt;The following controller provides a work around. It injects some javascript into the page wrapping the call to &lt;code&gt;confirm()&lt;/code&gt;. The new code detects when the &lt;strong&gt;Prevent this page from creating additional dialogs&lt;/strong&gt; checkbox has been checked and returns true instead. The confirmation window still does not appear, but the XAF application works as if the user had pressed confirm instead of cancel.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;# HandleDisabledConfirmationsController.cs &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;span class='line-number'&gt;36&lt;/span&gt;
&lt;span class='line-number'&gt;37&lt;/span&gt;
&lt;span class='line-number'&gt;38&lt;/span&gt;
&lt;span class='line-number'&gt;39&lt;/span&gt;
&lt;span class='line-number'&gt;40&lt;/span&gt;
&lt;span class='line-number'&gt;41&lt;/span&gt;
&lt;span class='line-number'&gt;42&lt;/span&gt;
&lt;span class='line-number'&gt;43&lt;/span&gt;
&lt;span class='line-number'&gt;44&lt;/span&gt;
&lt;span class='line-number'&gt;45&lt;/span&gt;
&lt;span class='line-number'&gt;46&lt;/span&gt;
&lt;span class='line-number'&gt;47&lt;/span&gt;
&lt;span class='line-number'&gt;48&lt;/span&gt;
&lt;span class='line-number'&gt;49&lt;/span&gt;
&lt;span class='line-number'&gt;50&lt;/span&gt;
&lt;span class='line-number'&gt;51&lt;/span&gt;
&lt;span class='line-number'&gt;52&lt;/span&gt;
&lt;span class='line-number'&gt;53&lt;/span&gt;
&lt;span class='line-number'&gt;54&lt;/span&gt;
&lt;span class='line-number'&gt;55&lt;/span&gt;
&lt;span class='line-number'&gt;56&lt;/span&gt;
&lt;span class='line-number'&gt;57&lt;/span&gt;
&lt;span class='line-number'&gt;58&lt;/span&gt;
&lt;span class='line-number'&gt;59&lt;/span&gt;
&lt;span class='line-number'&gt;60&lt;/span&gt;
&lt;span class='line-number'&gt;61&lt;/span&gt;
&lt;span class='line-number'&gt;62&lt;/span&gt;
&lt;span class='line-number'&gt;63&lt;/span&gt;
&lt;span class='line-number'&gt;64&lt;/span&gt;
&lt;span class='line-number'&gt;65&lt;/span&gt;
&lt;span class='line-number'&gt;66&lt;/span&gt;
&lt;span class='line-number'&gt;67&lt;/span&gt;
&lt;span class='line-number'&gt;68&lt;/span&gt;
&lt;span class='line-number'&gt;69&lt;/span&gt;
&lt;span class='line-number'&gt;70&lt;/span&gt;
&lt;span class='line-number'&gt;71&lt;/span&gt;
&lt;span class='line-number'&gt;72&lt;/span&gt;
&lt;span class='line-number'&gt;73&lt;/span&gt;
&lt;span class='line-number'&gt;74&lt;/span&gt;
&lt;span class='line-number'&gt;75&lt;/span&gt;
&lt;span class='line-number'&gt;76&lt;/span&gt;
&lt;span class='line-number'&gt;77&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;DevExpress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExpressApp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;DevExpress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExpressApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Web&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;DevExpress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Internal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;NetModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Controllers&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;HandleDisabledConfirmationsController&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Controller&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;IsChrome&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;get&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RenderUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsChrome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;IsFirefox&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;get&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RenderUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsFirefox&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;protected&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;OnFrameAssigned&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OnFrameAssigned&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IsChrome&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;IsFirefox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;WebWindow&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Frame&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;WebWindow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomRegisterTemplateDependentScripts&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;window_CustomRegisterTemplateDependentScripts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;window_CustomRegisterTemplateDependentScripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CustomRegisterTemplateDependentScriptsEventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="c1"&gt;// wrapper for &amp;#39;confirm&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;WebWindow&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WebWindow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="c1"&gt;// Detect the user has checked the &amp;#39;prevent this page from creating additional dialogs&amp;#39;.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="c1"&gt;// In which case assume all confirmations are accepted, rather than the default rejected&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;confirmWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nativeConfirm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confirm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;timeBefore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;confirmBool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nativeConfirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;timeAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;timeAfter&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;timeBefore&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;#60;&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;confirmBool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;confirmBool&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;&amp;#60;/&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;#62;&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientScript&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegisterClientScriptBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetType&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;WrapConfirmations&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;confirmWrapper&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;protected&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;OnDeactivated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IsChrome&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;IsFirefox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;WebWindow&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Frame&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;WebWindow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomRegisterTemplateDependentScripts&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;window_CustomRegisterTemplateDependentScripts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OnDeactivated&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The controller works by timing the milliseconds to close the confirmation window. If it is less than 350 milliseconds we can assume the confirmation window never opened owing to the checkbox. In this scenario, it returns true (confirm) rather than false (cancel) in order for XAF to function correctly.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/an-xaf-workaround-for-prevent-this-page-from-creating-additional-dialogs-dot</guid>
    </item>
    <item>
      <title>DevExpress 2015.2 review part 2</title>
      <link>http://ZeroSharp.github.com/devexpress-15-dot-2-review-part-2/</link>
      <content:encoded>&lt;p&gt;This is the second and final dive into some of the new DevExpress XAF 2015.2 features. The &lt;a href="http://ZeroSharp.github.com/devexpress-15-dot-2-review-part-1/"&gt;first part&lt;/a&gt; covers the Report Designer and the new XML serialisation.&lt;/p&gt;

&lt;h2&gt;Batch editing&lt;/h2&gt;

&lt;p&gt;Another feature I&amp;#8217;m excited about is the support for batch editing within the web application grids.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s see what happens when combined with the validation rules. What happens if I edit two rows but only one has a validation problem - does the whole batch get rejected? Or just the row with the problem?&lt;/p&gt;

&lt;p&gt;First I modified the edit mode of the Tasks grid to &lt;code&gt;Batch&lt;/code&gt; via the model.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-15-2-review-001.png"&gt;&lt;/p&gt;

&lt;p&gt;Then I added a new &lt;code&gt;RuleRequiredField&lt;/code&gt; validation rule via the model.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-15-2-review-002.png"&gt;&lt;/p&gt;

&lt;p&gt;I started up the MainDemo application and navigated to the Tasks view and tried to delete the subject of multiple rows at the same time.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-15-2-review-003.png"&gt;&lt;/p&gt;

&lt;p&gt;I never even got to press Save because of another new 15.2 feature: &lt;a href="https://community.devexpress.com/blogs/eaf/archive/2015/11/24/xaf-validation-module-enhancements-for-windows-and-the-web-coming-soon-in-v15-2.aspx"&gt;inplace validation&lt;/a&gt;! The rules are being validated &lt;em&gt;without&lt;/em&gt; a round trip to the server!&lt;/p&gt;

&lt;p&gt;So let&amp;#8217;s try another way. &lt;em&gt;Inplace Validation&lt;/em&gt; does not work with all rule types, so I deleted my &lt;code&gt;RuleRequiredField&lt;/code&gt; from the model and instead added a new &lt;code&gt;RuleFromBoolProperty&lt;/code&gt; to the &lt;code&gt;DemoTask&lt;/code&gt; object as follows:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;[MemberDesignTimeVisibility(false)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;[RuleFromBoolProperty(&amp;#34;SubjectIsRequired&amp;#34;, &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    DefaultContexts.Save, &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    &amp;#34;Subject is required.&amp;#34;, &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    UsedProperties = &amp;#34;Subject&amp;#34;, &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    SkipNullOrEmptyValues = false)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;IsSubjectRequired&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;get&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsNullOrWhiteSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now we go back to the list view for Task and try to set multiple subjects to empty.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-15-2-review-004.png"&gt;&lt;/p&gt;

&lt;p&gt;Fantastic! This time the broken rules appear for each row and it is quite clear which message belongs to which object.&lt;/p&gt;

&lt;p&gt;So the batch editing makes use of inplace validation when it can, but handles more complex validation rules well too. This is an excellent combination because the inpalce validation will help to make the client seem very quick and responsive.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;This concludes my review of DevExpress 2015.2. We&amp;#8217;ve looked in some detail at two of the most impressive new features - the way reports are serialised and the improvements to client-side validation. These changes help with performance and ease of maintenance and I&amp;#8217;m very happy to see that the DevExpress team has focused on these areas. Looking forward to the 2016 releases!&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/devexpress-15-dot-2-review-part-2</guid>
    </item>
    <item>
      <title>DevExpress 2015.2 review part 1</title>
      <link>http://ZeroSharp.github.com/devexpress-15-dot-2-review-part-1/</link>
      <content:encoded>&lt;p&gt;Last week, DevExpress released 2015.2.3, their second major version of the year.&lt;/p&gt;

&lt;p&gt;There are already some good blog posts about the changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/Tips/1060260/Whats-New-for-XAF"&gt;Michael Bogaerts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimarx.com/blog/92/"&gt;Gustavo Marzioni&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.devexpress.com/Subscriptions/New-2015.xml?product=xaf"&gt;DevExpress What&amp;#8217;s New&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Rather than repeat general overviews provided in these, this two-part blog post is more of a &amp;#8216;deep dive&amp;#8217;. In particular I&amp;#8217;ll be looking at two of the new features in the expressApp Framework (XAF).
Today I&amp;#8217;ll cover the new XML serialisation in the report designer. Tomorrow&amp;#8217;s post will examine the new batch editing features.&lt;/p&gt;

&lt;h2&gt;Reports&lt;/h2&gt;

&lt;p&gt;&lt;span class='pullquote-right' data-pullquote='I&amp;#8217;m happy to report that v1 reports are still very much present.'&gt;
Reporting is definitely one of the areas where XAF has progressed the most in recent versions. There is now an in-browser report designer (since 14.2) and an alternative implementation of the reports (reports v2, since 13.2).&lt;/p&gt;

&lt;p&gt;In this release, I was a little worried that the support for Reports v1 would be deprecated, since our production system has over 100 custom reports and we have not yet looked for an easy way to migrate these to v2. I&amp;#8217;m happy to report that v1 reports are still very much present.
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;However there are also a number of new features in v2 Reports, not least of which is the ability to store the report&amp;#8217;s layout in XML. There&amp;#8217;s currently not a lot of documentation about the XML serialization, so let&amp;#8217;s dig in and see what we can discover.&lt;/p&gt;

&lt;h3&gt;XML serialization deep dive&lt;/h3&gt;

&lt;p&gt;First I ran the demo and ran the &lt;em&gt;Copy Predefined Report&lt;/em&gt; on the Contacts Report.&lt;/p&gt;

&lt;p&gt;Then I ran the report designer and added a dummy &lt;code&gt;OnBeforePrint()&lt;/code&gt; script to one of the table&amp;#8217;s cells.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;xrTableCell8_BeforePrint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Drawing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrintEventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;23&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Then, in the MainDemo&amp;#8217;s Updater.cs file, I placed the following code.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;reportData&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ObjectSpace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FindObject&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;ReportDataV2&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BinaryOperator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DisplayName&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Contacts Report&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;#38;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BinaryOperator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;IsPredefined&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;OperandValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reportData&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ReportDataProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReportsStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadReport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reportData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SaveLayoutToXml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;#34;C:\Temp\ContactsReport.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SaveLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;#34;C:\Temp\ContactsReport.repx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This creates two output files. One of them contains the familiar &lt;em&gt;.repx&lt;/em&gt; format. The other contains the newer &lt;em&gt;.xml&lt;/em&gt; serialization.&lt;/p&gt;

&lt;p&gt;The contents of the XML file is displayed below and is 77 lines long.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/f085bf10dd65ace5d229.js?file=ContactReport.xml'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;By comparison, the &lt;a href="https://gist.github.com/shamp00/f085bf10dd65ace5d229#file-contactsreport-repx"&gt;ContactReport.repx&lt;/a&gt; is 408 lines long and much harder to read.&lt;/p&gt;

&lt;p&gt;As you can see the XML file is &lt;em&gt;much&lt;/em&gt; smaller and simpler than the &lt;em&gt;.repx&lt;/em&gt; file. At first I didn&amp;#8217;t believe it contained all the necessary information, so I started up the MainDemo WinForms application, created a blank new report and imported the layout and the layout looks correct and the preview loads with data as expected.&lt;/p&gt;

&lt;h3&gt;Scripts&lt;/h3&gt;

&lt;p&gt;What about scripts? Are they serialized in the xml version? You bet. In the XML export you can see this has been serialised near the top of the file.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;ScriptsSource=
&lt;/span&gt;&lt;span class='line'&gt;   &amp;#34;&lt;span class="ni"&gt;&amp;#38;#xD;&amp;#38;#xA;&lt;/span&gt;private void xrTableCell8_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
&lt;/span&gt;&lt;span class='line'&gt;   {&lt;span class="ni"&gt;&amp;#38;#xD;&amp;#38;#xA;&lt;/span&gt;  var x = 23;&lt;span class="ni"&gt;&amp;#38;#xD;&amp;#38;#xA;&lt;/span&gt;}&lt;span class="ni"&gt;&amp;#38;#xD;&amp;#38;#xA;&lt;/span&gt;&amp;#34;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Setup&lt;/h3&gt;

&lt;p&gt;In order to use this new XML serialization of report layouts, you must set the ReportsV2 module to use it.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;reportsModuleV2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReportStoreMode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ReportStoreModes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;XML&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This will most likely invalidate any reports which have already been serialized to the database. There are some notes on how to fix this &lt;a href="https://www.devexpress.com/Support/Center/Question/Details/T275363"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Default for new projects&lt;/h3&gt;

&lt;p&gt;What about new projects? I created a new solution and chose &lt;em&gt;DevExpress 15.2 XAF Solution Wizard&lt;/em&gt; as the type of solution and added the reports module. Now when I navigate to the &lt;code&gt;WinApplication.Designer.cs&lt;/code&gt; file, I find:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// reportsModuleV2&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reportsModuleV2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReportDataType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DevExpress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Persistent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseImpl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReportDataV2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reportsModuleV2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReportStoreMode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DevExpress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExpressApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReportsV2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReportStoreModes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;XML&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So the default storage method for new projects is now XML.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;The XML serialisation looks like a considerable upgrade to the mechanism for storing, loading and saving reports. Now I just need to find a good way of converting my existing v1 reports&amp;#8230; Perhaps a future blog post.&lt;/p&gt;

&lt;h2&gt;Coming up&lt;/h2&gt;

&lt;p&gt;Tomorrow I&amp;#8217;ll be looking at the new &lt;a href="https://community.devexpress.com/blogs/eaf/archive/2015/11/24/xaf-validation-module-enhancements-for-windows-and-the-web-coming-soon-in-v15-2.aspx"&gt;batch editing in grids&lt;/a&gt; in more detail.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/devexpress-15-dot-2-review-part-1</guid>
    </item>
    <item>
      <title>Migrating a large web application from XAF 12.1 to 15.1 - Part 3</title>
      <link>http://ZeroSharp.github.com/migrating-a-large-web-application-from-xaf-12-dot-1-to-15-dot-1-part-3/</link>
      <content:encoded>&lt;p&gt;&lt;span class='pullquote-right' data-pullquote='I&amp;#8217;m happy to report there is a considerable improvement under load in version 15.1.'&gt;
This is the third part of a &lt;a href="http://ZeroSharp.github.com/migrating-a-large-web-application-from-xaf-12-dot-1-to-15-dot-1-part-2"&gt;series&lt;/a&gt; about migrating a large application from XAF 12.1 to XAF 15.1. In this part I will compare the results of a simple stress test between the versions.&lt;/p&gt;

&lt;p&gt;I have described in previous posts how to &lt;a href="http://ZeroSharp.github.com/load-testing-xaf-overview/"&gt;stress test XAF applications&lt;/a&gt;. One of our most basic tests is to simulate 25 users cycling through all the navigation tabs for an hour. I&amp;#8217;m happy to report there is a considerable improvement under load in version 15.1.&lt;/p&gt;

&lt;p&gt;(Note that we purposefully stress test against a single web application so that we can compare apples with apples. In production we have multiple instances load-balanced.)&lt;/p&gt;

&lt;p&gt;Here is an interactive summary of the 15.1 results:
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Here is version 15.1. There were zero errors and 382 completed scripts.&lt;/p&gt;

&lt;p&gt;By comparison, the same test against DevExpress 12.1 yielded only 258 completions. So 15.1 shows a 48% performance improvement over 12.1.&lt;/p&gt;

&lt;iframe class="cmd" src="https://load.wpm.neustar.biz/load/test/share/e4c5e109f8f04ceebd72cdb5c93eb1c2" width="1024" height="512"&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/migrating-a-large-web-application-from-xaf-12-dot-1-to-15-dot-1-part-3</guid>
    </item>
    <item>
      <title>Migrating a large web application from XAF 12.1 to 15.1 - Part 2</title>
      <link>http://ZeroSharp.github.com/migrating-a-large-web-application-from-xaf-12-dot-1-to-15-dot-1-part-2/</link>
      <content:encoded>&lt;p&gt;This is the second part of a &lt;a href="http://ZeroSharp.github.com/migrating-a-large-web-application-from-xaf-12-dot-1-to-15-dot-1-part-1"&gt;series&lt;/a&gt; about migrating a large application from XAF 12.1 to XAF 15.1.&lt;/p&gt;

&lt;p&gt;In the 13.1 release, DevExpress made a change to the way XAF &lt;code&gt;Validator&lt;/code&gt; class is used. It now requires an &lt;code&gt;IObjectSpace&lt;/code&gt; parameter corresponding to the object. It is needed to correctly evaluate any rules which are descendants of the &lt;code&gt;RuleSearchObjectProperties&lt;/code&gt;. These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RuleCombinationOfPropertiesIsUnique&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RuleIsReferenced&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RuleObjectExists&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RuleUniqueValue&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A lot of our code has been around for years now and the older parts rely heavily on &lt;code&gt;Session&lt;/code&gt; and &lt;code&gt;UnitOfWork&lt;/code&gt; instead of &lt;code&gt;IObjectSpace&lt;/code&gt; For the most part our application used &lt;code&gt;IObjectSpace&lt;/code&gt; only within &lt;code&gt;ViewControllers&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But there were several situations where we need the validator where we don&amp;#8217;t have an &lt;code&gt;IObjectSpace&lt;/code&gt;. For instance we sometimes need to validate from within &lt;a href="https://documentation.devexpress.com/#eXpressAppFramework/clsDevExpressPersistentBaseActionAttributetopic"&gt;method actions&lt;/a&gt; (decorated with the &lt;code&gt;ActionAttribute&lt;/code&gt;). For performance reasons, we pass criteria to our middleware and it uses a &lt;code&gt;UnitOfWork&lt;/code&gt; to run the method on each object. So in this case, there was no &lt;code&gt;IObjectSpace&lt;/code&gt; to pass to the XAF &lt;code&gt;Validator&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;span class='pullquote-right' data-pullquote='When writing code I often find myself having to decide between the &amp;#8216;quick&amp;#8217; fix and the &amp;#8216;right&amp;#8217; fix.'&gt;
Here I had a refactoring dilemma to solve. Either I need to rewrite all of the affected rules so that they no longer make use of the &lt;code&gt;IObjectSpace&lt;/code&gt;. For instance, I could use &lt;code&gt;RuleFromBoolProperty&lt;/code&gt; instead. In our application, this would mean rewriting about 50 rules. Or alternatively, I could go through the entire code base looking for &lt;code&gt;new UnitOfWork()&lt;/code&gt; and &lt;code&gt;new Session()&lt;/code&gt; and try to use an &lt;code&gt;IObjectSpace&lt;/code&gt; instead. When writing code I often find myself having to decide between the &amp;#8216;quick&amp;#8217; fix and the &amp;#8216;right&amp;#8217; fix. Here, moving to &lt;code&gt;IObjectSpace&lt;/code&gt; throughout is clearly the right fix and although it would take more time to implement, the system will be more in-line with best XAF practices throughout.
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt; Eventually, the refactoring was complete and all unit tests are passing. I was eager to run a multi-user load stress test against the 15.1 version to compare performance under load. I have described in previous posts how to &lt;a href="http://ZeroSharp.github.com/load-testing-xaf-overview/"&gt;stress test XAF applications&lt;/a&gt;. I&amp;#8217;ll be sharing the results in the next post.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/migrating-a-large-web-application-from-xaf-12-dot-1-to-15-dot-1-part-2</guid>
    </item>
    <item>
      <title>Migrating a large web application from XAF 12.1 to 15.1 - Part 1</title>
      <link>http://ZeroSharp.github.com/migrating-a-large-web-application-from-xaf-12-dot-1-to-15-dot-1-part-1/</link>
      <content:encoded>&lt;p&gt;I am the principal software architect for a treasury application in use by over 100 large multinational corporates. Upgrades are generally met with reluctance in the enterprise world and so we&amp;#8217;ve been somewhat stuck on an old version of the expressAppFramework.&lt;/p&gt;

&lt;p&gt;Recently I&amp;#8217;ve been pushing to move to the newer version and I have spent about three weeks migrating the substantial code base to XAF 15.1 and .NET 4.6.&lt;/p&gt;

&lt;p&gt;The steps are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the project converter tool.&lt;/li&gt;
&lt;li&gt;Try to compile. Identify the errors which are easily fixable (check with the &amp;#8216;breaking changes&amp;#8217; documents from DevExpress.)&lt;/li&gt;
&lt;li&gt;When in doubt, compare the libraries with a decompiler like .NET Reflector.&lt;/li&gt;
&lt;li&gt;Refactor where necessary (ensure you have unit tests for the behaviour you are changing).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;On this last point, my whole approach to refactoring has been shaped by Michael C. Feather&amp;#8217;s book &lt;a href="http://amzn.com/0131177052"&gt;&lt;em&gt;Working Effectively with Legacy Code&lt;/em&gt;&lt;/a&gt;. Highly recommended for anyone maintaining complex applications regardless of whether the code is legacy or not&amp;#8230;&lt;/p&gt;

&lt;p&gt;I was pleasantly surprised that I was very quickly able to get everything to compile and even run. The layout was not correct, but a lot of things worked straight away.&lt;/p&gt;

&lt;p&gt;I then had to spend some time restoring the customisations we&amp;#8217;d made to the default ASP.NET layout. In XAF 12.1 these were applied directly to &lt;em&gt;default.aspx.cs&lt;/em&gt; and &lt;em&gt;dialog.aspx.cs&lt;/em&gt;, but in 15.1 these no longer exist. Instead, you can customise layout by providing your own alternate templates. I was expecting this to be much harder, but by &lt;a href="https://documentation.devexpress.com/#eXpressAppFramework/CustomDocument112696"&gt;following the instructions in the documentation&lt;/a&gt; I managed to restore our layout quite easily.&lt;/p&gt;

&lt;p&gt;I still had a lot of failing unit tests. One seemingly minor change to XAF validation proved to be a lot of work to fix in our code.
Since 13.1, the XAF &lt;code&gt;Validator&lt;/code&gt; class now requires an &lt;code&gt;IObjectSpace&lt;/code&gt; parameter in the constructor. This was by far the biggest problem to fix and is the subject of the next blog post.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/migrating-a-large-web-application-from-xaf-12-dot-1-to-15-dot-1-part-1</guid>
    </item>
    <item>
      <title>Force a complete garbage collection in an ASP.NET application.</title>
      <link>http://ZeroSharp.github.com/force-a-complete-garbage-collection-in-an-asp-dot-net-application/</link>
      <content:encoded>&lt;p&gt;How can I force a full garbage collection easily within an ASP.NET application? The method here is for XAF web applications but the same approach should work with any ASP.NET app.&lt;/p&gt;

&lt;p&gt;&lt;span class='pullquote-right' data-pullquote='First up: Never mess with the .NET garbage collector.'&gt;
First up: Never mess with the .NET garbage collector.&lt;/p&gt;

&lt;p&gt;I sometimes mess with the garbage collector in .NET when I&amp;#8217;m trying to pin down some memory problem. Also, after &lt;a href="http://ZeroSharp.github.com/load-testing-xaf-part-1-deploying/"&gt;a load test&lt;/a&gt;, I prefer to force the garbage collector to collect everything it can so that I can check that the memory drops as expected.
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Garbage collection in .NET is complex and it is hard to be sure you&amp;#8217;ve done it correctly. &lt;a href="http://ZeroSharp.github.com///%20See%20http://blogs.msdn.com/b/tess/archive/2006/02/02/net-memory-my-object-is-not-rooted-why-wasn-t-it-garbage-collected.aspx"&gt;This ancient article by Tess Ferrandez&lt;/a&gt; pointed me in the following direction.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ForceGarbageCollection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="c1"&gt;/// This will garbage collect all generations (including large object), &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;GC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="c1"&gt;/// then execute any finalizers&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;GC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WaitForPendingFinalizers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="c1"&gt;/// and then garbage collect again to take care of all the objects that had finalizers.            &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;GC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;How can we easily trigger this routine in an XAF web application? First, add the following to the &lt;em&gt;Global.asax.cs&lt;/em&gt; file:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Global.asax.cs&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Application_BeginRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;shouldForceGarbageCollection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueryString&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ForceGC&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shouldForceGarbageCollection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;ForceGarbageCollection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#60;H1&amp;#62;Forced garbage collection OK!&amp;#60;/H1&amp;#62;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Then whenever you want to trigger a garbage collection, visit the following URL:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://.../Login.aspx?ForceGC=1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should see the text &lt;strong&gt;&amp;#8216;Forced garbage collection OK&amp;#8217;&lt;/strong&gt; in the top left of the browser window.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/force-a-complete-garbage-collection-in-an-asp-dot-net-application</guid>
    </item>
    <item>
      <title>Fixing slow debugging of ASP.NET applications</title>
      <link>http://ZeroSharp.github.com/fixing-slow-debugging-of-asp-dot-net-applications/</link>
      <content:encoded>&lt;p&gt;For a while I&amp;#8217;ve noticed an annoying slowness when debugging ASP.NET applications from Visual Studio. Just after every page load it takes about a second before the buttons become clickable. I noticed mostly when debugging XAF applications, perhaps because the pages are quite complex.&lt;/p&gt;

&lt;p&gt;Turns out the culprit is something called &lt;a href="http://www.asp.net/visual-studio/overview/2013/using-browser-link"&gt;Browser Link&lt;/a&gt; which was introduced in Visual Studio 2013. It&amp;#8217;s enabled by default.&lt;/p&gt;

&lt;p&gt;To turn it off you can turn it off from the menu:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/browserlink-001.png"&gt;&lt;/p&gt;

&lt;p&gt;Or you can add the following to your web.config file.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;#60;appSettings&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;vs:EnableBrowserLink&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;#60;/appSettings&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/fixing-slow-debugging-of-asp-dot-net-applications</guid>
    </item>
    <item>
      <title>DevExpress 14.2 review</title>
      <link>http://ZeroSharp.github.com/devexpress-14-dot-2-review/</link>
      <content:encoded>&lt;p&gt;&lt;span class='pullquote-right' data-pullquote='The truly outstanding new feature is the ASP.NET report writer'&gt;
This post is an overview of the brand new version XAF 14.2. The truly outstanding new feature is the ASP.NET report writer which is now available in all XAF applications.&lt;/p&gt;

&lt;p&gt;A few months ago, we lost a potential sale because the customer wanted the ability to create custom reports from within the browser. We told them it was impossible to provide a fully-fledged report designer within our web application - but the DevExpress guys have done it! And how! &lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;The web-based report designer&lt;/h2&gt;

&lt;p&gt;Let&amp;#8217;s fire up the MainDemo application and navigate to the reports view. The first thing to notice is that there is a new action &lt;em&gt;Show Report Designer&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-14-2-review-001.png"&gt;&lt;/p&gt;

&lt;p&gt;The designer action is disabled because the selected report is &lt;em&gt;predefined&lt;/em&gt;. Predefined reports are a feature of Reports v2 which were introduced in version 13.2 (&lt;a href="http://ZeroSharp.github.com/devexpress-13-dot-2-review-part-1"&gt;see my previous review&lt;/a&gt;). So first, we clone the existing predefined report. I renamed the copy (via the edit button) so that we can tell them apart.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-14-2-review-002.png"&gt;&lt;/p&gt;

&lt;p&gt;Now the &lt;em&gt;Show Report Designer&lt;/em&gt; action is enabled. Let&amp;#8217;s click it. &lt;em&gt;Whoa! That&amp;#8217;s one impressive user interface for a web application!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-14-2-review-003.png"&gt;&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s add a chart and a few controls. I thought (incorrectly) that the link to the domain model might be somewhat lacking because the report designer is not designed specifically for XAF (you can also use it with non-XAF ASP.NET or ASP.NET MVC applications) but navigating the available domain objects to select a property seemed very natural and simple.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-14-2-review-005.png"&gt;&lt;/p&gt;

&lt;p&gt;I had a few little mouse issues while trying to resize or move controls, and there were a couple of places where the interface seemed slightly sluggish, but these were very minor issues. In general the designer is slick and easy to use. I also had a little difficulty finding the &lt;em&gt;Save&lt;/em&gt; button, but here it is:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-14-2-review-007.png"&gt;&lt;/p&gt;

&lt;p&gt;And here&amp;#8217;s the live output after my modifications.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-14-2-review-006.png"&gt;&lt;/p&gt;

&lt;p&gt;You can also start from scratch with a new blank report.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-14-2-review-004.png"&gt;&lt;/p&gt;

&lt;p&gt;This report designer is an &lt;strong&gt;extremely impressive achievement&lt;/strong&gt;. I played around with it for over an hour and it did not crash once. I managed to implement everything I tried including a chart, a bar code and a new data field.&lt;/p&gt;

&lt;p&gt;There are some features missing from the web-based report designer compared to the Windows Forms version. Most significant is the ability to attach events and scripts to controls. Here is a &lt;a href="https://documentation.devexpress.com/#XtraReports/CustomDocument14651"&gt;full feature comparison table&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I had a quick look for the tools they used to implement it. It looks like it uses &lt;a href="https://jquery.com"&gt;jQuery&lt;/a&gt;, &lt;a href="https://jqueryui.com"&gt;jQuery.UI&lt;/a&gt; and &lt;a href="https://knockoutjs.com"&gt;knockout.js&lt;/a&gt; and you can automatically bundle the required libraries via a new setting in the web.config. There is &lt;a href="https://documentation.devexpress.com/#XtraReports/CustomDocument17558"&gt;some more information here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On the whole I am utterly impressed. Hats off to the DevExpress team!&lt;/p&gt;

&lt;h2&gt;Other new features in XAF 14.2&lt;/h2&gt;

&lt;p&gt;The new 14.2 includes several other new features. These include the ability to store user settings in the data store as well as improvements to the speed of the grids. For a full list of the new features and improvements see &lt;a href="https://community.devexpress.com/blogs/eaf/archive/2014/11/18/xaf-brand-new-module-amp-features-for-both-windows-and-the-web-coming-soon-in-v14-2.aspx"&gt;here&lt;/a&gt; and &lt;a href="https://community.devexpress.com/blogs/eaf/archive/2014/11/20/xaf-enhancements-to-existing-features-amp-performance-tuning-coming-soon-in-v14-2.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/devexpress-14-dot-2-review</guid>
    </item>
    <item>
      <title>ELMAH with DevExpress XAF</title>
      <link>http://ZeroSharp.github.com/elmah-with-devexpress-xaf/</link>
      <content:encoded>&lt;p&gt;&lt;a href="https://code.google.com/p/elmah/"&gt;ELMAH (Error Logging Modules and Handlers)&lt;/a&gt; is an open source library for logging unhandled exceptions. This post explains how to get it running with the &lt;a href="https://www.devexpress.com/Products/NET/Application_Framework/"&gt;DevExpress XAF&lt;/a&gt; main demo.&lt;/p&gt;

&lt;p&gt;A couple of amazing facts about ELMAH.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It has been around since 2004!&lt;/li&gt;
&lt;li&gt;It was written by &lt;a href="http://www.raboof.com/"&gt;Atif Aziz&lt;/a&gt; who happens to be an old school-friend from the International School of Geneva.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;XAF provides &lt;a href="https://documentation.devexpress.com/#xaf/CustomDocument2704"&gt;quite extensive error handling options&lt;/a&gt; out of the box, but I have found Elmah better suited to production environments because of the ability to remotely view the full error log.&lt;/p&gt;

&lt;h2&gt;Setting up&lt;/h2&gt;

&lt;p&gt;First, get the ELMAH package via NuGet into the MainDemo.Web project. ELMAH provides dozens of different methods of persisting the error log. For this example we&amp;#8217;ll choose one of the simplest. Make sure you select the &lt;em&gt;ELMAH on XML Log&lt;/em&gt; package.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-elmah-001.png"&gt;&lt;/p&gt;

&lt;p&gt;NuGet makes several automatic modifications to the &lt;em&gt;web.config&lt;/em&gt;. Unfortunately, these are not quite accurate enough for XAF. The changes you need to make are detailed below:&lt;/p&gt;

&lt;p&gt;Add a &lt;code&gt;&amp;#60;configSection&amp;#62;&lt;/code&gt; for ELMAH as alongside the existing devExpress one.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;web.config&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;configSections&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;sectionGroup&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;devExpress&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;#62;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;#60;/sectionGroup&amp;#62;&lt;/span&gt; &lt;span class="c"&gt;&amp;#60;!-- this should already exist--&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;sectionGroup&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;elmah&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;#62;&lt;/span&gt; &lt;span class="c"&gt;&amp;#60;!-- this is new--&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;section&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;security&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;requirePermission=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;false&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.SecuritySectionHandler, Elmah&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;section&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;errorLog&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;requirePermission=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;false&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorLogSectionHandler, Elmah&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;section&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;errorMail&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;requirePermission=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;false&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorMailSectionHandler, Elmah&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;section&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;errorFilter&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;requirePermission=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;false&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorFilterSectionHandler, Elmah&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nt"&gt;&amp;#60;/sectionGroup&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;/configSections&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Your &lt;code&gt;&amp;#60;system.webServer&amp;#62;&lt;/code&gt; section should look like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;web.config&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;system.webServer&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;handlers&amp;#62;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;#60;/handlers&amp;#62;&lt;/span&gt; &lt;span class="c"&gt;&amp;#60;!-- This is unchanged --&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;validation&lt;/span&gt; &lt;span class="na"&gt;validateIntegratedModeConfiguration=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;false&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;modules&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ASPxHttpHandlerModule&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DevExpress.Web.ASPxClasses.ASPxHttpHandlerModule, DevExpress.Web.v14.1, Version=14.1.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ErrorLog&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorLogModule, Elmah&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;preCondition=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;managedHandler&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ErrorMail&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorMailModule, Elmah&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;preCondition=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;managedHandler&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ErrorFilter&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorFilterModule, Elmah&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;preCondition=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;managedHandler&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;/modules&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;/system.webServer&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Add a &lt;code&gt;&amp;#60;location&amp;#62;&lt;/code&gt; for the path &lt;em&gt;elmah.axd&lt;/em&gt; (alongside the existing &lt;code&gt;&amp;#60;location&amp;#62;&lt;/code&gt; tags).&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;web.config&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;location&lt;/span&gt; &lt;span class="na"&gt;path=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;elmah.axd&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;inheritInChildApplications=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;system.web&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;httpHandlers&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;verb=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;POST,GET,HEAD&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;path=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;elmah.axd&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorLogPageFactory, Elmah&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;/httpHandlers&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="c"&gt;&amp;#60;!-- &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;        See http://code.google.com/p/elmah/wiki/SecuringErrorLogPages for &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;        more information on using ASP.NET authorization securing ELMAH.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;      &amp;#60;authorization&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;        &amp;#60;allow roles=&amp;#34;admin&amp;#34; /&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;        &amp;#60;deny users=&amp;#34;*&amp;#34; /&amp;#62;  &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;      &amp;#60;/authorization&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;      --&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;/system.web&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;system.webServer&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;handlers&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ELMAH&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;verb=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;POST,GET,HEAD&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;path=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;elmah.axd&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorLogPageFactory, Elmah&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;preCondition=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;integratedMode&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;/handlers&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;/system.webServer&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;/location&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Add a new &lt;code&gt;&amp;#60;elmah&amp;#62;&lt;/code&gt; section. I put mine just before the final &lt;code&gt;&amp;#60;/configuration&amp;#62;&lt;/code&gt; tag.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;web.config&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;elmah&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;errorLog&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.XmlFileErrorLog, Elmah&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;logPath=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;~/App_Data/Elmah.Errors&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="c"&gt;&amp;#60;!--&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;        See http://code.google.com/p/elmah/wiki/SecuringErrorLogPages for &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;        more information on remote access and securing ELMAH.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;    --&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;security&lt;/span&gt; &lt;span class="na"&gt;allowRemoteAccess=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;false&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;/elmah&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now modify &lt;em&gt;HttpModules.Web.Config&lt;/em&gt; to look like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;HttpModules.Web.Config&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;&lt;span class="cp"&gt;&amp;#60;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;#60;httpModules&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ASPxHttpHandlerModule&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DevExpress.Web.ASPxClasses.ASPxHttpHandlerModule, DevExpress.Web.v14.1, Version=14.1.7.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ErrorLog&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorLogModule, Elmah&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ErrorMail&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorMailModule, Elmah&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ErrorFilter&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Elmah.ErrorFilterModule, Elmah&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;#60;/httpModules&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now we need to extend XAF&amp;#8217;s standard error handling. Create a new class in the web application.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ElmahErrorHandling&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ErrorHandling&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LogException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ErrorInfo&lt;/span&gt; &lt;span class="n"&gt;errorInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LogException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errorInfo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errorInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;Elmah&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ErrorSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromCurrentContext&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Raise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errorInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And then modify &lt;em&gt;Global.asax.cs&lt;/em&gt; to instantiate the new class&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Application_Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;ErrorHandling&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ElmahErrorHandling&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#60;---this line is new&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;ASPxWebControl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallbackError&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;EventHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Application_Error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="cp"&gt;#if DEBUG&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;TestScriptsManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EasyTestEnabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="cp"&gt;#endif&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The complete files are available with the &lt;a href="https://github.com/ZeroSharp/Xaf_MainDemo_Elmah"&gt;source code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now run the application and trigger an unhandled exception. Change the URL to something that does not exist. Or open any detail view and modify the URL so that the Guid in the &lt;em&gt;ShortcutObjectKey&lt;/em&gt; is invalid (replace a digit with an &amp;#8216;X&amp;#8217;). Then the application error page appears.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-elmah-002.png"&gt;&lt;/p&gt;

&lt;p&gt;Then return to the application and change the URL to &lt;code&gt;Elmah.axd&lt;/code&gt;. You are looking at the log of all unhandled exceptions.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-elmah-003.png"&gt;&lt;/p&gt;

&lt;p&gt;And for each exception, you can view the full details of any logged exception including coloured stack trace and full server variables.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-elmah-004.png"&gt;&lt;/p&gt;

&lt;h2&gt;ELMAH options&lt;/h2&gt;

&lt;p&gt;By default, ELMAH is configured to disallow remote access to the error logs -  only a local user can get to &lt;em&gt;elmah.axd&lt;/em&gt;. If you take care of the security implications it can be very useful to enable remote access and  monitor the logs on your production servers.&lt;/p&gt;

&lt;p&gt;We chose to use an XML file for each error but ELMAH is entirely pluggable. There are dozens of alternatives for persisting the error log including Sql Server, an RSS feeds, to Twitter, even to &lt;a href="http://code.google.com/p/elmah/wiki/ProwlingErrors"&gt;an iPhone app&lt;/a&gt;. There are even third party sites such as &lt;a href="http://elmah.io"&gt;elmah.io&lt;/a&gt; who will host your error logs for you.&lt;/p&gt;

&lt;p&gt;One of the advantages of using XML files is that the files can be copied to another machine. If you look in &lt;em&gt;MainDemo.Web\App_Data\Elmah.Errors&lt;/em&gt;, you will find the resulting xml files.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-elmah-005.png"&gt;&lt;/p&gt;

&lt;p&gt;You can just copy these files to another installation&amp;#8217;s &lt;em&gt;Elmah.Errors&lt;/em&gt; folder and the log will show up when you visit &lt;em&gt;Elmah.axd&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;One final note. ELMAH was developed for ASP.NET applications and web services, but it is possible to get it to work with other types of applications such as Windows Forms, Windows Service or console applications. Check out &lt;a href="https://stackoverflow.com/questions/841451/using-elmah-in-a-console-application"&gt;this StackOverflow question&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The source code for this example is &lt;a href="https://github.com/ZeroSharp/Xaf_MainDemo_Elmah"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/elmah-with-devexpress-xaf</guid>
    </item>
    <item>
      <title>A web UI performance tip for XAF web applications</title>
      <link>http://ZeroSharp.github.com/a-web-ui-performance-tip-for-xaf-web-applications/</link>
      <content:encoded>&lt;p&gt;The purpose of this post is to raise your awareness of a toggle which exists in the &lt;a href="http://www.devexpress.com/xaf/"&gt;DevExpress XAF framework&lt;/a&gt; which can significantly improve UI performance in the web application.&lt;/p&gt;

&lt;p&gt;&lt;span class='pullquote-right' data-pullquote='In fact the general responsiveness of the entire web-application seems much better.'&gt;
The biggest XAF project I work with has one very complex business object. The layout for this screen includes about 100 properties, several nested tabs, some custom editors, several collection properties and a whole lot of &lt;a href="https://documentation.devexpress.com/#Xaf/CustomDocument3286"&gt;Conditional Appearance&lt;/a&gt; rules. It was very sluggish to navigate - it was taking several seconds to load the detail view and then it was very slow switching between tabs. Switching to edit mode was also slow.&lt;/p&gt;

&lt;p&gt;Last week, I almost accidentally changed the value of &lt;code&gt;DelayedViewItemsInitialization&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt; and noticed that the UI speed was much much better. In fact the general responsiveness of the entire web-application seems much better.&lt;/p&gt;

&lt;p&gt;In order to give it a whirl, navigate to the WebApplication.cs file (normally in the ApplicationCode subfolder of your web project) and modify the constructor as follows:&lt;/p&gt;

&lt;p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MainDemoWebApplication&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;InitializeComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DelayedViewItemsInitialization&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Certainly this is not without consequences, and I would urge a careful reading of the &lt;a href="https://documentation.devexpress.com/#xaf/DevExpressExpressAppXafApplication_DelayedViewItemsInitializationtopic"&gt;relevant documentation&lt;/a&gt;. To be honest, I still don&amp;#8217;t really understand why my detail view is so much slower without this change. I have tried to isolate the cause without much success and I will update this post if I find anything new. But if some of your detail views seem overly slow, certainly try it out.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/a-web-ui-performance-tip-for-xaf-web-applications</guid>
    </item>
    <item>
      <title>Provisioning a new development machine with BoxStarter</title>
      <link>http://ZeroSharp.github.com/provisioning-a-new-development-machine-with-boxstarter/</link>
      <content:encoded>&lt;p&gt;I&amp;#8217;ve been playing around with &lt;a href="http://boxstarter.org/"&gt;Boxstarter&lt;/a&gt; to configure my entire development environment with hardly any user intervention.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://ZeroSharp.github.com/images/blog/boxstarter-001.png" width="300"&gt;&lt;/p&gt;

&lt;p&gt;Here are the steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Windows 8.1 on a new machine.&lt;/li&gt;
&lt;li&gt;Login.&lt;/li&gt;
&lt;li&gt;Open a command prompt and enter the following.&lt;/li&gt;
&lt;/ol&gt;


&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;START http://boxstarter.org/package/nr/url?http://bit.ly/1kapDXI&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;That&amp;#8217;s it!&lt;/p&gt;

&lt;p&gt;Boxstarter will self-install via ClickOnce, asking for various confirmations and ultimately it will prompt you for your login password. (This gets saved and encrypted to allow for unattended reboots and re-logins during the installation). Then the real magic begins. Boxstarter downloads and installs all your tools and configures your environment, rebooting as necessary. An hour later your full development setup is installed, including Visual Studio 2013, any VS extensions, any other programs and tools, all the browsers you need, all critical Windows updates, etc. You just saved yourself a couple of days of work and a lot of hassle.&lt;/p&gt;

&lt;p&gt;How does Boxstarter know what to install? There&amp;#8217;s a Powershell script located at that bitly address. Let&amp;#8217;s take a look at the script.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;span class='line-number'&gt;36&lt;/span&gt;
&lt;span class='line-number'&gt;37&lt;/span&gt;
&lt;span class='line-number'&gt;38&lt;/span&gt;
&lt;span class='line-number'&gt;39&lt;/span&gt;
&lt;span class='line-number'&gt;40&lt;/span&gt;
&lt;span class='line-number'&gt;41&lt;/span&gt;
&lt;span class='line-number'&gt;42&lt;/span&gt;
&lt;span class='line-number'&gt;43&lt;/span&gt;
&lt;span class='line-number'&gt;44&lt;/span&gt;
&lt;span class='line-number'&gt;45&lt;/span&gt;
&lt;span class='line-number'&gt;46&lt;/span&gt;
&lt;span class='line-number'&gt;47&lt;/span&gt;
&lt;span class='line-number'&gt;48&lt;/span&gt;
&lt;span class='line-number'&gt;49&lt;/span&gt;
&lt;span class='line-number'&gt;50&lt;/span&gt;
&lt;span class='line-number'&gt;51&lt;/span&gt;
&lt;span class='line-number'&gt;52&lt;/span&gt;
&lt;span class='line-number'&gt;53&lt;/span&gt;
&lt;span class='line-number'&gt;54&lt;/span&gt;
&lt;span class='line-number'&gt;55&lt;/span&gt;
&lt;span class='line-number'&gt;56&lt;/span&gt;
&lt;span class='line-number'&gt;57&lt;/span&gt;
&lt;span class='line-number'&gt;58&lt;/span&gt;
&lt;span class='line-number'&gt;59&lt;/span&gt;
&lt;span class='line-number'&gt;60&lt;/span&gt;
&lt;span class='line-number'&gt;61&lt;/span&gt;
&lt;span class='line-number'&gt;62&lt;/span&gt;
&lt;span class='line-number'&gt;63&lt;/span&gt;
&lt;span class='line-number'&gt;64&lt;/span&gt;
&lt;span class='line-number'&gt;65&lt;/span&gt;
&lt;span class='line-number'&gt;66&lt;/span&gt;
&lt;span class='line-number'&gt;67&lt;/span&gt;
&lt;span class='line-number'&gt;68&lt;/span&gt;
&lt;span class='line-number'&gt;69&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='powershell'&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Boxstarter options&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$Boxstarter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RebootOk&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$true&lt;/span&gt; &lt;span class="c"&gt;# Allow reboots?&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$Boxstarter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NoPassword&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$false&lt;/span&gt; &lt;span class="c"&gt;# Is this a machine with no login password?&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$Boxstarter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoLogin&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$true&lt;/span&gt; &lt;span class="c"&gt;# Save my password securely and auto-login after a reboot&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Basic setup&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;Update-ExecutionPolicy&lt;/span&gt; &lt;span class="n"&gt;Unrestricted&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;Set-ExplorerOptions&lt;/span&gt; &lt;span class="n"&gt;-showHidenFilesFoldersDrives&lt;/span&gt; &lt;span class="n"&gt;-showProtectedOSFiles&lt;/span&gt; &lt;span class="n"&gt;-showFileExtensions&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;Enable-RemoteDesktop&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;Disable-InternetExplorerESC&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;Disable-UAC&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;Set-TaskbarSmall&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Test-PendingReboot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Invoke-Reboot&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Update Windows and reboot if necessary&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;Install-WindowsUpdate&lt;/span&gt; &lt;span class="n"&gt;-AcceptEula&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Test-PendingReboot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Invoke-Reboot&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Install Visual Studio 2013 Professional &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;VisualStudio2013Professional&lt;/span&gt; &lt;span class="n"&gt;-InstallArguments&lt;/span&gt; &lt;span class="n"&gt;WebTools&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Test-PendingReboot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Invoke-Reboot&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Visual Studio SDK required for PoshTools extension&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;VS2013SDK&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Test-PendingReboot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Invoke-Reboot&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;DotNet3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt; &lt;span class="c"&gt;# Not automatically installed with VS 2013. Includes .NET 2.0. Uses Windows Features to install.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Test-PendingReboot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Invoke-Reboot&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# VS extensions&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;Install-ChocolateyVsixPackage&lt;/span&gt; &lt;span class="n"&gt;PowerShellTools&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;visualstudiogallery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;msdn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;c9eb3ba8&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;0c59&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;4944&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;9a62&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;6eee37294597&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;112013&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;PowerShellTools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vsix&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;Install-ChocolateyVsixPackage&lt;/span&gt; &lt;span class="n"&gt;WebEssentials2013&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;visualstudiogallery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;msdn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;56633663&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;6799&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;41d7&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;9df7&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;0f2a504ca361&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;105627&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;31&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;WebEssentials2013&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vsix&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;Install-ChocolateyVsixPackage&lt;/span&gt; &lt;span class="n"&gt;T4Toolbox&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;visualstudiogallery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;msdn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;791817a4-eb9a&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;9c85&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;972cc60fd5aa&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;116854&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;T4Toolbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;12&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vsix&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;Install-ChocolateyVsixPackage&lt;/span&gt; &lt;span class="n"&gt;StopOnFirstBuildError&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;visualstudiogallery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;msdn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;91aaa139&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;5d3c&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;43a7-b39f&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;369196a84fa5&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;44205&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;StopOnFirstBuildError&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vsix&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# AWS Toolkit is now an MSI available here http://sdk-for-net.amazonwebservices.com/latest/AWSToolsAndSDKForNet.msi (no chocolatey package as of FEB 2014)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Install-ChocolateyVsixPackage AwsToolkit http://visualstudiogallery.msdn.microsoft.com/175787af-a563-4306-957b-686b4ee9b497&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;#Other dev tools&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;fiddler4&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;beyondcompare&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;ProcExp&lt;/span&gt; &lt;span class="c"&gt;#cinstm sysinternals&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;NugetPackageExplorer&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;windbg&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;Devbox-Clink&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;TortoiseHg&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;#cinstm VisualHG # Chocolatey package is corrupt as of Feb 2014 &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;linqpad4&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;TestDriven&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Net&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;ncrunch2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vs2013&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;#Browsers&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;googlechrome&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;firefox&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;#Other essential tools&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;7zip&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;adobereader&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinstm&lt;/span&gt; &lt;span class="n"&gt;javaruntime&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;#cinst Microsoft-Hyper-V-All -source windowsFeatures&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinst&lt;/span&gt; &lt;span class="n"&gt;IIS-WebServerRole&lt;/span&gt; &lt;span class="n"&gt;-source&lt;/span&gt; &lt;span class="n"&gt;windowsfeatures&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinst&lt;/span&gt; &lt;span class="n"&gt;IIS-HttpCompressionDynamic&lt;/span&gt; &lt;span class="n"&gt;-source&lt;/span&gt; &lt;span class="n"&gt;windowsfeatures&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinst&lt;/span&gt; &lt;span class="n"&gt;IIS-ManagementScriptingTools&lt;/span&gt; &lt;span class="n"&gt;-source&lt;/span&gt; &lt;span class="n"&gt;windowsfeatures&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;cinst&lt;/span&gt; &lt;span class="n"&gt;IIS-WindowsAuthentication&lt;/span&gt; &lt;span class="n"&gt;-source&lt;/span&gt; &lt;span class="n"&gt;windowsfeatures&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;Install-ChocolateyPinnedTaskBarItem&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="si"&gt;Boxstarter.programFiles86)&lt;/span&gt;&lt;span class="s2"&gt;\Google\Chrome\Application\chrome.exe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;Install-ChocolateyPinnedTaskBarItem&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="si"&gt;Boxstarter.programFiles86)&lt;/span&gt;&lt;span class="s2"&gt;\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Boxstarter works with &lt;a href="http://chocolatey.org/"&gt;Chocolatey&lt;/a&gt; and you can install anything with a Chocolatey package very easily. As you can see, most of the lines begin with &lt;code&gt;cinstm&lt;/code&gt; which is a shortcut for &lt;em&gt;install with Chocolatey if missing&lt;/em&gt;. You will notice there are also commands for configuring Windows and IIS options. There is plenty of additional information on the &lt;a href="http://boxstarter.org/WhyBoxstarter"&gt;Boxstarter&lt;/a&gt; documentation.&lt;/p&gt;

&lt;h2&gt;What about DevExpress?&lt;/h2&gt;

&lt;p&gt;Want to install your registered CodeRush and DexExpress components? Easy. Since the installation packages are not available on chocolatey, you will have to put them on a network share accessible from the newly provisioned machine.&lt;/p&gt;

&lt;p&gt;Then add the following to your boxstarter script:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='powershell'&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Set the following to the network location of the DevExpress installers&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$pathToDevExpressComponentsSetup&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\\somewhere\DevExpressComponents-13.2.7.exe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$pathToDevExpressComponentsSetup&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\\somewhere\DevExpressCodeRush-13.2.7.exe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Command line options for unattended installation&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# (/EULA is not required for versions earlier than 10.2.10)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$silentArgs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/Q /EMAIL:myaddress@company.com /CUSTOMERID:A1111 /PASSWORD:MYPASSWORD /DEBUG /EULA:accept&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Install .NET Components&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;Install-ChocolateyInstallPackage&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;DevExpressComponents_13.2&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;EXE&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$silentArgs&lt;/span&gt; &lt;span class="nv"&gt;$pathToDevExpressComponentsSetup&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;# Install CodeRush&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;Install-ChocolateyInstallPackage&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;DevExpressCodeRush_13.2&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;EXE&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$silentArgs&lt;/span&gt; &lt;span class="nv"&gt;$pathToDevExpressCodeRushSetup&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;strong&gt;Warning! don&amp;#8217;t put your DevExpress passwords on a public website.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are plenty of other ways of &lt;em&gt;launching&lt;/em&gt; Boxstarter. You can &lt;a href="https://chocolatey.org/packages/boxstarter"&gt;install Boxstarter via Chocolatey&lt;/a&gt;. You can &lt;a href="http://boxstarter.org/InstallingPackages"&gt;run Boxstarter remotely&lt;/a&gt;. If you are putting passwords in the installation script, you should choose one of the other options.&lt;/p&gt;

&lt;h2&gt;Advantages&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I save time!&lt;/li&gt;
&lt;li&gt;I can now version control the exact development environment along with the source code!&lt;/li&gt;
&lt;li&gt;Onboarding new and junior developers is much quicker.&lt;/li&gt;
&lt;li&gt;In a pinch, I can use this method to quickly provision a development machine with Azure or Amazon Web Services&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;One Last Hiccup&lt;/h2&gt;

&lt;p&gt;While I was testing my BoxStarter script I used the Windows 8.1 image from &lt;a href="http://www.modern.ie/"&gt;http://www.modern.ie/&lt;/a&gt;. Much later in the process I realised that Modern.IE only supplies 32-bit images and the chocolatey installer for Visual Studio extensions currently works only with 64-bit Windows.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/provisioning-a-new-development-machine-with-boxstarter</guid>
    </item>
    <item>
      <title>Glimpse with DevExpress XAF</title>
      <link>http://ZeroSharp.github.com/glimpse-with-devexpress-xaf/</link>
      <content:encoded>&lt;p&gt;I have finally got around to getting Glimpse working with XAF. Glimpse is an amazing extensible ASP.NET plug-in which gives you valuable information about what is going on within your server in production. It&amp;#8217;s also very pretty.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s jump right in and have a look at what XAF looks like with Glimpse running.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-016.png"&gt;&lt;/p&gt;

&lt;p&gt;That banner along the bottom of the screen is the Glimpse heads up display (HUD). Hovering over various sections of it pops up more information:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-019.png"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-018.png"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-017.png"&gt;&lt;/p&gt;

&lt;p&gt;If you click on the Glimpse icon in the bottom right, you get even more goodies. Here&amp;#8217;s the &lt;em&gt;Timeline&lt;/em&gt; view.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-011.png"&gt;&lt;/p&gt;

&lt;p&gt;And there are many other tabs available. The &lt;em&gt;Configuration&lt;/em&gt; tab shows the contents of the &lt;em&gt;web.config&lt;/em&gt; file.
&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-009.png"&gt;
Here&amp;#8217;s the &lt;em&gt;Control Tree&lt;/em&gt; tab:
&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-010.png"&gt;
The &lt;em&gt;Page Life Cycle&lt;/em&gt; tab:
&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-005.png"&gt;
The &lt;em&gt;Request&lt;/em&gt; tab:
&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-004.png"&gt;
The &lt;em&gt;Session&lt;/em&gt; tab:
&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-003.png"&gt;
And the &lt;em&gt;Trace&lt;/em&gt; tab including the DevExpress log items that were added to the trace during this page load:
&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-002.png"&gt;
As you can see, this is a very valuable glimpse into the server which can be turned on as needed in production.&lt;/p&gt;

&lt;h2&gt;Adding Glimpse to an XAF application&lt;/h2&gt;

&lt;p&gt;First install the Glimpse Nuget package into the project.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-001.png"&gt;&lt;/p&gt;

&lt;p&gt;The Nuget installation will make various incorrect changes to the web.config. The corrected sections are below:&lt;/p&gt;

&lt;p&gt;First, add Glimpse to the &lt;code&gt;&amp;#60;configSections&amp;#62;&lt;/code&gt;.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;web.config&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='diff'&gt;&lt;span class='line'&gt;  &amp;#60;configSections&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;    &amp;#60;sectionGroup name=&amp;#34;devExpress&amp;#34;&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;      &amp;#60;section name=&amp;#34;compression&amp;#34; requirePermission=&amp;#34;false&amp;#34; type=&amp;#34;DevExpress.Web.ASPxClasses.CompressionConfigurationSection, DevExpress.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;      &amp;#60;section name=&amp;#34;themes&amp;#34; type=&amp;#34;DevExpress.Web.ASPxClasses.ThemesConfigurationSection, DevExpress.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;      &amp;#60;section name=&amp;#34;settings&amp;#34; type=&amp;#34;DevExpress.Web.ASPxClasses.SettingsConfigurationSection, DevExpress.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;    &amp;#60;/sectionGroup&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="gi"&gt;+   &amp;#60;section name=&amp;#34;glimpse&amp;#34; type=&amp;#34;Glimpse.Core.Configuration.Section, Glimpse.Core&amp;#34; /&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &amp;#60;/configSections&amp;#62;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Next, &lt;code&gt;&amp;#60;system.webserver&amp;#62;&lt;/code&gt; should look like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='diff'&gt;&lt;span class='line'&gt;  &amp;#60;system.webServer&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;    &amp;#60;handlers&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;      &amp;#60;add name=&amp;#34;TestControls.axd_*&amp;#34; path=&amp;#34;TestControls.axd&amp;#34; verb=&amp;#34;*&amp;#34; type=&amp;#34;DevExpress.ExpressApp.Web.TestScripts.TestScriptsManager, DevExpress.ExpressApp.Web.v13.2, Version=13.2.5.0, culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; preCondition=&amp;#34;integratedMode&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;      &amp;#60;add name=&amp;#34;ImageResource.axd_*&amp;#34; path=&amp;#34;ImageResource.axd&amp;#34; verb=&amp;#34;*&amp;#34; type=&amp;#34;DevExpress.ExpressApp.Web.ImageResourceHttpHandler, DevExpress.ExpressApp.Web.v13.2, Version=13.2.5.0, culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; preCondition=&amp;#34;integratedMode&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;      &amp;#60;add name=&amp;#34;SessionKeepAliveReconnectHttpHandler&amp;#34; verb=&amp;#34;*&amp;#34; path=&amp;#34;SessionKeepAliveReconnect.aspx*&amp;#34; type=&amp;#34;DevExpress.ExpressApp.Web.SessionKeepAliveReconnectHttpHandler, DevExpress.ExpressApp.Web.v13.2, Version=13.2.5.0, culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; preCondition=&amp;#34;integratedMode&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;      &amp;#60;add name=&amp;#34;WebWindowTemplateHttpHandler&amp;#34; verb=&amp;#34;*&amp;#34; path=&amp;#34;*.aspx&amp;#34; type=&amp;#34;DevExpress.ExpressApp.Web.WebWindowTemplateHttpHandler, DevExpress.ExpressApp.Web.v13.2, Version=13.2.5.0, culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; preCondition=&amp;#34;integratedMode&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;      &amp;#60;add name=&amp;#34;ASPxUploadProgressHandler&amp;#34; verb=&amp;#34;GET,POST&amp;#34; path=&amp;#34;ASPxUploadProgressHandlerPage.ashx&amp;#34; type=&amp;#34;DevExpress.Web.ASPxUploadControl.ASPxUploadProgressHttpHandler, DevExpress.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; preCondition=&amp;#34;integratedMode&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;      &amp;#60;add name=&amp;#34;ReportExportResource.axd_*&amp;#34; preCondition=&amp;#34;integratedMode&amp;#34; verb=&amp;#34;*&amp;#34; path=&amp;#34;ReportExportResource.axd&amp;#34; type=&amp;#34;DevExpress.ExpressApp.Reports.Web.ReportExportHttpHandler, DevExpress.ExpressApp.Reports.Web.v13.2, Version=13.2.5.0, culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt; +    &amp;#60;add name=&amp;#34;Glimpse&amp;#34; path=&amp;#34;glimpse.axd&amp;#34; verb=&amp;#34;GET&amp;#34; type=&amp;#34;Glimpse.AspNet.HttpHandler, Glimpse.AspNet&amp;#34; preCondition=&amp;#34;integratedMode&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;    &amp;#60;/handlers&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;    &amp;#60;validation validateIntegratedModeConfiguration=&amp;#34;false&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;    &amp;#60;modules&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;      &amp;#60;add name=&amp;#34;ASPxHttpHandlerModule&amp;#34; type=&amp;#34;DevExpress.Web.ASPxClasses.ASPxHttpHandlerModule, DevExpress.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt; +    &amp;#60;add name=&amp;#34;Glimpse&amp;#34; type=&amp;#34;Glimpse.AspNet.HttpModule, Glimpse.AspNet&amp;#34; preCondition=&amp;#34;integratedMode&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;    &amp;#60;/modules&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;  &amp;#60;/system.webServer&amp;#62;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;NuGet added some incorrect definitions to &lt;code&gt;system.web&lt;/code&gt;. Make sure to restore this section to the DevExpress default:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;system.web&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;httpRuntime&lt;/span&gt; &lt;span class="na"&gt;requestValidationMode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;2.0&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;sessionState&lt;/span&gt; &lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;InProc&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;timeout=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;2&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;httpHandlers&lt;/span&gt; &lt;span class="na"&gt;configSource=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HttpHandlers.Web.Config&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;httpModules&lt;/span&gt; &lt;span class="na"&gt;configSource=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HttpModules.Web.Config&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And now we&amp;#8217;ll add the corrected changes to &lt;code&gt;HttpHandlers.Web.Config&lt;/code&gt; and &lt;code&gt;HttpModule.Web.Config&lt;/code&gt;&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;HttpHandlers.Web.Config&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='diff'&gt;&lt;span class='line'&gt;&amp;#60;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;&amp;#60;httpHandlers&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="gi"&gt;+ &amp;#60;add verb=&amp;#34;GET&amp;#34; path=&amp;#34;glimpse.axd&amp;#34; type=&amp;#34;Glimpse.AspNet.HttpHandler, Glimpse.AspNet&amp;#34; /&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &amp;#60;add verb=&amp;#34;*&amp;#34; path=&amp;#34;TestControls.axd&amp;#34; type=&amp;#34;DevExpress.ExpressApp.Web.TestScripts.TestScriptsManager, DevExpress.ExpressApp.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;  &amp;#60;add verb=&amp;#34;*&amp;#34; path=&amp;#34;ImageResource.axd&amp;#34; type=&amp;#34;DevExpress.ExpressApp.Web.ImageResourceHttpHandler, DevExpress.ExpressApp.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;  &amp;#60;add verb=&amp;#34;*&amp;#34; path=&amp;#34;SessionKeepAliveReconnect.aspx*&amp;#34; type=&amp;#34;DevExpress.ExpressApp.Web.SessionKeepAliveReconnectHttpHandler, DevExpress.ExpressApp.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;  &amp;#60;add verb=&amp;#34;*&amp;#34; path=&amp;#34;*.aspx&amp;#34; type=&amp;#34;DevExpress.ExpressApp.Web.WebWindowTemplateHttpHandler, DevExpress.ExpressApp.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;  &amp;#60;add verb=&amp;#34;GET,POST&amp;#34; path=&amp;#34;ASPxUploadProgressHandlerPage.ashx&amp;#34; validate=&amp;#34;false&amp;#34; type=&amp;#34;DevExpress.Web.ASPxUploadControl.ASPxUploadProgressHttpHandler, DevExpress.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;  &amp;#60;add verb=&amp;#34;*&amp;#34; path=&amp;#34;ReportExportResource.axd&amp;#34; type=&amp;#34;DevExpress.ExpressApp.Reports.Web.ReportExportHttpHandler, DevExpress.ExpressApp.Reports.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34; /&amp;#62;
&lt;/span&gt;&lt;span class='line'&gt;&amp;#60;/httpHandlers&amp;#62;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;HttpModules.Web.Config&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;&lt;span class="cp"&gt;&amp;#60;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;#60;httpModules&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;+ &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Glimpse&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Glimpse.AspNet.HttpModule, Glimpse.AspNet&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ASPxHttpHandlerModule&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DevExpress.Web.ASPxClasses.ASPxHttpHandlerModule, DevExpress.Web.v13.2, Version=13.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;#60;/httpModules&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Next, there is &lt;a href="https://github.com/Glimpse/Glimpse/issues/632"&gt;an outstanding problem&lt;/a&gt; with the current release version of the Glimpse ASP.NET NuGet package (1.6.0) which prevents it from working with the development webserver. (Apparently it&amp;#8217;s fixed in 1.7.0 which should be released soon). If you try to run MainDemo.Web you will get the following error:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Type 'System.Web.HttpContextWrapper' in assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However it works fine against IIS Express (or full IIS). Go to the MainDemo.Web and change the debug properties as follows:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-015.png"&gt;&lt;/p&gt;

&lt;p&gt;Then run the web application. Glimpse is off by default. In order to turn it on, you need to set a cookie, which you can do by navigating to &lt;code&gt;Glimpse.axd&lt;/code&gt;. This is the Glimpse configuration screen.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/xaf-with-glimpse-014.png"&gt;&lt;/p&gt;

&lt;h2&gt;Additional Glimpse extensions&lt;/h2&gt;

&lt;p&gt;Glimpse is extensible and there are &lt;a href="http://getglimpse.com/Packages"&gt;many additional plugins&lt;/a&gt; available. Many of these take the form of additional tabs with details about a particular aspect of your application: SQL Queries, Elmah errors, ASP.NET caching, logging, dependency injection, &lt;em&gt;etc.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;MainDemo Sample Project&lt;/h2&gt;

&lt;p&gt;I have uploaded a modified XAF MainDemo to this &lt;a href="https://github.com/ZeroSharp/Xaf_MainDemo_Glimpse"&gt;GitHub repository&lt;/a&gt; with all the above changes. (Don&amp;#8217;t forget to debug against IIS Express).&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/glimpse-with-devexpress-xaf</guid>
    </item>
    <item>
      <title>DevExpress 13.2 Review - Part 2</title>
      <link>http://ZeroSharp.github.com/devexpress-13-dot-2-review-part-2/</link>
      <content:encoded>&lt;p&gt;This is the second part of a review of the new DevExpress 13.2. In &lt;a href="http://ZeroSharp.github.com/devexpress-13-dot-2-review-part-1"&gt;the last part&lt;/a&gt; we looked in-depth at the new &lt;a href="https://community.devexpress.com/blogs/eaf/archive/2013/11/08/easy-large-reports-in-13-2-ctp-of-reportsv2-module.aspx"&gt;Reports V2&lt;/a&gt;. In this part I&amp;#8217;ll go over some of the other new features including the support for warnings and confirmations in the validation module.&lt;/p&gt;

&lt;h2&gt;Soft Validation Rules&lt;/h2&gt;

&lt;p&gt;With 13.2, DevExpress adds support for warning/confirmation messages to the validation engine. Warnings can be used to handle an unusual but valid data entry. An example would be:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The date of birth results in an age of over 100. Are you sure?&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Here the age of the contact is unusual but not impossible, so instead of prohibiting it entirely, we ask the user for confirmation before saving.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s add this rule to the MainDemo. Open the model and navigate to the Validation node. Add a &lt;code&gt;RuleValueComparison&lt;/code&gt; and configure it as follows&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-010.png"&gt;&lt;/p&gt;

&lt;p&gt;Of course you could instead also define the same rule with an attribute on the &lt;code&gt;Birthday&lt;/code&gt; property. Something like:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;[RuleValueComparison(&amp;#34;IsOlderThan100_Warning&amp;#34;, &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    DefaultContexts.Save,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    ValueComparisonType.GreaterThan, &amp;#34;AddYears(Now(), -100)&amp;#34;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    &amp;#34;Birthday makes this Contact older than 100. Are you sure?&amp;#34;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    ParametersMode.Expression,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    ResultType = ValidationResultType.Warning)]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Notice the new &lt;code&gt;ResultType&lt;/code&gt; parameter is set to &lt;code&gt;ValidationResultType.Warning&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Another typical use is to provide better handling of duplicates. Consider the following:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;[RuleCombinationOfPropertiesIsUnique(&amp;#34;DuplicateName_Warning&amp;#34;, &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    DefaultContexts.Save, &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    &amp;#34;LastName;FirstName&amp;#34;, &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    &amp;#34;There is already a Contact with the name {FullName}. Are you sure?&amp;#34;, &lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    ResultType = ValidationResultType.Warning)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Contact&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;//etc ...&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And then this is what happens if I try to add another John Nilsen.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-011.png"&gt;&lt;/p&gt;

&lt;p&gt;Another scenario would be to warn the user of something which needs attention. Such as &amp;#8220;Warning! You are running out of funds in your current account.&amp;#8221; Or &amp;#8220;Warning! Deleting this record will format your hard drive.&amp;#8221;&lt;/p&gt;

&lt;h3&gt;List Views&lt;/h3&gt;

&lt;p&gt;Soft validation also works in the list views, even with multiple selection, but there are a couple of things that don&amp;#8217;t work very smoothly yet and I would expect the web implementation to evolve over the coming releases.&lt;/p&gt;

&lt;p&gt;In order to demonstrate this I need to use a context which allows multiple selection such as deletion. So let&amp;#8217;s decorate our class with the following simple rule.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;[RuleCriteria(&amp;#34;Deletion_Warning&amp;#34;, DefaultContexts.Delete, &amp;#34;1=0&amp;#34;, &amp;#34;Warning! Are you sure?&amp;#34;, ResultType = ValidationResultType.Warning)]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Then I select all the contacts and press &lt;code&gt;Delete&lt;/code&gt;, after the confirmation window, I get this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-014.png"&gt;&lt;/p&gt;

&lt;h3&gt;Web Application&lt;/h3&gt;

&lt;p&gt;Soft validation is also available in the web application. This is what a warning looks like.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-015.png"&gt;&lt;/p&gt;

&lt;p&gt;I would prefer to see a &lt;em&gt;Confirm&lt;/em&gt; button rather than the current &lt;em&gt;Ignore&lt;/em&gt; checkbox since a button requires a single click to validate.&lt;/p&gt;

&lt;p&gt;When there are several warnings and errors at the same time, the current implementation displays them all. I think it would be preferable if warnings were not displayed unless there are no errors. Unless DevExpress provide this as an option soon, I will attempt to extend the controller in this regard in a future post.&lt;/p&gt;

&lt;h2&gt;Other new features&lt;/h2&gt;

&lt;p&gt;In the 13.2 release, there is now support for runtime extension of the model. DevExpress is calling this feature &lt;em&gt;custom fields&lt;/em&gt; and (again) it is marked as beta. This is not a feature I&amp;#8217;ve looked at, but there are a few other non-XAF DevExpress novelties which I&amp;#8217;d like to see working within XAF. These include &lt;a href="https://www.devexpress.com/Subscriptions/New-2013-v2-Beta.xml?product=aspnet#ctl00_ctl00_Content_Content_ctl659"&gt;new themes&lt;/a&gt; and &lt;a href="https://www.devexpress.com/Subscriptions/New-2013-v2-Beta.xml?product=aspnet#ctl00_ctl00_Content_Content_ctl660"&gt;support for grid batch editing&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;One warning&lt;/h2&gt;

&lt;p&gt;&lt;img class="left" src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-001.png"&gt;
&lt;img class="right" src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-002.png"&gt;
The default directories for the installation have changed again. I&amp;#8217;m sure DevExpress has some good reason for this, but if, like me, you have several different versions installed you end up with a confusing directory tree. Whenever this happens I always end up having to modify build scripts and config files so that all my tools work as expected. For those of you who use Red Gate&amp;#8217;s &lt;em&gt;.NET Reflector&lt;/em&gt;, you can find my config file &lt;a href="https://gist.github.com/shamp00/7748150"&gt;in this gist&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Conclusions&lt;/h2&gt;

&lt;p&gt;For the 13.2 release, DevExpress have focused on making the existing functionality work better rather than developing new modules.&lt;/p&gt;

&lt;p&gt;Better reports. Better validation. A better framework all round.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/devexpress-13-dot-2-review-part-2</guid>
    </item>
    <item>
      <title>DevExpress 13.2 Review - Part 1</title>
      <link>http://ZeroSharp.github.com/devexpress-13-dot-2-review-part-1/</link>
      <content:encoded>&lt;p&gt;The first version of XAF I ever installed was called &lt;em&gt;eXpressApp-1.0.CTP2.exe&lt;/em&gt; in July 2006! It has certainly come a long way since then.&lt;/p&gt;

&lt;p&gt;This post is the first part of an overview of the brand new version XAF 13.2 which will be released any day now. This part is an in-depth review of the new report writer features (still in beta).&lt;/p&gt;

&lt;h2&gt;Reports V2&lt;/h2&gt;

&lt;p&gt;Prior to this version, XAF reports were not source code. They were objects serialized to a file and then loaded into the database during initialisation. This has a lot of shortcomings some of which I have addressed in previous &lt;a href="http://ZeroSharp.github.com/making-xaf-reports-even-better-part-1/"&gt;blog posts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But now finally it is now possible to build XAF reports directly from Visual Studio. DevExpress is calling this &lt;a href="https://community.devexpress.com/blogs/eaf/archive/2013/11/08/easy-large-reports-in-13-2-ctp-of-reportsv2-module.aspx"&gt;Reports V2&lt;/a&gt; and it largely supersedes my previous workarounds. The immediate advantages of Reports V2 are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build time syntax checking&lt;/li&gt;
&lt;li&gt;Easily merge/compare report versions&lt;/li&gt;
&lt;li&gt;Painless version control of reports&lt;/li&gt;
&lt;li&gt;Better unit testing possibilities&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Let&amp;#8217;s have a look at the details. DevExpress have provided us with a new sample project called &lt;em&gt;ReportsV2Demo&lt;/em&gt;. The interesting part of the project solution is here:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-003.png"&gt;&lt;/p&gt;

&lt;p&gt;Notice that there are two folders containing reports. &lt;em&gt;PredefinedEditableReports&lt;/em&gt; contains V1 reports. That is, the report is serialised as a string and loaded into the database during initialisation. If we look at the source for one of these, here is what it looks like:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;ReportV2Demo.Module.PredefinedEditableReports&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrdinalReportResource&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;ReportLayout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;/// &amp;#60;XRTypeInfo&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;///   &amp;#60;AssemblyFullName&amp;#62;DevExpress.XtraReportsVSuffix, Version=dllVersion, Culture=neutral, PublicKeyToken=dllPublicKeyToken&amp;#60;/AssemblyFullName&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;///   &amp;#60;AssemblyLocation&amp;#62;C:\Windows\Microsoft.Net\assembly\GAC_MSIL\DevExpress.XtraReportsVSuffix\v4.0_dllVersion__dllPublicKeyToken\DevExpress.XtraReportsVSuffix.dll&amp;#60;/AssemblyLocation&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;///   &amp;#60;TypeName&amp;#62;DevExpress.XtraReports.UI.XtraReport&amp;#60;/TypeName&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;///   &amp;#60;Localization&amp;#62;en-US&amp;#60;/Localization&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;///   &amp;#60;Version&amp;#62;VersionShort&amp;#60;/Version&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;///   &amp;#60;References&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;///     &amp;#60;Reference Path=&amp;#34;&amp;#34;C:\Windows\Microsoft.Net\assembly\GAC_MSIL\DevExpress.Persistent.BaseVSuffix\v4.0_dllVersion__dllPublicKeyToken\DevExpress.Persistent.BaseVSuffix.dll&amp;#34;&amp;#34; /&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;///     &amp;#60;Reference Path=&amp;#34;&amp;#34;C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll&amp;#34;&amp;#34; /&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;/// etc.&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The second folder, &lt;em&gt;PredefinedReadonlyReports&lt;/em&gt; contains the V2 reports. With these reports, we can right-click and &lt;strong&gt;View Designer&lt;/strong&gt; and up pops the XtraReport designer.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-004.png"&gt;&lt;/p&gt;

&lt;p&gt;Now I can make changes to my report within Visual Studio. In theory I can preview the report and view the HTML output. However, in the beta (13.2.4) the Preview view prints the report correctly but fails to fetch any data so all the fields are empty (maybe this is by design).&lt;/p&gt;

&lt;p&gt;(Actually, I think the names of these folders could be improved. Maybe XafReports vs. XtraReports. Or RuntimeReports vs. DesigntimeReports.)&lt;/p&gt;

&lt;p&gt;With respect to event scripts which in the past were particularly arduous to maintain, we now have two options.&lt;/p&gt;

&lt;h3&gt;Scripts option 1 - Use serialized scripts&lt;/h3&gt;

&lt;p&gt; Firstly, you can continue to use the scripts as before. You can use Visual Studio&amp;#8217;s &lt;em&gt;Properties&lt;/em&gt; window to navigate to the script you need and then add the necessary code in the custom editor.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-005.png"&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, this is not the best from a maintenance perspective. The Scripts code editor view is not at all comparable to Visual Studio. No Intellisense. No CodeRush. In addition, the script itself gets serialized to a string.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ScriptsSource&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;\r\nprivate void xrLabel2_BeforePrint(object sender,System.Drawing.Printing.PrintE&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s"&gt;&amp;#34;ventArgs e) {\r\n    string something = \&amp;#34;something\&amp;#34;;\r\n}\r\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So unfortunately this approach does not improve things much with regard to compile-time syntax checking or code merging/version control.&lt;/p&gt;

&lt;h3&gt;Scripts option 2 - Move the scripts to the C# file&lt;/h3&gt;

&lt;p&gt;Now that the report is more like an &lt;code&gt;XtraReport&lt;/code&gt;, we can attach an event in code. To test it I&amp;#8217;ll replace the output of the &lt;em&gt;First name&lt;/em&gt; with the current time.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;XtraReportOrdinary&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DevExpress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;XtraReports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;XtraReport&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;XtraReportOrdinary&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;InitializeComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;xrLabel2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BeforePrint&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;xrLabel2_BeforePrint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;xrLabel2_BeforePrint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Drawing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrintEventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="c1"&gt;// Today&amp;#39;s date and time&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;xrLabel2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;G&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now let&amp;#8217;s see if it works. We start up the web application and run the report.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-006.png"&gt;&lt;/p&gt;

&lt;p&gt;Excellent! You can see the report has successfully run the event and is displaying the current time instead of the first name. Here are the advantages of handling events this way.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If there&amp;#8217;s a mistake in an event, the project will not compile until it&amp;#8217;s fixed.&lt;/li&gt;
&lt;li&gt;The code is more readable.&lt;/li&gt;
&lt;li&gt;The source code of the events can easily be compared with older versions.&lt;/li&gt;
&lt;li&gt;The source code can be merged much more easily when handling version control conflicts.&lt;/li&gt;
&lt;li&gt;Unit testing of the events becomes feasible.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Runtime tailoring&lt;/h3&gt;

&lt;p&gt;Can an end-user still make a copy and tailor the report as they could with the older versions? Yes they can! Let&amp;#8217;s start up the WinForms client and have a look.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-007.png"&gt;&lt;/p&gt;

&lt;p&gt;Each of the &lt;em&gt;PredefinedReadonlyReports&lt;/em&gt; has a new option &lt;em&gt;Copy predefined report&lt;/em&gt;. Also, notice that the &lt;em&gt;Show Report Designer&lt;/em&gt; is greyed out. Now compare with the copy.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-008.png"&gt;&lt;/p&gt;

&lt;p&gt;This time it is the &lt;em&gt;Copy predefined report&lt;/em&gt; is greyed out and the familiar &lt;em&gt;Show Report Designer&lt;/em&gt; has become available. (A little suggestion to the DevExpress crew. It would be better if the new copy got renamed to &lt;em&gt;Copy of Inplace Report&lt;/em&gt; like Windows does when copying a file). Now we can open the Report Designer and customise the report further. Fantastic!&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s check what happened to our events?&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/devexpress-13-2-review-009.png"&gt;&lt;/p&gt;

&lt;p&gt;Well, the serialized event was copied correctly, but the script that we put in the C# file has not been copied. A bit unfortunate - that event would have to be re-written or copied manually from the C# source file, but in most cases, additional tailoring of reports is a one-off occasional activity. For me at least, the benefits of having more maintainable code outweigh the inconvenience of losing the events when cloning a report.&lt;/p&gt;

&lt;h2&gt;Conclusions&lt;/h2&gt;

&lt;p&gt;Reports V2 is certainly the most significant improvement to the XAF reporting engine yet. I&amp;#8217;m sure there are a few beta issues to iron out and a few further improvements down the line. In this post, I haven&amp;#8217;t looked at features such as views, sub-reports and custom reporting components, all of which deserve further investigation.&lt;/p&gt;

&lt;p&gt;In my &lt;a href="http://www.coprocess.com/"&gt;main development project&lt;/a&gt;, there are currently 110 different reports and maintaining them takes some effort. Reports V2 will help considerably. Hats off to the DevExpress team.&lt;/p&gt;

&lt;h2&gt;Next up&lt;/h2&gt;

&lt;p&gt;In my next post I&amp;#8217;ll be taking a look at the new soft validation along with some other 13.2 improvements.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/devexpress-13-dot-2-review-part-1</guid>
    </item>
    <item>
      <title>How to improve XAF grid layout for Chrome</title>
      <link>http://ZeroSharp.github.com/how-to-improve-xaf-grid-layout-for-chrome/</link>
      <content:encoded>&lt;p&gt;This post proposes a workaround for a specific XAF rendering problem related to recent versions of Google Chrome.&lt;/p&gt;

&lt;p&gt;Here is an XAF list view as it looks with IE 10 and DevExpress 13.1.8.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/chrome-grid-layout-001.png"&gt;&lt;/p&gt;

&lt;p&gt;This is how the same view looks with Chrome 30. Notice how the column widths are rendered poorly. The minimum space is given to the string field and the date and bool fields are too wide.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/chrome-grid-layout-002.png"&gt;&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s going on? An update to the Chrome browser occurred in which has caused problems with the rendering of grid views in certain situations. The problem exists in all versions of Chrome great than 25 and also affects the &lt;a href="http://www.google.com/chromeframe"&gt;Google Chrome Frame&lt;/a&gt; plugin for IE.&lt;/p&gt;

&lt;p&gt;DevExpress were able to fix some scenarios in 13.1.4 and 12.2.11 (such as column sorting), but there are other situations which still pose problems (&lt;em&gt;e.g.&lt;/em&gt; the fix does not resolve the problem if the &lt;em&gt;Auto Filter Row&lt;/em&gt; is enabled, which is the case above.)&lt;/p&gt;

&lt;p&gt;Hopefully the Chrome devs will one day fix the root problem. You can keep an eye on &lt;a href="https://code.google.com/p/chromium/issues/detail?id=178369"&gt;the issue here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;The fix&lt;/h2&gt;

&lt;p&gt;Not so much a fix as a workaround. We use a &lt;code&gt;ViewController&amp;#60;ListView&amp;#62;&lt;/code&gt; to set the grid layout to &lt;code&gt;UseFixedTableLayout&lt;/code&gt;, but only for Chrome browsers. Something like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;/// &amp;#60;summary&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;/// Switches to fixed table layout for the main list view when using Chrome or ChromeFrame.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;/// &amp;#60;/summary&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ChromeSpecificListViewController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ViewController&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;ListView&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnViewChanging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;View&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OnViewChanging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;Active&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;IsChrome&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IsChrome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;IsChrome&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;get&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;HttpContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HttpContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;&amp;#38;&amp;#38;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Browser&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Chrome&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnViewControlsCreated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OnViewControlsCreated&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;ASPxGridListEditor&lt;/span&gt; &lt;span class="n"&gt;listEditor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Editor&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ASPxGridListEditor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;listEditor&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;ASPxGridView&lt;/span&gt; &lt;span class="n"&gt;gridView&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;listEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Grid&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ASPxGridView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gridView&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;gridView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFixedTableLayout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The resulting view in Chrome:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/chrome-grid-layout-003.png"&gt;&lt;/p&gt;

&lt;p&gt;That looks better. You may notice the columns will allways be the same width now, which is not quite as good as the IE rendering. As such, it may not be appropriate for all views. But since it&amp;#8217;s a &lt;code&gt;ViewController&lt;/code&gt; it&amp;#8217;s easy to deactivate it by adding an &lt;code&gt;Active[]&lt;/code&gt; criteria.&lt;/p&gt;

&lt;h4&gt;References&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.google.com/p/chromium/issues/detail?id=178369"&gt;Chrome issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.devexpress.com/Support/Center/Question/Details/Q477066"&gt;Support Center Q477066&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/B235945"&gt;Support Center B235945&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.devexpress.com/Support/Center/Question/Details/Q510468"&gt;Support Center Q510468&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/how-to-improve-xaf-grid-layout-for-chrome</guid>
    </item>
    <item>
      <title>Three ways to store a list of currency codes in XAF</title>
      <link>http://ZeroSharp.github.com/three-ways-to-store-a-list-of-currency-codes-in-xaf/</link>
      <content:encoded>&lt;p&gt;In the &lt;a href="http://ZeroSharp.github.com/the-ugly-the-heavy-and-the-good"&gt;last post&lt;/a&gt; we looked at three solutions to a relatively simple XAF requirement. In this post I&amp;#8217;ll discuss another XAF challenge, explain the options and provide a versatile and maintainable solution.&lt;/p&gt;

&lt;p&gt;In my DevExpress XAF application, I have an object which has several properties like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/currency-list-editor-002.png"&gt;&lt;/p&gt;

&lt;p&gt;In each case, the field is a comma-separated list of currency codes. These fields are not very important to the model - they are used mainly for reporting.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s look at 3 different ways of handling these fields.&lt;/p&gt;

&lt;h2&gt;Option 1 - Use a string field&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;lightest&lt;/em&gt; option would be just to declare them as a normal XPO string field:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_List1Currencies&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;List1Currencies&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;get&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_List1Currencies&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;set&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;SetPropertyValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;List1Currencies&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;_List1Currencies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;It&amp;#8217;s certainly simple and maintainable, but it&amp;#8217;s not very user-friendly. There is no fancy interface to help with the input.  We can perhaps improve things slightly by providing edit masks and/or validation rules to check the input, but careful typing is the only way to change the values.&lt;/p&gt;

&lt;h2&gt;Option 2 - Declare an association property&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;heaviest&lt;/em&gt; option is to declare each such property as a many-to-many relationship.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;XPObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    [Association(&amp;#34;List1Currencies&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;XPCollection&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;&lt;/span&gt; &lt;span class="n"&gt;List1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;GetCollection&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;List1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;XPObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    [Size(3)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Code&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;    [Association(&amp;#34;List1Currencies&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;XPCollection&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;&lt;/span&gt; &lt;span class="n"&gt;List1Container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;GetCollection&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;List1Container&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This works great - we get a nice interface for selecting the currencies and the end result looks like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/currency-list-editor-003.png"&gt;&lt;/p&gt;

&lt;p&gt;However, it&amp;#8217;s quite a heavy solution for something quite simple. For each such relationship XPO will generate a new intermediate table. If we look at the database schema, we see the following:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/currency-list-editor-004.png"&gt;&lt;/p&gt;

&lt;p&gt;And in the model there are two new views.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/currency-list-editor-005.png"&gt;&lt;/p&gt;

&lt;p&gt;If we have 5 such properties, we end up with 5 intermediary tables and 10 new views.&lt;/p&gt;

&lt;p&gt;Now, depending on your requirements that may be acceptable. If those relationships are important to your model, then the overhead may be justified. In my situation, these are minor fields and I do not want to burden the model or the database with extra complexity if I can avoid it.&lt;/p&gt;

&lt;h2&gt;Option 3 - Create a custom property editor&lt;/h2&gt;

&lt;p&gt;With the help of &lt;a href="http://documentation.devexpress.com/xaf/CustomDocument3097.aspx"&gt;the documentation&lt;/a&gt; and old Support Center issues, I was able to quite quickly put together a custom editor which gives the end user a nice interface while keeping it simple. The bulk of the logic is in the &lt;code&gt;SerializedListPropertyEditor&lt;/code&gt; base class (see the end of the article for the link to the code), but the principle is as follows:&lt;/p&gt;

&lt;p&gt;Create a new subclass:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;[PropertyEditor(typeof(String), false)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CurrencyListPropertyEditor&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SerializedListPropertyEditor&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CurrencyListPropertyEditor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="n"&gt;objectType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IModelMemberViewItem&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objectType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetDisplayText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Currency&lt;/span&gt; &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{0}\t{1}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Currency&lt;/span&gt; &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Code&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Then decorate each property with a &lt;code&gt;ModelDefault&lt;/code&gt; attribute to set the &lt;code&gt;PropertyEditorType&lt;/code&gt;.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_List1Currencies&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;[ModelDefault(&amp;#34;PropertyEditorType&amp;#34;, &amp;#34;Solution1.Module.Web.CurrencyListPropertyEditor&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;List1Currencies&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;get&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_List1Currencies&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;set&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;SetPropertyValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;List1Currencies&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;_List1Currencies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now the user gets a pretty editor to select the currencies, but the field is just a string field.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/currency-list-editor-001.png"&gt;&lt;/p&gt;

&lt;p&gt;The editor supports use of the &lt;code&gt;[DataSourceProperty]&lt;/code&gt; and &lt;code&gt;[DataSourceCriteria]&lt;/code&gt; properties too, so you can easily filter the collection.&lt;/p&gt;

&lt;p&gt;It is easy to provide a similar editor for any object type - just create a new subclass of &lt;code&gt;SerializedListPropertyEditor&amp;#60;T&amp;#62;&lt;/code&gt; where &lt;code&gt;T&lt;/code&gt; is your persistent type.&lt;/p&gt;

&lt;p&gt;You can download &lt;a href="https://github.com/ZeroSharp/Xaf_CurrencyListPropertyEditor"&gt;a working sample project on GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/three-ways-to-store-a-list-of-currency-codes-in-xaf</guid>
    </item>
    <item>
      <title>The Ugly, the Heavy and the Good: 3 solutions to an XAF layout problem</title>
      <link>http://ZeroSharp.github.com/the-ugly-the-heavy-and-the-good/</link>
      <content:encoded>&lt;p&gt;This post aims to look at various solutions to a seemingly simple layout change.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://www.devexpress.com/Products/NET/Application_Framework/"&gt;DevExpress XAF&lt;/a&gt;, a lot of the difficult things are easy: authentication, authorisation, ORM, reporting, complex form layouts, themes, etc., are all made easy by XAF. On the other hand, some of the easy things are hard. It can be frustratingly difficult to make a small modification to the basic layout. We will look at an example of such a change and evaluate the recommended DevExpress approaches.&lt;/p&gt;

&lt;h2&gt;The problem&lt;/h2&gt;

&lt;p&gt;Whenever my XAF web application asks me to change my password, I get a screen like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/narrow-dialog-001.png"&gt;&lt;/p&gt;

&lt;p&gt;Well that&amp;#8217;s a bit annoying - those edit boxes are far too wide. Wouldn&amp;#8217;t it look much better if it were narrower and centered? If we weren&amp;#8217;t using XAF, we&amp;#8217;d probably have a separate &lt;em&gt;aspx&lt;/em&gt; file for this view and we could just modify the html. With XAF there are several different recommended ways of modifying the output.&lt;/p&gt;

&lt;h2&gt;Option 1: Use the model&lt;/h2&gt;

&lt;p&gt;Well, one approach would be to use the layout designer to add some &lt;em&gt;EmptySpaceItems&lt;/em&gt; to the default layout for the &lt;code&gt;ChangePasswordOnLogon&lt;/code&gt;. Add something like this to &lt;em&gt;MainDemo.Web/Model.xafml&lt;/em&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;Views&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;DetailView&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ChangePasswordOnLogonParameters_DetailView&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;Layout&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nt"&gt;&amp;#60;LayoutGroup&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Main&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Removed=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nt"&gt;&amp;#60;LayoutGroup&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Narrow&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;RelativeSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;50&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlign=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Center&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Direction=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Horizontal&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="nt"&gt;&amp;#60;LayoutItem&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EmptySpaceItem1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Index=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ViewItem=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;RelativeSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;25&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="nt"&gt;&amp;#60;LayoutGroup&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Main&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ShowCaption=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Index=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="nt"&gt;&amp;#60;LayoutGroup&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Static&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Index=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Direction=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Horizontal&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ShowCaption=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="nt"&gt;&amp;#60;LayoutItem&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ChangePasswordImage&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Index=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ShowCaption=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;RelativeSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ViewItem=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ChangePasswordImage&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="nt"&gt;&amp;#60;LayoutItem&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ChangePasswordText&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Index=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ShowCaption=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;RelativeSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;99&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ViewItem=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ChangePasswordText&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="nt"&gt;&amp;#60;/LayoutGroup&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="nt"&gt;&amp;#60;LayoutGroup&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SimpleEditors&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Index=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ShowCaption=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="nt"&gt;&amp;#60;LayoutGroup&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ChangePasswordOnLogonParameters&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ShowCaption=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Index=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="nt"&gt;&amp;#60;LayoutItem&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;NewPassword&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ViewItem=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;NewPassword&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Index=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="nt"&gt;&amp;#60;LayoutItem&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ConfirmPassword&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ViewItem=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ConfirmPassword&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Index=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="nt"&gt;&amp;#60;/LayoutGroup&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="nt"&gt;&amp;#60;/LayoutGroup&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="nt"&gt;&amp;#60;/LayoutGroup&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="nt"&gt;&amp;#60;LayoutItem&lt;/span&gt; &lt;span class="na"&gt;Id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EmptySpaceItem2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Index=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ViewItem=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;RelativeSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;25&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsNewNode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nt"&gt;&amp;#60;/LayoutGroup&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;&amp;#60;/Layout&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nt"&gt;&amp;#60;/DetailView&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;#60;/Views&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Ugh. What a lot of work for such a small change. Another approach would be to make an equivalent model modification in code by subclassing &lt;code&gt;ModelNodesGeneratorUpdater&amp;#60;ModelViewsNodesGenerator&amp;#62;&lt;/code&gt; but it would be even more effort.&lt;/p&gt;

&lt;p&gt;Is it easy to maintain? Not especially. If we make any changes to the parameters object, we would have to update the layout again. It is quite likely we&amp;#8217;d have to make revisions when upgrading the framework.&lt;/p&gt;

&lt;p&gt;And does it work?&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/narrow-dialog-003.png"&gt;&lt;/p&gt;

&lt;p&gt;No!. It&amp;#8217;s a little better but it still looks ugly because the OK and Cancel buttons are still out wide.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Verdict: too ugly&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&lt;em&gt;When&lt;/em&gt; &lt;strong&gt;should&lt;/strong&gt; &lt;em&gt;you use this approach?&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When the layout changes are within the main view area.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Let&amp;#8217;s look at another option.&lt;/p&gt;

&lt;h2&gt;Option 2: Customise the ASP.NET template&lt;/h2&gt;

&lt;p&gt;If we were to &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3460"&gt;follow the instructions here&lt;/a&gt; we can modify the HTML exactly as we want. Unfortunately, this is even more work. We would need to:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/narrow-dialog-004.jpg"&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new MyNarrowTemplateDialogContent.ascx&lt;/li&gt;
&lt;li&gt;Modify the HTML within it to add a width to &lt;code&gt;Form1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Find some way of applying this template to only the detail view for &lt;em&gt;Change Password&lt;/em&gt;. This is &lt;a href="http://www.devexpress.com/Support/Center/Question/Details/Q207853"&gt;currently not easy&lt;/a&gt; but there is an example project at the end of &lt;a href="http://www.devexpress.com/Support/Center/Question/Details/Q204692"&gt;this issue&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;We&amp;#8217;d end up with quite a few new files to maintain for just one little layout fix&amp;#8230;&lt;/p&gt;

&lt;p&gt;Also, another problem with this approach is that it needs reviewing whenever a new version of the framework is released, because the default templates may have changed. Too much maintenance work for such a little change.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Verdict: too heavy&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&lt;em&gt;When&lt;/em&gt; &lt;strong&gt;should&lt;/strong&gt; &lt;em&gt;you use this approach?&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When the same layout changes are to be applied to the views of all or many different object types.&lt;/li&gt;
&lt;li&gt;When the changes you are making are significant enough that they are hard to achieve by the solution below.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Option 3: Use a ViewController&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;ViewController&lt;/code&gt; and &lt;code&gt;WindowController&lt;/code&gt; are well-suited to this sort of task.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='c#'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NarrowDialogViewController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ViewController&lt;/span&gt;&lt;span class="p"&gt;&amp;#60;&lt;/span&gt;&lt;span class="n"&gt;DetailView&lt;/span&gt;&lt;span class="p"&gt;&amp;#62;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnActivated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OnActivated&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;Active&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ShouldUseNarrowForm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ObjectTypeInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ChangePasswordOnLogonParameters&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// see side-note below&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnViewControlsCreated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OnViewControlsCreated&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WebWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CurrentRequestPage&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;htmlForm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CurrentRequestPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FindControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Form2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;HtmlForm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// see note below&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;htmlForm&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="c1"&gt;// make the form narrow&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;htmlForm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CssStyle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;width&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Percentage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;40&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="c1"&gt;// center the form&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;htmlForm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CssStyle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;margin-left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;htmlForm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CssStyle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;margin-right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;A side note: do not use &lt;code&gt;TargetObjectType == typeof(ChangePasswordOnLogonParameters)&lt;/code&gt; instead of the &lt;code&gt;OnActivated()&lt;/code&gt; override. This is because &lt;code&gt;ChangePasswordParameters&lt;/code&gt; which is used when the user clicks on &lt;code&gt;Change My Password&lt;/code&gt; is a subclass of &lt;code&gt;ChangePasswordOnLogonParameters&lt;/code&gt; and we do &lt;em&gt;not&lt;/em&gt; want that view to be narrowed because it appears in a popup window instead of the main window.&lt;/p&gt;

&lt;p&gt;This solution is quite maintainable. We can delimit the views for which the modification applies making the controller is active. And the modification itself is relatively simple. It is also reasonably robust with regard to DevExpress upgrades. (They did just change the name of the main dialog Form &lt;code&gt;Form1&lt;/code&gt; in 12.1 to &lt;code&gt;Form2&lt;/code&gt; in 12.2, but it was the first time in years and it was simple to fix. Alternatively, you could use &lt;code&gt;FindControl&lt;/code&gt; instead of using the hard-wired name).&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the resulting output, horizontally centered in the browser window:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/narrow-dialog-002.png"&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Verdict: good&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&lt;em&gt;When&lt;/em&gt; &lt;strong&gt;should&lt;/strong&gt; &lt;em&gt;you use this approach?&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a layout change is easy to apply by modifying styles. When a change pertains only to one or few specific object types.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Conclusions&lt;/h2&gt;

&lt;p&gt;In this case, using a &lt;code&gt;ViewController&lt;/code&gt; leads to relatively simple code and ease of maintenance. Other situations may well be better served by the other approaches.&lt;/p&gt;

&lt;p&gt;DevExpress XAF is a powerful mature product. As such, it can be daunting to new users because of all the different approaches for applying changes. It is always possible to find an elegant maintainable solution, but sometimes it is not obvious, even when the required change is small.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/the-ugly-the-heavy-and-the-good</guid>
    </item>
    <item>
      <title>A review of NDepend 5</title>
      <link>http://ZeroSharp.github.com/a-review-of-ndepend-5/</link>
      <content:encoded>&lt;p&gt;NDepend is a commercial static analysis tool for .NET managed code. It&amp;#8217;s been around a long time (since 2004!). Version 5 was just released and in this post I&amp;#8217;m going to try it out on the DevExpress MainDemo.&lt;/p&gt;

&lt;p&gt;&lt;span class='pullquote-right' data-pullquote='In version 5, a lot of work has been done to improve the learning curve.'&gt;
In the past I have always thought of NDepend as a complex tool. I was never sure where to start. In version 5, a lot of work has been done to improve the learning curve. The installation process is easy and a wizard very quickly points you in the right direction.&lt;/p&gt;

&lt;p&gt;After &lt;a href="http://ndepend.com/NDependDownload.aspx"&gt;downloading the v5 trial&lt;/a&gt; and running the installation you get to the following screen.
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/ndepend/ndepend-001.png"&gt;&lt;/p&gt;

&lt;p&gt;You cannot miss that big red arrow. In fact, it&amp;#8217;s even animated in the actual product. Click on it and choose a Visual Studio solution to analyse. I&amp;#8217;m going to navigate to the DevExpress MainDemo 13.1.&lt;/p&gt;

&lt;p&gt;So long as the project has been built at some point, NDepend works out what to analyse (otherwise you&amp;#8217;ll get helpful warnings).&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/ndepend/ndepend-003.png"&gt;&lt;/p&gt;

&lt;p&gt;It is very fast and we get to this help screen.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/ndepend/ndepend-004.png"&gt;&lt;/p&gt;

&lt;p&gt;Choose the dashboard.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/ndepend/ndepend-005.png"&gt;&lt;/p&gt;

&lt;p&gt;Now that&amp;#8217;s a lot of information, but it&amp;#8217;s all well presented and easy to navigate. Let&amp;#8217;s focus on the worst: I can see &lt;em&gt;2 Critical Rules Violated&lt;/em&gt;. Drill down to find out more:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/ndepend/ndepend-009.png"&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s complaining that we have classes with duplicate names in our projects. In the pane on the left we can see what they are: 3 types named &lt;code&gt;MainDemoWinApplication&lt;/code&gt;, 3 named &lt;code&gt;Program&lt;/code&gt;, &lt;em&gt;etc.&lt;/em&gt; And sure enough there are: &lt;em&gt;MainDemo.Win&lt;/em&gt;, &lt;em&gt;MainDemo.Win.Mdi&lt;/em&gt; and &lt;em&gt;MainDemo.Win.Ribbon&lt;/em&gt; all duplicate those class names.&lt;/p&gt;

&lt;p&gt;We can also see 2 &lt;code&gt;TaskAnalysis1LayoutUpdater&lt;/code&gt; types and a quick search reveals that there&amp;#8217;s one in the web module and another in the win module.&lt;/p&gt;

&lt;p&gt;So NDepend has correctly discovered some potential issues. As we XAF fans know, this one is not really a problem, because those modules are never loaded into the same AppDomain, but nevertheless the information is accurate and relevant.&lt;/p&gt;

&lt;p&gt;Lets have a brief look at the other screens. The dependency graph:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/ndepend/ndepend-006.png"&gt;&lt;/p&gt;

&lt;p&gt;With a million options.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/ndepend/ndepend-010.png"&gt;&lt;/p&gt;

&lt;p&gt;A dependency matrix.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/ndepend/ndepend-007.png"&gt;&lt;/p&gt;

&lt;p&gt;A metrics view showing class and assembly sizes.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/ndepend/ndepend-008.png"&gt;&lt;/p&gt;

&lt;p&gt;All with reams of helpful documentation.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ZeroSharp.github.com/images/blog/ndepend/ndepend-011.png"&gt;&lt;/p&gt;

&lt;p&gt;Overall, the tool felt fast, responsive and stable. I&amp;#8217;ve focused on the user interface aspects, but there is so much more. Some things you can do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create your own analysis rules&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ndepend.com/Doc_CQLinq_Syntax.aspx#Edition"&gt;Query your own code with LINQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Run analysis from &lt;a href="http://www.ndepend.com/NDependConsole.aspx"&gt;the command line&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Run from within Visual Studio&lt;/li&gt;
&lt;li&gt;Add output to continuous integration (&lt;a href="http://www.ndepend.com/Doc_CI_TeamCity.aspx"&gt;TeamCity&lt;/a&gt;, &lt;a href="http://www.ndepend.com/Doc_CI_CCNet.aspx"&gt;CruiseControl.NET&lt;/a&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Track &lt;a href="http://www.ndepend.com/Doc_Trend.aspx"&gt;trends and progress over time&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;NDepend shines at providing a high-level overview of code quality and as such it is a very useful addition to any developer&amp;#8217;s toolkit. There are some scenarios where NDepend would be particularly useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For a developer joining a mature project.&lt;/li&gt;
&lt;li&gt;For a senior developer looking to track progress on a refactoring drive.&lt;/li&gt;
&lt;li&gt;For helping evaluate the quality of an open source third party library.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;In this quick review, I&amp;#8217;m not going deep enough to say anything about whether the DevExpress MainDemo is good code or not - it&amp;#8217;s just a sample project I happen to be quite familiar with. It might be interesting to unleash NDepend on the full DevExpress source code and maybe one day I&amp;#8217;ll get around to writing a future post about that.&lt;/p&gt;

&lt;p&gt;With regard to my own projects, I feel I&amp;#8217;m so familiar with them that I ought to be aware of most of the recommendations NDepend is likely to make, but I&amp;#8217;ll give it a spin and see what comes out&amp;#8230;&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">http://ZeroSharp.github.com/a-review-of-ndepend-5</guid>
    </item>
  </channel>
</rss>
