<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.infragistics.com/community/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Damyan Petev's Blog</title><link>http://www.infragistics.com/community/blogs/damyan_petev/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP3 (Build: 36.8414)</generator><item><title>Responsive Web Design with jQuery Grids: A closer look</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/05/23/responsive-web-design-with-jquery-grids-a-closer-look.aspx</link><pubDate>Thu, 23 May 2013 21:11:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:405126</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=405126</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/05/23/responsive-web-design-with-jquery-grids-a-closer-look.aspx#comments</comments><description>&lt;p&gt;&lt;img title="Responsive Web Design with jQuery Grids" style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="Responsive Web Design with jQuery Grids" align="left" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/responsive-web-design-jquery-grids.png" /&gt;I really hope I got you excited about the &lt;a title="jQuery Grids and Responsive Web Design" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/04/12/jquery-grids-and-responsive-web-design.aspx" target="_blank"&gt;Responsive Web Design mode for the Ignite UI Grids last time&lt;/a&gt; – as it is the kind of an unique feature that truly makes this jQuery control stand out! As previously explained it’s not exactly a simple thing to make a grid responsive, but our team made serious considerations on how to best approach this and I do believe they’ve pretty much nailed it and this will turn out to be very useful addition. There were also plenty of things that can’t fit in a single blog, plus the fact that the actual feature was not yet released so there wasn’t too much of demo material to see. So now, with &lt;a title="Infragistics Releases 13.1!" href="http://www.infragistics.com/community/blogs/marketing/archive/2013/04/18/infragistics-releases-13-1.aspx" target="_blank"&gt;13.1 out&lt;/a&gt; and even accompanied by a &lt;a title="Ignite UI Release Notes - April: 13.1 Release and Service Release" href="http://www.infragistics.com/community/blogs/engineering/archive/2013/04/25/ignite-ui-release-notes-april-13-1-release-and-service-release.aspx" target="_blank"&gt;service release&lt;/a&gt;, without further due, let’s dig into the technical stuff! I’ll start with some interesting design considerations and even potential pitfalls related with Responsive Web Design and then have some specific Grid tips.&lt;/p&gt; &lt;h1&gt;A Getting Started, of sorts&lt;/h1&gt; &lt;p&gt;Now these are more of honorary mentions as the most basic stuff were already covered elsewhere, but hey, it doesn’t hurt to have them on a speed dial. So in case you missed it - here’s a nice summary on &lt;a title="Building responsive web design using CSS3 Media Queries!" href="http://www.infragistics.com/community/blogs/anarain/archive/2012/09/30/building-responsive-web-design-using-css3-media-queries.aspx" target="_blank"&gt;Building responsive web design using CSS3 Media Queries!&lt;/a&gt; &lt;/p&gt; &lt;p&gt;And because creating a Responsive app is all in the name of providing users with a better experience I figured some UX tips and food for thought are in order. Our &lt;a title="D3 Services - User Experience Design and Training - UI Architect Experts" href="http://d3.infragistics.com/" target="_blank"&gt;Services or as of recently D3&lt;/a&gt; (from Discover – Design – Develop) have a solid expertise in the field and they share some of it in their blogs. For example this on &lt;a title="UX of Responsive Web Design | User Experience Blogs - Blogs by Designer - UI Architects Blogs" href="http://d3.infragistics.com/ux-of-responsive-web-design/" target="_blank"&gt;&lt;strong&gt;UX of Responsive Web Design&lt;/strong&gt;&lt;/a&gt; you should definitely check out! There’s a whole lot more on UX, Design and usability and I highly recommend keeping an eye on those. &lt;/p&gt; &lt;p&gt;Once you have technology and design considerations in check, I’d like to turn your attention to the now available &lt;strong&gt;Documentation&lt;/strong&gt; for the &lt;a title="Responsive Web Design (RWD) Mode (igGrid) - Ignite UI&amp;trade; Online Help ::  2013.1" href="http://help.infragistics.com/NetAdvantage/jQuery/2013.1/CLR4.0?page=igGrid_Responsive_Web_Design_Mode_LandingPage.html" target="_blank"&gt;igGrid Responsive Web Design (RWD) Mode&lt;/a&gt;. There’s an good coverage on the theory behind this and also a good amount of examples! Speaking of which, you can also check out our &lt;strong&gt;samples&lt;/strong&gt; for &lt;a title="Responsive Web Design Custom Mode Template Switching - Ignite UI samples" href="http://www.infragistics.com/products/jquery/sample/grid/responsive-web-design-custom-mode-template-switching" target="_blank"&gt;Responsive Web Design Custom Mode Template Switching&lt;/a&gt; and &lt;a title="Responsive Web Design Mode of the Grid with Twitter Bootstrap - Ingnite UI samples" href="http://www.infragistics.com/products/jquery/sample/grid/responsive-web-design-mode-of-the-grid-with-twitter-bootstrap" target="_blank"&gt;Responsive Web Design Mode of the Grid with Twitter Bootstrap&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Additional considerations&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Some “good to know about” extras&amp;nbsp; – like the browser viewport. One of the most important things to consider is that many (if not all) smartphone browsers will &amp;#39;lie&amp;#39; about their dimensions. It&amp;#39;s not a bad thing, mind you – most phones these days have such high &lt;a title="Dots per inch - Wikipedia" href="http://en.wikipedia.org/wiki/Dots_per_inch" target="_blank"&gt;dpi&lt;/a&gt; that it will be impossible to read and interact normally with pages where everything is shrunk to the native resolution. Instead, as you can read on &lt;a title="CSS pixel ratios (or, why all mobile sites are 320 pixels)" href="http://gamon.org/blog/2013/04/26/css-pixel-ratios-or-why-all-mobile-sites-are-320-pixels/" target="_blank"&gt;CSS pixel ratios (or, why all mobile sites are 320 pixels)&lt;/a&gt;,&amp;nbsp; pixels we would use for web development are now relative. The term ‘CSS pixels’ also pops up here and there, but basically the browser will almost always scale the pixels down (so 1 pixel will actually be multiple physical ones), which in term affects the browser viewport dimensions. Those dimensions, usually wider than the screen, are still small enough to squish a non-responsive page and big enough to force the user to scroll. This is where the all-time favorite meta tag comes in setting the viewport to match the device width (which removes that annoying scrolling) but limits your space further, something in the range of 320 – 460 of them virtual pixels! Remember the &lt;a title="Scaffolding &amp;middot; Bootstrap" href="http://twitter.github.io/bootstrap/scaffolding.html#responsive" target="_blank"&gt;utility class table&lt;/a&gt; from Bootstrap I showed last time? I hope it does it make sense now why phones end up in their respective visibility class even in landscape. &lt;/p&gt; &lt;p&gt;On the other side are tablets where many have a pixel ratio of 1 or 2 in the case of retina displays, but for all intents and purposes tablets usually hit the desktop size mark in landscape and only get to the tablet-specific styles in portrait. There’s a very large and very incomplete &lt;a title="List of displays by pixel density on Wikipedia" href="http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density" target="_blank"&gt;List of displays by pixel density on Wikipedia&lt;/a&gt; if you wan to have a look.&lt;/p&gt; &lt;p&gt;There’s also an interesting issue with setting the&lt;strong&gt; IE10 viewport&lt;/strong&gt; in CSS (as is per recommendation) rather than using the meta tag. The issue came out of nowhere and this blog on &lt;a title="Responsive Design in IE10 on Windows Phone 8" href="http://mattstow.com/responsive-design-in-ie10-on-windows-phone-8.html" target="_blank"&gt;Responsive Design in IE10 on Windows Phone 8&lt;/a&gt; helped me a lot. As it turns out, the bug applies actual physical pixels when using “device-width” in CSS. Eventually I tracked down the issue to Bootstrap’s own CSS - they applied to fix Win 8 apps in snapped mode, but it completely broke Bootstrap pages on Windows Phone. Keep that in mind, there’s a fix provided that feels hacky at best, but it does work so consider it if working with Bootstrap.&lt;/p&gt; &lt;p&gt;Additionally, good things to remember is that touch devices have their special needs and oddities – make sure touch targets are big enough, remember touch events are separate and in the case of the Grid – consider applying the touch-friendly &lt;a title="Grid Windows UI Theme - Ignite UI samples" href="http://www.infragistics.com/products/jquery/sample/grid/grid-metro-theme" target="_blank"&gt;Windows UI Theme&lt;/a&gt;. And once more, have a look around those &lt;a title="User Experience Blogs - Blogs by Designer - UI Architects Blogs" href="http://d3.infragistics.com/insights/blog/" target="_blank"&gt;D3 blogs for mobile and usability related articles&lt;/a&gt; that can help you.&lt;/p&gt; &lt;h1&gt;Merging and Column Hiding&lt;/h1&gt; &lt;p&gt;As I hope it has become clear the Responsive feature allows for both hiding columns through setting and modifying the structure (markup) via templates. The template swapping is a source of quite a few possible modifications, perhaps one of the most useful ones is merging columns, as you may read in the docs. Now I know this might not be necessary, but better safe than sorry: don’t attempt to hide columns through the template or merge them (e.g. writing one less &amp;lt;td&amp;gt; cell). A main thing about the Ignite UI Grid is that is has columns array you usually define or have auto-generated – either way, row templates are designed to do just that – allow you to format the already existing layout! In other words, templated columns MUST match the layout defined or all data properties if generated! You will not get any results if column definitions and markup clash. So, for hiding columns you are stuck with defining column settings (not too pretty if they are a lot, I know).  &lt;p&gt; So how then exactly do you merge columns? Well one option is hiding a column though settings and adding its data to another still visible ones in a template. This is the approach you can see in &lt;a title="Responsive Web Design Custom Mode Template Switching - Ignite UI" href="http://www.infragistics.com/products/jquery/sample/grid/responsive-web-design-custom-mode-template-switching" target="_blank"&gt;our samples&lt;/a&gt; and it works best when the target column header is something that makes sense after you merge, like in that sample the Address taking in the country and city values as well. &lt;p&gt;Another possible way that I personally like is though an &lt;a title="Unbound Columns - Ignite UI&amp;trade; Online Help ::  2013.1" href="http://help.infragistics.com/NetAdvantage/jQuery/2013.1/CLR4.0?page=igGrid_UnboundColumns_Overview.html" target="_blank"&gt;Unbound Column&lt;/a&gt;. That way you can have the unbound setup with multiple data properties and only revealed when other are not. For example take this part of a grid definition where you have first and last name separate and an unbound column to take their place when&amp;nbsp; on phone:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cc05da20-bfb5-4a99-84fa-a90fe22a59cb" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#grid&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igGrid({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;columns : [{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;unbound : &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;key : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dataType : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;headerText : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Full Name&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}, {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;key : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;FirstName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dataType : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;headerText : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;First name&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}, {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;key : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;LastName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dataType : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;headerText : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Last Name&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}],&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//...&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;features : [{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;name : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Responsive&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;forceResponsiveGridWidth : &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;columnSettings : [{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;columnKey : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;classes: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ui-visible-phone&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;configuration: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;phone: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;template: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;lt;span&amp;gt;${LastName}, ${FirstName}&amp;lt;/span&amp;gt;&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;},{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;columnKey : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;FirstName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;classes: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ui-hidden-phone&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;},{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;columnKey : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;LastName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;classes: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ui-hidden-phone&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//....&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Same thing using the ASP.NET MVC helpers: &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:bfa10511-6ade-452a-b8d6-533d2e6b2553" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;@(&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;Html.Infragistics().Grid(Model)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.Columns(column =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;column.Unbound(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).DataType(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).HeaderText(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Full Name&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).Template(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;${FirstName} ${LastName}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;column.For(x =&amp;gt; x.FirstName).HeaderText(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;First name&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).DataType(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;column.For(x =&amp;gt; x.LastName).HeaderText(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Last Name&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).DataType(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//...&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;})&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.Features(feature =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;feature.Responsive().ForceResponsiveGridWidth(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).ColumnSettings(setting =&amp;gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;setting.ColumnSetting().ColumnKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).Classes(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ui-visible-phone&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).Configuration(conf =&amp;gt; conf.AddColumnModeConfiguration(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;phone&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, c =&amp;gt; c.Template(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;lt;span&amp;gt;${LastName}, ${FirstName}&amp;lt;/span&amp;gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;setting.ColumnSetting().ColumnKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).Classes(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ui-hidden-phone&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;setting.ColumnSetting().ColumnKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;LastName&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).Classes(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ui-hidden-phone&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//...&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}).DataBind().Render()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;Essentially turning merging the two columns going from tablet to phone mode in the images below:&lt;/p&gt; &lt;p&gt;&lt;img title="" alt="jQuery Responsive Grid with separate columns in tablet mode" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-responsive-grid-columns-separate.png" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img title="jQuery Responsive Grid with merged columns in phone mode" alt="jQuery Responsive Grid with merged columns in phone mode" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-responsive-grid-merge-columns.png" /&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;As you may remember and notice above, when Responsive is used with &lt;strong&gt;&lt;a title="Column Hiding - Ignite UI&amp;trade; Online Help ::  2013.1" href="http://help.infragistics.com/NetAdvantage/jQuery/2013.1/CLR4.0?page=igGrid_Column_Hiding.html" target="_blank"&gt;Column Hiding&lt;/a&gt;&lt;/strong&gt; you get that hidden indicator that is both a cue for the user something else is there and an interaction target to modify the visible columns. In terms of usability for touch though, it does feel slightly hard to hit. Good thing you can pick its width I guess – it seems that something in the range of 14-15px is much easier to hit, which is about double the default size.&lt;/p&gt; &lt;p&gt;&lt;img title="jQuery Responsive Grid in phone mode with Hiding indicators enlarged" alt="jQuery Responsive Grid in phone mode with Hiding indicators enlarged" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-rwd-grid-hidden-indicator.png" /&gt;&lt;/p&gt; &lt;p&gt;Of course, unless you arrange your columns in a way that all the ones you will be hiding are in front or at the end, you will get multiple indicators like I have above. Increasing their size for touch takes up even more of the already precious space. &lt;/p&gt; &lt;p&gt;So either ensure arrangement or hide the indicator entirely - well, not really since right now there is no such option, but you can always set the width to 0! How would the user know of hidden columns and interact with the feature then, you may ask? Well, the Column Hiding and its API provide you with the necessary tools to build your own user experience by adding an external button to open the column chooser dialog and events to let you know and potentially display when columns are hidden to the user. The column chooser is easy to open with a single call and hiding and showing events are fired for each column separately (by both Hiding and Responsive!) so you can keep track of their count:&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c20688c9-61b3-4275-bbed-e04eaa548ad5" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;white-space:nowrap;"&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;button&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;=&amp;quot;openChooser&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Show/Hide Columns &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;button&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;label&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;=&amp;quot;hiddenColumns&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;data-count&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;=&amp;quot;0&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;label&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a2b27c67-3ba5-43f7-a86f-210a91c9cf38" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$.ig.loader(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;igGrid.Responsive.Hiding&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; () {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#grid&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igGrid({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//...&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;features : [{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;name : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Responsive&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;responsiveColumnHidden: hidden,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;responsiveColumnShown: shown&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;},{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;name : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Hiding&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;hiddenColumnIndicatorHeaderWidth: 0,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;columnChooserWidth: 300,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;columnHidden: hidden,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;columnShown: shown&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//...&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//initial state after load&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;updateHiddenLabel($(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#grid&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;igGrid&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#openChooser&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igButton().click(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; myfunction() {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#grid&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igGridHiding(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;showColumnChooser&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; hidden(evt, ui){&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; label = $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#hiddenColumns&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; newHiddenCount = parseInt(label.data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)) + 1;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;label.data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, newHiddenCount).text(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;(&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; + newHiddenCount + &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot; hidden)&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; shown(evt, ui){&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; label = $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#hiddenColumns&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; newHiddenCount = parseInt(label.data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)) - 1;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;label.data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, newHiddenCount).text(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;(&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; + newHiddenCount + &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot; hidden)&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(newHiddenCount &amp;lt;= 0){&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;label.data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, 0).text(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; updateHiddenLabel(grid){&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; hiddenCount = 0;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; columns = grid.options.columns;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(index &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; columns){&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;hiddenCount += columns[index].hidden ? 1 : 0;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#hiddenColumns&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, hiddenCount).text( hiddenCount ? &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;(&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; + hiddenCount + &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot; hidden)&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;Note that you should pick a fitting size for the chooser (300 looks ideal, remember that’s in CSS pixels) as the &lt;a title="jQuery Ui Draggable" href="http://jqueryui.com/draggable/" target="_blank"&gt;Draggable&lt;/a&gt; and &lt;a title="jQuery UI Resizable" href="http://jqueryui.com/resizable/" target="_blank"&gt;Resizable&lt;/a&gt; widgets on the chooser are not likely to work too well, unless you use one of those widgets that add touch support to jQuery UI.&lt;/p&gt; &lt;p&gt;&lt;a title="RWD grid in phone mode without the hidden indicator" href="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-rwd-grid-no-hidden-indicator.png" target="_blank"&gt;&lt;img title="RWD grid in phone mode without the hidden indicator" alt="RWD grid in phone mode without the hidden indicator" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-rwd-grid-no-hidden-indicator-thumb.png" /&gt;&lt;/a&gt;&lt;a title="The column chooser for in the Responsive Phone mode" href="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-grid-responsive-column-chooser.png" target="_blank"&gt;&lt;img title="The column chooser for in the Responsive Phone mode" style="margin:0px 0px 0px 10px;" alt="The column chooser for in the Responsive Phone mode" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-grid-responsive-column-chooser-thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Of course, you can have the indicators and extra chooser shortcut as well – all depending on what fits your design needs better.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Multi-Column Headers&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;When you are using &lt;a title="jQuery Grids with Multi-Column Headers" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/03/11/jquery-grids-with-multi-column-headers.aspx" target="_blank"&gt;jQuery Grids with this feature&lt;/a&gt; there’s a slight consideration to keep in mind. With &lt;a title="Column Hiding - Ignite UI feature sample" href="http://www.infragistics.com/products/jquery/sample/grid/column-hiding-basic" target="_blank"&gt;Column Hiding&lt;/a&gt; you can hide columns in groups directly through their multi-header keys.&amp;nbsp; Event though the Column Hiding feature itself&amp;nbsp; allows for such API calls&amp;nbsp; and we’ve also been using “hiding a column” through the Responsive feature, it’s not the same thing. Responsive, much like Hiding, is hooked to the underlying grid framework that just won’t accept such calls because they don’t exist there. So short version – Responsive can’t hide multi-columns at once through their common header, you will have to provide settings for each separately. &lt;/p&gt; &lt;h1&gt;Responsive Hierarchical Grid&lt;/h1&gt; &lt;p&gt;Noticing the title? ‘Grids’? Yes, plural. Decided I should show some love for those with more complicated(hierarchical) data on their hands. Sometimes by looking at what we write and demonstrate someone would think we are forgetting about the Hierarchical Grid. We aren&amp;#39;t really, we are merely forgetting how easy it is for readers and users to forget that it is build on top of actual flat grids. You know, there&amp;#39;s actually a very normal igGrid widget running alongside the igHierarchicalGrid every time, even for the parent layout. When we talk features and functionality, we almost always have both controls in mind and only mention special cases. Point is this particular Hierarchical Grid is not afraid of some Responsive Web Design! &lt;p&gt;The Responsive feature can be inherited but that, as with other features with column settings, won’t do you any good. In other words, the feature and its settings must be defined for each layout you want it on. Which is not half bad because you can apply separate recognizers and mode profiles for them. &lt;/p&gt; &lt;p&gt;Twitter Bootstrap is also supported, which is to say you can use Bootstrap CSS classes for column visibility and mode recognition. And it’s also super easy to set up. Introducing the Responsive Web Design page with Ignite UI jQuery Hierarchical Grid and Twitter Bootstrap… whoa, that’s a mouthful! &lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b2ccc62e-0161-4976-80d0-949c3065f458" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#grid&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igHierarchicalGrid({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;dataSource: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;/Home/Departments&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;autoGenerateColumns: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;autoGenerateLayouts: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;responseDataKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;columns: [&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//...&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;],&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;columnLayouts: [{               &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;columns: [&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//...&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;],&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;features: [{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;name: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Responsive&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;responsiveModes: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;phone: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;bootstrap&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;tablet: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;bootstrap&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;desktop: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;bootstrap&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;columnSettings: [{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;columnKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;BusinessEntityID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;classes: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;visible-desktop&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//...&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;],&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;rowTemplate: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;desktop: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;{{html BusinessEntityID}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{html LoginID}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{html NationalIDNumber}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{html Gender}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{html BirthDate}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{html MaritalStatus}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{html JobTitle}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{html OrganizationLevel}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{html HireDate}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{html SalariedFlag}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;div class=&amp;#39;progressbar&amp;#39;&amp;gt;{{html VacationHours}}&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}],&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;features: [{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;name: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Responsive&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;responsiveModes: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;phone: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;bootstrap&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;tablet: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;bootstrap&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;desktop: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;bootstrap&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;The only difference is that you have to specify the Bootstrap recognizer if you need it, and use unprefixed classes for the column visibility like “hidden-phone” and you should be good to go:&lt;/p&gt; &lt;p&gt;&lt;img title="Responsive Web Design jQuery Hierarchical Grid and Twitter Bootstrap" alt="Responsive Web Design jQuery Hierarchical Grid and Twitter Bootstrap" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-hierarchical-grid-responsive-bootstrap.png" /&gt;&lt;/p&gt; &lt;p&gt;And the template you notice above is just for desktop where you can enjoy power and space so why not have a column with &lt;a title="Radial Gauge - Ignite UI samples" href="http://www.infragistics.com/products/jquery/gauge" target="_blank"&gt;Gauges&lt;/a&gt; or sliders or progress bars in my case:&lt;/p&gt; &lt;p&gt;&lt;a title="Responsive Web Design jQuery Hierarchical Grid and Twitter Bootstrap" href="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-hierarchical-grid-responsive-bootstrap-template.png" target="_blank"&gt;&lt;img title="Responsive Web Design jQuery Hierarchical Grid and Twitter Bootstrap" alt="Responsive Web Design jQuery Hierarchical Grid and Twitter Bootstrap" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-hierarchical-grid-responsive-bootstrap-thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Thinking about it, you get responsive design mode grid with responsive design grids in it in a responsive web design site/app – this should totally qualify for an Inception meme! &lt;/p&gt; &lt;h1&gt;Resources&lt;/h1&gt; &lt;p&gt;I have some interesting tips and tricks coming up next, so stay tuned!&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The super hacky &lt;a title="Responsive Web Design page with Ignite UI jQuery Hierarchical Grid and Twitter Bootstrap" href="http://jsfiddle.net/damyanpetev/YzHve/show/" target="_blank"&gt;JSFiddle on Responsive Web Design page with Ignite UI jQuery Hierarchical Grid and Twitter Bootstrap&lt;/a&gt;. That’s the full-screen version, the actual fiddle – code and all(preview probably in tablet or phone mode depending on how big your screen is) is &lt;a title="Responsive Hierarchical Grid" href="http://jsfiddle.net/damyanpetev/YzHve/" target="_blank"&gt;here&lt;/a&gt;. &lt;li&gt;An &lt;a title="ASP.NET MVC demo for the jQuery Grids&amp;#39; Responsive web design mode" href="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/Responsive-Grids.zip" target="_blank"&gt;ASP.NET MVC demo&lt;/a&gt; with everything showed above in full code. The Hierarchical Grid here doesn’t use bootstrap so you can compare how very little difference there is in code. &lt;li&gt;There’s a &lt;a href="https://www4.gotomeeting.com/register/112890991" target="_blank"&gt;&lt;strong&gt;Webinar on Designing for Responsive Design&lt;/strong&gt;&lt;/a&gt; tomorrow, don’t miss!&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a title="Designing for Responsive Design - Webinar" href="https://www4.gotomeeting.com/register/112890991" target="_blank"&gt;&lt;img title="Designing for Responsive Design - Webinar" alt="Designing for Responsive Design - Webinar" src="http://static.infragistics.com/marketing/2013mailer/images/WebinarHeader_May_Responsive2.jpg" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Documentation - &lt;a title="Responsive Web Design (RWD) Mode (igGrid) - Ignite UI&amp;trade; Online Help ::  2013.1" href="http://help.infragistics.com/NetAdvantage/jQuery/2013.1/CLR4.0?page=igGrid_Responsive_Web_Design_Mode_LandingPage.html" target="_blank"&gt;igGrid Responsive Web Design (RWD) Mode&lt;/a&gt; &lt;li&gt;&lt;a title="Responsive Web Design Custom Mode Template Switching - Ignite UI samples" href="http://www.infragistics.com/products/jquery/sample/grid/responsive-web-design-custom-mode-template-switching" target="_blank"&gt;Responsive Web Design Custom Mode Template Switching&lt;/a&gt; and &lt;a title="Responsive Web Design Mode of the Grid with Twitter Bootstrap - Ingnite UI samples" href="http://www.infragistics.com/products/jquery/sample/grid/responsive-web-design-mode-of-the-grid-with-twitter-bootstrap" target="_blank"&gt;Responsive Web Design Mode of the Grid with Twitter Bootstrap&lt;/a&gt; &lt;li&gt;Other awesome stuff: &lt;a title="Ignite UI: What&amp;rsquo;s New in 13.1 HTML5, jQuery &amp;amp; ASP.NET MVC Controls" href="http://www.infragistics.com/community/blogs/jason_beres/archive/2013/03/25/ignite-ui-what-s-new-in-13-1-html5-jquery-amp-mvc-controls.aspx" target="_blank"&gt;Ignite UI: What’s New in 13.1 HTML5, jQuery &amp;amp; ASP.NET MVC Controls&lt;/a&gt; &lt;li&gt;Go grab Ignite UI&lt;br /&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p name="gotcha"&gt;I’d love to hear some thoughts, so leave a comment down below or &lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=405126" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CSS3/default.aspx">CSS3</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Cross-Platform/default.aspx">Cross-Platform</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Grid/default.aspx">Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igGrid/default.aspx">igGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Hierarchical+Grid/default.aspx">Hierarchical Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Hierarchical/default.aspx">Hierarchical</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igHierarchicalGrid/default.aspx">igHierarchicalGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Merge/default.aspx">Merge</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Touch/default.aspx">Touch</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI+Grid/default.aspx">Ignite UI Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/13.1/default.aspx">13.1</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column+Hiding/default.aspx">Column Hiding</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Responsive+Grid/default.aspx">Responsive Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Responsive/default.aspx">Responsive</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Responsive+Web+Design/default.aspx">Responsive Web Design</category></item><item><title>jQuery Grids and Responsive Web Design</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/04/12/jquery-grids-and-responsive-web-design.aspx</link><pubDate>Fri, 12 Apr 2013 18:37:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:399957</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=399957</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/04/12/jquery-grids-and-responsive-web-design.aspx#comments</comments><description>&lt;p&gt;&lt;img title="Responsive Web Design and jQuery Grids" style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="Responsive Web Design and jQuery Grids" align="left" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-grid-responsive-web-design.png" /&gt;Responsive Web Design has been abuzz for some time now. In case you just now clash with the term, it’s a &lt;a title="Responsive web design - Wikipedia" href="http://en.wikipedia.org/wiki/Responsive_web_design" target="_blank"&gt;web design approach aimed at crafting sites to provide an optimal viewing experience across a wide range of devices&lt;/a&gt;. Basically, a CSS3 / JavaScript / jQuery powered&amp;nbsp; site that adjusts itself to better suit the screen it’s on, with the added bonus of keeping a single code base. What’s not to like? Well besides it’s often abbreviated ‘RWD’ which outside of the IT fields stands for &lt;a href="http://en.wikipedia.org/wiki/Rear-wheel_drive"&gt;Rear-wheel drive&lt;/a&gt;, so slightly confusing for people into both.. but that’s a minor issue. Other than that, it’s pretty awesome, but also sometimes hard to implement – some elements of a Web app simply don’t handle well squishing into smaller spaces. Complicated enterprise applications might even require quite a bit of extra work – and as you know with &lt;a title="Ignite UI: JavaScript / jQuery &amp;amp; HTML5 UI Framework" href="http://www.infragistics.com/products/jquery/" target="_blank"&gt;Ignite UI&lt;/a&gt; we want to help you get the extra work out of the way! And what do heavy business apps use? Grids, of course! &lt;/p&gt; &lt;p&gt;Now, how do you imagine a big table with a few columns and at least a few hundred rows is to fit in portrait mode on tablets and event more so on phones? The limited space calls for some changes and I’m quite excited to tell you your jQuery Grids will soon (and I mean soon – 13.1 is right around the corner) be equipped with the Responsive feature, ready to fit right into your RWD site! Do I hear clapping? Yeah, that’s not some simple data table we are talking about here – a full-fledged, &lt;a title="Ignite UI jQuery Grid" href="http://www.infragistics.com/products/jquery/grid/" target="_blank"&gt;feature-packed jQuery Data Grid&lt;/a&gt; and its &lt;a title="http://www.infragistics.com/products/jquery/hierarchical-grid/" href="http://www.infragistics.com/products/jquery/hierarchical-grid/" target="_blank"&gt;Hierarchical version&lt;/a&gt; – they can do so much you might as well just make a whole app out of them. A &lt;strong&gt;responsive&lt;/strong&gt; app!&lt;/p&gt; &lt;p&gt;Lastly, if you are in for a quick start with the whole toolset and related concepts you can &lt;a title="Get Started Learning Ignite UI Today!" href="http://www.infragistics.com/community/blogs/craig_shoemaker/archive/2013/03/06/get-started-learning-ignite-ui-today.aspx" target="_blank"&gt;Get Started Learning Ignite UI Today!&lt;/a&gt; The more you know, the more exciting this will be.&lt;/p&gt; &lt;h1&gt;What can it do for you and what can you do with Responsive!&lt;/h1&gt; &lt;p&gt;The main star of the Responsive feature is allowing you to know in what ‘state’ the app is running and define separate grid and column settings for each to make the best of whatever space you have. For example only do a few major columns for a phone view, some more for a tablet:&lt;/p&gt; &lt;p&gt;&lt;a title="The Ignite UI Grid with 3 columns visible in phone mode" href="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-grid-responsive-phone.png"&gt;&lt;img title="The Ignite UI Grid with 3 columns visible in phone mode" style="margin:0px 25px 0px 0px;" alt="The Ignite UI Grid with 3 columns visible in phone mode" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-grid-responsive-phone-thumb.png" /&gt;&lt;/a&gt;&lt;a title="The Ignite UI Grid in tablet mode" href="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-grid-responsive-tablet.png"&gt;&lt;img title="The Ignite UI Grid in tablet mode" alt="The Ignite UI Grid in tablet mode" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-grid-responsive-tablet-thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And the all the extra stuff when you have the space:&lt;/p&gt; &lt;p&gt;&lt;a title="The Ignite UI Grid with all columns visible in desktop mode" href="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-grid-responsive-desktop.png"&gt;&lt;img title="The Ignite UI Grid with all columns visible in desktop mode" alt="The Ignite UI Grid with all columns visible in desktop mode" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/jquery-grid-responsive-desktop-thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The feature allows you to trigger column visibility based on CSS classes – with a slight nod towards those familiar with or already using popular responsive UI frameworks like Twitter Bootstrap. The RWD Grid comes with 3 modes (mode recognizers if you will, we can work on the naming), that are used to match predefined or custom states ( such as ‘phone’, ‘tablet’ and desktop). Mode Recognizers if you will, but we can work on the naming:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Responsive mode – the base  &lt;li&gt;Infragistics mode  &lt;li&gt;Bootstrap mode&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The base implementation looks at the window width, but the Infragistics and Bootstrap profiles rely on CSS3 media classes through a set of classes. Actually here is where Bootstrap comes with their set of media queries and specific classes, that many of you should find familiar. It’s not as simple as putting CSS classes on table cells, though! The igGrid is way too complex for that, but the Responsive feature does the next best thing – hiding columns thought the API methods and detecting when to do that using the class on a test element. I actually love this technique, because that’s how you do a ‘matchMedia’ polyfill (because &lt;a title="Can I use... :  CSS3 Media Queries /  matchMedia" href="http://caniuse.com/#search=media%20quer" target="_blank"&gt;most mobile browsers support media queries, but not &amp;#39;matchMedia&amp;#39;&lt;/a&gt;) and I always thought it was super clever workaround. But anyways, the point is that though CSS you can define when columns will be visible and the grid will do the rest for you. I’ll actually just include a shot of the Twitter Bootstrap description that should be clear enough:&lt;/p&gt; &lt;p&gt;&lt;a title="Twitter Bootstrap&amp;#39;s Responsive utility classes" href="http://twitter.github.io/bootstrap/scaffolding.html#responsive" target="_blank"&gt;&lt;img title="Twitter Bootstrap&amp;#39;s Responsive utility classes" alt="Twitter Bootstrap&amp;#39;s Responsive utility classes" src="http://media.infragistics.com/community/Release/13.1/jQuery/responsive-grid/bootstrap-responsive-utility-classes.png" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Basically what you do is have you classes in CSS - the ones that come with Bootstrap as above, or the ones from Ignite UI CSS that are pretty much the same, but with out usual “ui-“ prefix, so it’s “ui-visible-phone” and so on. Basically, you need the classes in there – if you are using Bootstrap – great, you can reuse, otherwise we will provide you with them. Those classes are assigned in the column settings on the feature (remember, they are for the test element only) and it really is as simple as adding the Responsive feature to your grid with settings similar to this:&lt;/p&gt; &lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;border-top:silver 1px solid;height:108px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;features : [{&lt;br /&gt;        name : &lt;span style="color:#006080;"&gt;&amp;#39;Responsive&amp;#39;&lt;/span&gt;,&lt;br /&gt;        columnSettings : [{&lt;br /&gt;            columnKey : &lt;span style="color:#006080;"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;,&lt;br /&gt;            classes: &lt;span style="color:#006080;"&gt;&amp;quot;ui-visible-phone&amp;quot;&lt;/span&gt;&lt;br /&gt;        }]&lt;br /&gt;        //....&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;Or you can even configure visibility though simple properties that match the mode’s profiles:&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;border-top:silver 1px solid;height:167px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span style="color:#008000;"&gt;// ...&lt;/span&gt;&lt;br /&gt;features : [{&lt;br /&gt;        name : &lt;span style="color:#006080;"&gt;&amp;#39;Responsive&amp;#39;&lt;/span&gt;,&lt;br /&gt;        {&lt;br /&gt;            columnKey : &lt;span style="color:#006080;"&gt;&amp;#39;BusinessEntityID&amp;#39;&lt;/span&gt;,&lt;br /&gt;            configuration: {&lt;br /&gt;                phone: {&lt;br /&gt;                    hidden: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;// ...&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A Template for every occasion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So hiding columns is not enough? Well the Responsive feature kindly offers additional configuration options by providing templates for separate modes. You heard me right – you can swap the entire grid template on every mode and in the same configuration as above, where you define state for modes, you can also add column template specific to each mode! So that’s quite something – with templates you can change the look and feel of the entire grid between modes – shift controls templated into cells back to data or the other way around, merge columns and more! Just keep in mind the row templates are final and will override column ones if mixed.&lt;/p&gt;
&lt;h1&gt;Customizable, we need it to be customizable!&lt;/h1&gt;
&lt;p&gt;And so we hear – there’s a whole bunch of settings you can change for way the feature works. The sheer fact that the responsive modes can be quite a few – you can use the classes and have the designer decide thought media queries when exactly should the modes be triggered! That in itself sounds like a good foundation to keep design consideration out of the code. &lt;/p&gt;
&lt;p&gt;Then you also have the option to create your own modes… for example have one specially targeted at “phablets” or something like this or any custom width and CSS media query you can think of. You can also extend and define your own mode recognizers (profiles) where you can not only define custom modes, but also use custom logic to say when they are active. That means you responsive grid doesn’t need to depend on CSS or not even on window width..it can be anything you see fit!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eventful&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Well, it’s not just automatic column hiding and template switching.. There’s a whole lot more! The numerous events you can react to are simply a powerhouse of a customization point – you can react to mode changes or even to separate columns going away or coming into view – either way at any point you can perform additional work to improve you app’s experience! You can reduce page sizes, group records, filter, sort or anything you deem helpful. You can even use the Responsive feature events as hooks for script-related modifications of your entire page/app – after all it’s already monitoring the state of the device, you might as well make full use of that! As you can imagine there are great many possibilities of what you can do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Settings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Besides the elaborate per-column configuration and per-mode settings already mentioned, the Responsive feature doesn’t have that much:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A general setting that will ensure the grid will stretch the full 100% of its parent, overriding other settings.&lt;/li&gt;
&lt;li&gt;A sensitivity setting defining just how much of a change there should be before the feature would react to changes in window width. Performance implications here obviously.&lt;/li&gt;
&lt;li&gt;And finally the option to disable monitoring container resizes as a whole – again some performance gains and pretty much the difference between a responsive and fluid behavior. If you are interested in that sort of stuff check out the info for our conference below.&lt;/li&gt;&lt;/ul&gt;
&lt;h1&gt;Power to the user&lt;/h1&gt;
&lt;p&gt;Trust me when I say I appreciate every effort a developer has made to improve my experience using a site and I get annoyed when I have to scroll left and right to read a single sentence. But then again, I’m also a user who doesn’t like his capabilities being taken away unconditionally. Yes, responsiveness can bring better experience, but only if you don’t take away from important content and functionality without the option to get them back. Basically, I hate when something gets hidden permanently on some mobile device and I can’t find it. It’s infuriating, even more so with RWD where I can’t just skip to the desktop version and make do. &lt;/p&gt;
&lt;p&gt;In the case of the Ignite UI Grid that would mean using the Responsive feature to hide columns that might contain required information. There’s usually a reason for that data to be there and simply removing it from the picture just cuts of functionality from the app! Best part is that the &lt;a title="Column Hiding feature - Ignite UI Grid samples" href="http://www.infragistics.com/products/jquery/sample/grid/column-hiding-basic"&gt;Column Hiding feature&lt;/a&gt; will provide the UI when Responsive kicks in for free:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/0640.jquery_2D00_grid_2D00_responsive_2D00_column_2D00_hiding_5F00_3839C926.png"&gt;&lt;img title="Column Hiding UI with Responsive feature" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="Column Hiding UI with Responsive feature" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/8407.jquery_2D00_grid_2D00_responsive_2D00_column_2D00_hiding_5F00_thumb_5F00_3761633C.png" width="344" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is something I personally can’t see such a feature without. So, in case you are hiding columns, please consider giving the user the option to control what he’s seeing. &lt;/p&gt;
&lt;h1&gt;Resources&lt;/h1&gt;
&lt;p&gt;This has been more a general overview of the Ignite UI jQuery Grids’ Responsive feature aimed at Responsive Web Design (RWD) and a kind of a teaser for the upcoming 13.1 goodness. I’ll be making some more blogs with more code, demos and tricks very soon, so stay tuned!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="Get Started Learning Ignite UI Today!" href="http://www.infragistics.com/community/blogs/craig_shoemaker/archive/2013/03/06/get-started-learning-ignite-ui-today.aspx" target="_blank"&gt;Get Started Learning Ignite UI Today!&lt;/a&gt; (yes, yes, again!) 
&lt;li&gt;All the awesomeness coming you way: 
&lt;p&gt;&lt;a title="Ignite UI: What&amp;rsquo;s New in 13.1 HTML5, jQuery &amp;amp; ASP.NET MVC Controls" href="http://www.infragistics.com/community/blogs/jason_beres/archive/2013/03/25/ignite-ui-what-s-new-in-13-1-html5-jquery-amp-mvc-controls.aspx" target="_blank"&gt;Ignite UI: What’s New in 13.1 HTML5, jQuery &amp;amp; ASP.NET MVC Controls&lt;/a&gt;&lt;/p&gt;
&lt;li&gt;As always Free Trial is available and it will soon be serving up 13.1 code for you to try!&lt;br /&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Just in case you are joining us tomorrow for a day filled with JavaScript related talks at &lt;a title="JavaScript Saturday: Sofia, Bulgaria." href="http://jssaturday.com/sofia/home" target="_blank"&gt;JS Saturday&lt;/a&gt; and the topic of Responsive Web Design and Fluid design interest you – make sure to visit the session by our very own &lt;a href="http://jssaturday.com/sofia/speakers.html#konstantinDinev"&gt;Konstantin Dinev&lt;/a&gt;!&lt;br /&gt;&lt;a title="JavaScript Saturday: Sofia, Bulgaria." href="http://jssaturday.com/sofia/home.html"&gt;&lt;img title="JavaScript Saturday: Sofia, Bulgaria." style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="JavaScript Saturday: Sofia, Bulgaria." src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/0640.jssaturday_2D00_logo_5F00_48D1C414.png" width="606" height="253" /&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;
&lt;p name="gotcha"&gt;I’d love to hear some thoughts, so leave a comment down below or &lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=399957" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/NetAdvantage+for+jQuery/default.aspx">NetAdvantage for jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CSS3/default.aspx">CSS3</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics+Grid/default.aspx">Infragistics Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Grid/default.aspx">Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igGrid/default.aspx">igGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Hierarchical+Grid/default.aspx">Hierarchical Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Templating/default.aspx">Templating</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Templates/default.aspx">Templates</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column+Template/default.aspx">Column Template</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Merge/default.aspx">Merge</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/mobile/default.aspx">mobile</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/iPad/default.aspx">iPad</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/iPhone/default.aspx">iPhone</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI+Grid/default.aspx">Ignite UI Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column/default.aspx">Column</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/13.1/default.aspx">13.1</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column+Hiding/default.aspx">Column Hiding</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Responsive+Grid/default.aspx">Responsive Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Responsive/default.aspx">Responsive</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/RWD/default.aspx">RWD</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Responsive+Web+Design/default.aspx">Responsive Web Design</category></item><item><title>jQuery Grids with Multi-Column Headers</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/03/11/jquery-grids-with-multi-column-headers.aspx</link><pubDate>Tue, 12 Mar 2013 03:32:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:395794</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=395794</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/03/11/jquery-grids-with-multi-column-headers.aspx#comments</comments><description>&lt;p&gt;&lt;img title="jQuery Grids Multi-Column Headers" style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="jQuery Grids Multi-Column Headers" align="left" src="http://media.infragistics.com/community/Release/12.2/jQuery/multi-column-headers/grids-multi-column-headers.png" /&gt;If you’ve been reading the latest blog about the &lt;a title="Ignite UI jQuery Grid Column Moving" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/02/22/ignite-ui-jquery-grid-column-moving.aspx" target="_blank"&gt;Column Moving feature of the Ignite UI Grid&lt;/a&gt; I’ve briefly mentioned Multi-column Headers. Well, just in case you missed it – that’s a fairly recent addition too! Through a very simple (and logical I think) setup of columns and layouts, this feature allows for visual and sometimes functional grouping of column headers under a common parent.&lt;/p&gt; &lt;p&gt;While on its own it might be mostly a visual thing, having other parts/modules of the Ignite UI Grid and Hierarchical Grid being aware of it, it can have some really interesting interactions. These might not be part of the actual widgets code, but they are a by-product of having column headers grouped while using other features. And below I’ll be throwing some more feature names at you for reference in one place. &lt;/p&gt; &lt;p&gt;Lastly if you are in for a quick start with the whole toolset and related concepts you can &lt;a title="Get Started Learning Ignite UI Today!" href="http://www.infragistics.com/community/blogs/craig_shoemaker/archive/2013/03/06/get-started-learning-ignite-ui-today.aspx" target="_blank"&gt;Get Started Learning Ignite UI Today!&lt;/a&gt; I could not resist the awesome contained in there and now, with the shameless plug done with, let’s move on to the basics of the feature.  &lt;h1&gt;Quick Start&lt;/h1&gt; &lt;p&gt;After all you need to start somewhere and if you are like me and just straight to the API to check out capabilities, you are in for a slight shock. As it stands, the Multi-Column Headers widget doesn’t really offer much. So how do you set it up? Well it all becomes very reasonable when you begin to thing about the widget itself as an on/off switch (which is exactly what it does) and the column definitions are where they always were.. in the &lt;a title="Grid options - Ignite UI API reference" href="http://help.infragistics.com/jQuery/2012.2/ui.iggrid#options" target="_blank"&gt;column collection&lt;/a&gt;! You can simply add one that has a collection on it’s own assigned to its ‘group’ property. Inside you can have more columns with groups and so on – the feature should allow for virtually unlimited nested headers. Then you also have some additional properties like a key and row span. A partial snippet with the ASP.NET MVC Helper (important lines are 5 and 6): &lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7e3f1bf5-92a2-4136-9557-90b77a49d9b6" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;@(&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;Html.Infragistics().Grid&amp;lt;MultiColumnHeaders.Models.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Department&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.Columns(column =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;column.For(x =&amp;gt; x.DepartmentID).HeaderText(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;DEP Id&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;column.MultiColumnHeader(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Dep&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).HeaderText(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Dep&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;.Group(innerColumn =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;innerColumn.For(x =&amp;gt; x.Name).HeaderText(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;innerColumn.For(x =&amp;gt; x.GroupName).HeaderText(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;GroupName&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;})&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//...&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;And it’s as simple in script(line 9):&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1f412269-b023-44e1-9e23-94ea12307c0a" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#grid&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igHierarchicalGrid({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;columns: [{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;key: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;DepartmentID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dataType: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;headerText: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;DEP Id&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}, {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;key: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Dep&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;headerText: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Dep&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;group: [{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;key: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Name&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;dataType: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;headerText: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Name&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}, {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;key: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;GroupName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;dataType: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;headerText: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;GroupName&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}],&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//..&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;For the above layouts to work simply add the “MultiColumnHeaders” feature to the respective collection:&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a65b9b97-94b4-425a-a568-f07932aeb677" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//....&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Features(feature =&amp;gt; feature.MultiColumnHeaders().Inherit(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//  ---- OR -----&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;features: [{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;name: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;MultiColumnHeaders&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}],&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//...&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;You have two options here as usual when it comes to the Hierarchical Grid – you can define the feature in the parent’s collection and allow &lt;a title="igHierarchicalGrid Feature Inheritance - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igHierarchicalGrid_Feature_Inheritance.html" target="_blank"&gt;inheritance&lt;/a&gt; or add it to the specific layout. Overall you can check out the &lt;a title="Multi-Column Headers - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igGrid_MultiColumnHeaders_LandingPage.html" target="_blank"&gt;igGrid Multi-Column Header topics in our help&lt;/a&gt; they already contain a fairly detailed guide. Or you can also refer to the samples and demos section below and learn by example :)&lt;/p&gt; &lt;h1&gt;Not so fast!&lt;/h1&gt; &lt;p&gt;First off, let’s have a little bit of understanding of what exactly the feature does it modifies the markup in the &lt;a href="http://www.w3.org/wiki/HTML/Elements/thead" target="_blank"&gt;THEAD&lt;/a&gt; of the Grid table. The Multi-Column Headers feature provides &lt;strong&gt;out-of-the-box alignment - &lt;/strong&gt;as you’d expect much of it revolves around figuring out the perfect way to align actual column headers in there – setting “&lt;a title="HTML / Elements / td - W3C Wiki" href="http://www.w3.org/wiki/HTML/Elements/td" target="_blank"&gt;colspan&lt;/a&gt;” and row spans, the latter you can tweak (more on that below). The only required setting really is the group collection, really. Well, I guess the header text is also really nice to have, because&amp;nbsp; you’ll end up with header saying ‘undefined’ otherwise.  &lt;p&gt;Then there’s also the&lt;strong&gt; key. &lt;/strong&gt;Unlike your usual column settings, the key in this case doesn&amp;#39;t correspond to a data property. So why would you need it? When you don’t assign a multi-column header a key(which doubles as identifier) you will be stuck with whatever the grid comes up with on its own. That means that the identifiers will be generated (incrementing number id) and these don’t always get assigned as you’d expect. Furthermore, perhaps you’ve seen some methods – particularly with API that manipulate columns like Hiding and Moving – that do accept multi-column identifiers/keys. Lacking a key can sometimes cause odd behavior, so it’s best if you consider it required as well. In addition, you don’t want to be missing on the opportunity for easy header targeting:  &lt;p&gt;&lt;img title="The THEAD markup generated for the Multi-Column Headers with levels and id-s" alt="The THEAD markup generated for the Multi-Column Headers with levels and id-s" src="http://media.infragistics.com/community/Release/12.2/jQuery/multi-column-headers/grids-multi-column-headers-thead-markup.png" /&gt; &lt;p&gt;When you define a key the headers will also be assigned id-s (combination of the Ignite UI Grid’s Id and the column’s) that you can use for super fast and easy targeting. This puts those headers in line with the data-bound ones you see with “data-isheadercell” attribute set to true. &lt;p&gt;&lt;strong&gt;The good and evil row spans&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The ‘rowspan’ property is a direct reference to the underlying &lt;a title="HTML / Elements / td - W3C Wiki" href="http://www.w3.org/wiki/HTML/Elements/td" target="_blank"&gt;table cell property&lt;/a&gt;, however the feature itself figures out the alignment of cells in rows (in order to have them span and align the way you’d expect rows sometimes end up containing both data bound and group headers). So there are some ‘gotcha’-s right here. For example take the case below (some columns are hidden and other squished so they can fit in the shot) where we set the “Record Info” group header from it’s original single row span to two in order to push its child column lower and align them with the rest.&lt;/p&gt; &lt;p&gt;&lt;img title="An example of the effect of the rowspan property of the MUlti-Column Headers" alt="An example of the effect of the rowspan property of the MUlti-Column Headers" src="http://media.infragistics.com/community/Release/12.2/jQuery/multi-column-headers/grids-multi-column-headers-row-span.png" /&gt;&lt;/p&gt; &lt;p&gt;Notice how the intention to merely align all the ‘actual’ headers in a neat row resulted in enlarging the entire header table. Because this aligned the last two column headers with the rest in a neat row, they really actually ended up in the same table row in markup. And since those were slightly bigger with more text the row expanded to fit them, causing the stretch. Also if you define row spans for columns that don’t have anything else to take up the space or not enough space to fit the rest you can end up needing to compensate elsewhere to avoid skewed layout. Generally, I’d suggest relying on the grid to do that for you.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;More on the API&lt;/strong&gt;&lt;/p&gt; &lt;p&gt; As you can see &lt;a title="Multi-Column Headers - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igGrid_MultiColumnHeaders_MultiColumnHeaders.html" target="_blank"&gt;duly noted in the documentation&lt;/a&gt; the feature’s own &lt;a title="igGridMultiColumnHeaders methods - Ignite UI API reference" href="http://help.infragistics.com/jQuery/2012.2/ui.iggridmulticolumnheaders#methods" target="_blank"&gt;&lt;em&gt;&lt;strong&gt;getMultiColumnHeaders&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;should be used in order to get the headers and their groups, as if you get the igGrid widget columns collection using $(“.selector”).igGrid(“option”, “columns”) you will get the ‘actual’ ones only – no group hierarchy. &lt;/p&gt; &lt;p&gt;It’s a similar case with the hierarchical grid, but for different reasons. You can actually pull the column options as usual and they will contain the group headers and their children, however that’s only good if you need to check out the header hierarchy. For the additional info, such as col/row span, identifier or level you should again rely on the&lt;strong&gt; &lt;/strong&gt;&lt;a title="igGridMultiColumnHeaders methods - Ignite UI API reference" href="http://help.infragistics.com/jQuery/2012.2/ui.iggridmulticolumnheaders#methods" target="_blank"&gt;&lt;em&gt;getMultiColumnHeaders&lt;/em&gt;&lt;/a&gt; method. &lt;/p&gt; &lt;p&gt;There’s another method, that oddly enough the API is missing, but the documentation doesn’t and I figured it’s good to mention – it’s called &amp;quot;renderMultiColumnHeader&amp;quot; and it takes the very same column collection you’d provide for grid initialization. With it you can change the Multi-column&amp;nbsp; headers’ arrangement in runtime or even define columns without any – just keep in mind it costs a grid rebind. It’s fairly simple to use too: &lt;/p&gt; &lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;$(&lt;span style="color:#006080;"&gt;&amp;#39;#Grid1&amp;#39;&lt;/span&gt;).igGrid(&lt;span style="color:#006080;"&gt;&amp;quot;renderMultiColumnHeader&amp;quot;&lt;/span&gt;, [{&lt;br /&gt;    key: &lt;span style="color:#006080;"&gt;&amp;#39;DepartmentID&amp;#39;&lt;/span&gt;,&lt;br /&gt;    dataType: &lt;span style="color:#006080;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;,&lt;br /&gt;    headerText: &lt;span style="color:#006080;"&gt;&amp;#39;DEP Id&amp;#39;&lt;/span&gt;&lt;br /&gt;}, {&lt;br /&gt;    headerText: &lt;span style="color:#006080;"&gt;&amp;quot;Dep&amp;quot;&lt;/span&gt;,&lt;br /&gt;    group: [&lt;br /&gt;    &lt;span style="color:#008000;"&gt;//...&lt;/span&gt;&lt;br /&gt;    ]&lt;br /&gt;}]);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;There are other setting you’d normally see in the API that are shared for all columns (less so with the ASP.NET MVC helpers) that you might set, but will be generally ignored (templates, formatters and such don’t make much sense there). There are some that would, but still will not apply – e.g. the &lt;strong&gt;width&lt;/strong&gt; property. The width of the multi-column header is determined by it’s group and in order to define width for it you just have to set it up on the child columns.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Styling&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The feature applies a single specific class(“ui-iggrid-multiheader-cell”) to the headers you can target with CSS. This allows for specific styles to differentiate the group headers from the rest, which is something that I think the default Infragistics theme needs. You can do anything really, but I decided a subtle underline will do quite nicely (which I totally stole from the Modern UI theme!) so with the following style:&lt;/p&gt;
&lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:34f56852-b54d-4c21-bdb2-1228a71f7b6e" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt;
&lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt;
&lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt;
&lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt;
&lt;li&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;.ui-iggrid&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;th.ui-iggrid-multiheader-cell&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; {&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;border-bottom-color&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;#2cbdf9&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;border-bottom-width&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;1px&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img title="An example of applying styles targeted at only the Multi-Column Headers" alt="An example of applying styles targeted at only the Multi-Column Headers" src="http://media.infragistics.com/community/Release/12.2/jQuery/multi-column-headers/grids-multi-column-headers-styling.png" /&gt;&lt;/p&gt;
&lt;p&gt;You get something similar to this. You can even use some pseudo-classes to alternate between styles in case you have more groups, which I’ve also done in my samples so check them out below.&lt;/p&gt;
&lt;h1&gt;Feature interaction &lt;/h1&gt;
&lt;p&gt;I’ve already mentioned in my last blog &lt;strong&gt;Column Moving&lt;/strong&gt; is playing well with multi headers.  And as you can imagine the parent headers can also be dragged in order to move all their children&amp;nbsp; at once. So what else interesting?
&lt;p&gt;With the &lt;strong&gt;Hiding&lt;/strong&gt; Feature you get a nice icon on the header to use to hide the entire group and parent will go away if all nested columns are hidden. You can also simply set the ‘hidden’ property of the column to hide it by default and that part doesn’t even require the respective feature to work (but it will lack UI and Interactions to show the columns without).
&lt;p&gt;Both features’ API methods that perform column operations will also accept multi-column header identifier in place of the key.
&lt;p&gt;When &lt;strong&gt;Resizing&lt;/strong&gt; the user can interact both with individual columns or with their group header both leading to a satisfactory reactions – resizing nested columns will modify the parent’s width and vice versa.
&lt;p&gt;In terms of UI, both Hiding and Column Moving produce their distinctive header icons for interaction, as seen on the topmost image of the blog. Unlike data-bound columns that accumulate additional features in a single gear icon, the group ones doesn’t support more than the two above and therefore don’t get a &lt;a title="Feature Chooser - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igGrid_Feature_Chooser.html" target="_blank"&gt;feature chooser&lt;/a&gt;! That might change as more features that make sense to be bulk-performed are added to the Grids (*hint hint* might happen very soon too).


&lt;h1&gt;Resources&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="Get Started Learning Ignite UI Today!" href="http://www.infragistics.com/community/blogs/craig_shoemaker/archive/2013/03/06/get-started-learning-ignite-ui-today.aspx" target="_blank"&gt;Get Started Learning Ignite UI Today!&lt;/a&gt; (yes, yes, again!)&lt;/li&gt;
&lt;li&gt;&lt;a title="Multi-Column Headers - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igGrid_MultiColumnHeaders_LandingPage.html" target="_blank"&gt;The Help topics for Multi-Column Headers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And the &lt;a title="Configuring Multi-Column Headers - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igHierarchicalGrid_MultiColumnHeaders_Configuring.html" target="_blank"&gt;configuration topic for the Hierarchical Grid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;&lt;a title="Grid Multi-Column Headers - Ignite UI samples" href="http://www.infragistics.com/products/jquery/sample/grid/multi-column-headers" target="_blank"&gt;Grid Multi-Column Headers sample&lt;/a&gt;&lt;/h4&gt;&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;&lt;a title="Hierarchical Grid Multi-Column Headers - Ignite UI samples" href="http://www.infragistics.com/products/jquery/sample/hierarchical-grid/hierarchical-grid-multi-column-headers" target="_blank"&gt;Hierarchical Grid Multi-Column Headers sample&lt;/a&gt;&lt;/h4&gt;&lt;/li&gt;
&lt;li&gt;My &lt;a title="Grid Multi-Column Headers ASP.NET MVC demo" href="http://media.infragistics.com/community/Release/12.2/jQuery/multi-column-headers/GridMultiColumnHeaders.zip" target="_blank"&gt;ASP.NET MVC demo&lt;/a&gt; with various definition types for both flat and hierarchical Grids, features and styling. Views using the helper require at least the free trial version of Ignite UI installed – get it from the link below!&lt;/li&gt;
&lt;li&gt;JSFiddle demos for &lt;a title="Grid Multi-Column Headers" href="http://jsfiddle.net/damyanpetev/km2Fj/embedded/result/" target="_blank"&gt;igGrid&lt;/a&gt; and &lt;a title="Hierarchical Grid Multi-Column Headers" href="http://jsfiddle.net/damyanpetev/TUKYF/embedded/result/" target="_blank"&gt;igHierarchicalGrid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Grab yours:&lt;/li&gt;&lt;/ul&gt;
&lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p name="gotcha"&gt;I’d love to hear some thoughts, so leave a comment down below or &lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=395794" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CSS3/default.aspx">CSS3</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CDN/default.aspx">CDN</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Grid/default.aspx">Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igGrid/default.aspx">igGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Hierarchical+Grid/default.aspx">Hierarchical Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Hierarchical/default.aspx">Hierarchical</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igHierarchicalGrid/default.aspx">igHierarchicalGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/style/default.aspx">style</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/multi-column/default.aspx">multi-column</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Multi-column+headers/default.aspx">Multi-column headers</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI+Grid/default.aspx">Ignite UI Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column/default.aspx">Column</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery+UI/default.aspx">jQuery UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column+Moving/default.aspx">Column Moving</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column+Hiding/default.aspx">Column Hiding</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/colspan/default.aspx">colspan</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/group+columns/default.aspx">group columns</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/rowspan/default.aspx">rowspan</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/nested+columns/default.aspx">nested columns</category></item><item><title>Ignite UI jQuery Grid Column Moving</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/02/22/ignite-ui-jquery-grid-column-moving.aspx</link><pubDate>Fri, 22 Feb 2013 16:47:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:393798</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=393798</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/02/22/ignite-ui-jquery-grid-column-moving.aspx#comments</comments><description>&lt;p&gt;&lt;img title="Ignite UI jQuery Grid with Column Moving feature. Dropdown menu visible on the shot." style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="Ignite UI jQuery Grid with Column Moving feature. Dropdown menu visible on the shot." align="left" src="http://media.infragistics.com/community/Release/12.2/jQuery/ignite-ui-grid-column-moving/ignite-ui-jquery-grid-column-moving.png" /&gt;The Grid is one of Ignite UI’s bread and butter controls and its feature set just.. keeps growing! I guess that fact that Infragistics has done quite a few grid controls over the years helps. Ome of the latest additions is the The Column Moving feature – it is still in a CTP stage for the current release (not for long I should add, 13.1 is coming our way!). It’s a really simple feature at first glance as with other ‘simple’ Grid features they turn out to be not that simple. In all seriousness, there’s barely such a thing as ‘simple’ grid feature because of the way event the smallest change can have impact on multiple other modules. And while there might be some odd end to polish, you can start using the feature now or at the very least get to know it a little. &lt;/p&gt; &lt;p&gt;The Column Moving allows the users to change the order of columns. From a user standpoint things are pretty well rounded – they can simple pick column headers and drag them to the desired position or open up a menu with convenient shortcuts as seen on the shot to the side here. Finally, an additional dialog with columns listed in order to be tweaked (interestingly enough inside is an &lt;a title="Ignite UI jQuery Tree control" href="http://www.infragistics.com/products/jquery/tree" target="_blank"&gt;Ignite UI Tree&lt;/a&gt; with drag and drop enabled nodes from the columns).&lt;/p&gt; &lt;h1&gt;Getting started&lt;/h1&gt; &lt;p&gt;As a developer you’d be pretty happy to find things are kept as easy as can be – enabling such a feature is straightforward – when &lt;a title="Using JavaScript Resouces in IgniteUI" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=Deployment_Guide_JavaScript_Resouces.html" target="_blank"&gt;referencing recourses&lt;/a&gt; make sure to include the column moving widget and the add the feature:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cc433068-e9ef-4733-8c55-9b2fd75a82a4" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$.ig.loader(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;igGrid.ColumnMoving&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; () {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#grid&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igGrid({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;autoGenerateColumns: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dataSource: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;@&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;Url.Action(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;People&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Home&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;features: [&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;name: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ColumnMoving&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;mode: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;deferred&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;type: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;render&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;    &lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;And when using the ASP.NET MVC helper you don’t need to define recourses yourself: &lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:59a5b4e4-f54a-4233-9dee-368e99d76609" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;@(&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;Html.Infragistics().Grid(Model).ID(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Grid1&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).AutoGenerateColumns(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Features(feature =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;feature.ColumnMoving().Mode(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;MovingMode&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Immediate).MoveType(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;MovingType&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Dom);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;})&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.DataBind()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Render()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Perhaps you’ve notice the subtle differences between the two in term of settings – the Column Moving has two modes and two more modes we call types &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Smile" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/8030.wlEmoticon_2D00_smile_5F00_4622A374.png" /&gt;. The DOM move type will instruct the feature to move only the affected table cells (&amp;lt;td&amp;gt; nodes) in the &lt;a title="Document Object Model - Wikipedia" href="http://en.wikipedia.org/wiki/Document_Object_Model" target="_blank"&gt;DOM tree&lt;/a&gt;. The other type will move the columns in the data source and then renders the grid again. More on that later on.&lt;/p&gt; &lt;p&gt;The immediate vs. deferred only affects the drag and drop interaction when moving and as you can imagine immediate just moves the column constantly as you drag it around. The deferred only moves on release and in the mean time it provides only an indicator where you’d be dropping that column:&lt;/p&gt; &lt;p&gt;&lt;img title="Column Moving feature in deferred mode with an indicator while dragging." alt="Column Moving feature in deferred mode with an indicator while dragging." src="http://media.infragistics.com/community/Release/12.2/jQuery/ignite-ui-grid-column-moving/grid-deferred-column-moving.png" /&gt;&lt;/p&gt; &lt;p&gt;Pretty simple, no? I find the immediate drag &amp;amp; drop reaction more immersive, don’t know just feels like that for me – but it comes at a price of doing a lot of extra movement in between, that can be otherwise omitted. The thing to note here is that the immediate mode (as duly noted in its &lt;a title="igGrid Column Moving - Ignite UI API REFERENCE" href="http://help.infragistics.com/jQuery/2012.2/ui.iggridcolumnmoving#options" target="_blank"&gt;jQuery API&lt;/a&gt;) doesn’t really mix well with the ‘render’ type – imagine dragging around the column header and have the grid underneath re-rendering constantly. It’s just too much of a hassle to attempt to compensate for that, so when mode is immediate, the type will only be ‘dom’ (even if you choose ‘render’).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Control&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Out of the twofold nature of the interaction with the feature come two additional settings – you can turn on and off the the additional move menu globally, or both with the drag &amp;amp; drop capabilities on per column basis. The menu is integrated with the &lt;a title="Feature Chooser - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igGrid_Feature_Chooser.html" target="_blank"&gt;Feature Chooser&lt;/a&gt;, which is to say that if there are other features using it (such as Column Hiding), disabling the move menu will only remove the relevant parts to that feature. This is done globally though the ‘addMovingDropdown’ setting:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:80130be3-9201-453d-a629-b86b92eecaac" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:100px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//....&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;    &lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;features: [&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;name: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ColumnMoving&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;addMovingDropdown: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;    &lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//.....&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The per-column settings also let you can disallow the drag and drop functionality for the column (since it’s based on &lt;a title="jQuery UI Draggable" href="http://jqueryui.com/draggable/" target="_blank"&gt;jQuery UI Draggable&lt;/a&gt; it means that the widget will not be initialized for the column) in addition to the menu:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b304fcb8-8044-45a2-bf3e-4b3cdf26944b" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:100px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//....&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;    &lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;features: [&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;name: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ColumnMoving&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;columnSettings: [&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000;"&gt;columnKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Demographics&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000;"&gt;allowMoving: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;                &lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//....&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Note this doesn’t really fix the column in it’s place – as I explained it merely doesn’t create the draggable widget and Feature chooser menu for that column. However, since other columns can move, they can and probably will push that column out of it’s place. Also the API method can move that column regardless. &lt;/p&gt; &lt;h1&gt;Notes, tips and tricks&lt;/h1&gt; &lt;p&gt;The feature offers a single method, but a ton of settings and events you can make use of in creating amazing grid experiences. There are some options that probably didn’t make it to the &lt;a title="igGrid Column Moving - Ignite UI API REFERENCE" href="http://help.infragistics.com/jQuery/2012.2/ui.iggridcolumnmoving#options" target="_blank"&gt;jQuery API page&lt;/a&gt;(happens, being CTP and all):&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The hidden settings&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The column header users drag can be made transparent though the ‘dragHelperOpacity’ as it is exactly that the helper for the jQuery UI Draggable and this directly corresponds to the opacity property.&lt;/p&gt; &lt;p&gt;There are two tolerance settings for this feature and they are both only regarding the Drag&amp;amp;Drop interaction side of Column Moving – besides letting you dragging the header around the feature is also kind enough to scroll the grid for you when you go near the edge. The edge is actually a distance threshold defined by the ‘movingScrollTolerance’ property (length (in pixels) below which horizontal scrolling occurs) and supported by ‘scrollDelta’ that dictated how much should be scrolled each time.&lt;/p&gt; &lt;p&gt;Then you also have the ‘movingAcceptanceTolerance’ which is how the feature checks if you are close to a possible column drop point and the column/indicator should be moved there. I think a visual explanation will be great for this. The default accept tolerance is 20px which means that if the edge of the helper moves closer that that to some edge, that edge will be accepted as target position for column moving, see what I mean:&lt;/p&gt; &lt;p&gt;&lt;img title="The Column Moving accept tolerance of 20px visualized as a green-ish area, that once crossed by the drag helper will cause a colum/incidator move." alt="The Column Moving accept tolerance of 20px visualized as a green-ish area, that once crossed by the drag helper will cause a colum/incidator move. " src="http://media.infragistics.com/community/Release/12.2/jQuery/ignite-ui-grid-column-moving/grid-column-moving-tolerance.png" /&gt;&lt;/p&gt; &lt;p&gt;There’s a very important note for the tolerance settings – &lt;strong&gt;use wisely and with caution&lt;/strong&gt; – imagine what will happen if you crank up the tolerance too much, like wider than your columns? The feature will totally go crazy and drag column moving will produce highly unpredictable results! I’d say those 20px as pretty confortable, but hey with great settings power comes great… you get the point!&lt;/p&gt; &lt;p&gt;The ‘hideHeaderContentsDuringDrag’ which is why the actual column header above is empty when dragging.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Multi-Column headers and hierarchy&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The Column Moving acts really well with this (&lt;a title="Multi-Column Headers - Ignite UI jQuery Gruid sample" href="http://www.infragistics.com/products/jquery/sample/grid/multi-column-headers" target="_blank"&gt;also new&lt;/a&gt;) feature and also plays nice with the &lt;a title="Hierarchical Grid Column Moving - Ignite Ui samples" href="http://www.infragistics.com/products/jquery/sample/hierarchical-grid/hierarchical-grid-column-moving" target="_blank"&gt;Hierarchical&lt;/a&gt; version of the grid. The drag helper/header is restricted within the confines of it’s respective grid (which prevents child-parent moves in the Hierarchical Grid) and won’t be accepted outside it’s column group, so the Multi header settings are respected. There are some gotcha-s here – the API move method will believe you more that the user and attempt to move whatever you tell it to wherever – yes you can move entire header by identifier, but careful with indexes – they include the group and vary inside it as well. I might do a whole blog on that later on, but for now just thoroughly test if you combine those features.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;So, back to those move types. As you might&amp;#39;ve guessed there’s a reason why the move type is exposed to the developer – it has performance implications because of the ways the actual moving is performed. Remember how data is laid in the HTML table – by columns? Of course not – it’s by rows. That means finding the right cell, detaching it and re-attaching it before/after a different target cell. That’s not that bad, but consider it is done for every row each time you move a column! It can get pretty intensive. &lt;/p&gt; &lt;p&gt;The re-render, on the other hand, destroys most of the grid layout and based on the already updated data source renders the data table again. So how’s that for intensive? Well, it depends kind of… Our developers noted this and I did some very quick tests to confirm this:&lt;/p&gt; &lt;p&gt;As a general rule of thumb, &lt;strong&gt;DOM Column Moving is faster for most browsers&lt;/strong&gt;, but (surprise, surprise!) the ‘render ‘ is actually faster for IE. And, yes, I’ve tested IE10 thinking there’s probably some sort of an error, but even with small sample numbers the difference was so huge that there’s no way it’s wrong. No idea why – is it the querying of a whole bunch of elements or the DOM manipulation that’s the bottleneck, but it turns out re-rendering is faster for IE.&lt;/p&gt; &lt;p&gt;But, hey, that’s just interesting info – there’s no reason for you to worry or even consider this an issue – there’s an &lt;strong&gt;easy solution – please, please use &lt;a title="igGrid Paging - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igGrid_Paging.html" target="_blank"&gt;Paging&lt;/a&gt;! &lt;/strong&gt;With reasonable page size the time it takes to move a column of 2000 rows takes a plunge down to a snappy, pretty much instant, 50ms range. Trust me when I say it makes all the difference and it’s an absolute must if you plan on a lot of data. And if for whatever reason you need it all in a single view(page) then &lt;a title="Configuring Virtualization Overview  - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igGrid_Enabling_and_Configuring_Virtualization.html" target="_blank"&gt;&lt;strong&gt;enable Row Virtualization&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;! &lt;/strong&gt;Paging kind of delivers the same functionality and the conclusion is an old one – virtualization is totally awesome with big data and a virtualized grid handles thousands of records like a boss!&lt;/p&gt; &lt;h1&gt;Making use of events to enhance functionality&lt;/h1&gt; &lt;p&gt;Personally there’s something that bugs me about the immediate mode of the feature.. When dragging columns around in a very demo grid, with all healthy mix of easily distinguishable text/numbers mix in the columns, it’s all good and merry. But when you hit a grid with like all numbers – like it’s very likely to happen in some scenarios – I find it really hard to track my column around. There’s no indicator with immediate, the only notice really is the empty header if hasn’t been disabled or the same text following you around. Good thing the Column Moving Events are many and give you precious information needed to control and/or enhance functionality.&lt;/p&gt; &lt;p&gt;Well I figured I can show you how to events and enrich the experience at the same time. I’ve decided to cheat a bit and steal the Sorting feature indication by highlighting the column currently moving with the following class:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9a89fdf2-9255-444a-aac4-c4300f5fa45a" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:100px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;style&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;.ui-iggrid&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;td.ui-state-moving&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;background&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;0&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;background-color&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;#c2e8f8&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;color&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;#333&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;font-weight&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;normal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;text-shadow&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;0&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;1px&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;0&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;rgba(255,255,255,0.8)&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;border-color&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;#b3e2f6&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000;"&gt;border-width&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;:  &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;1px&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;style&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Two things to note here – this is almost identical to the highlight &lt;a title="Ignite UI Grid Sorting sample" href="http://www.infragistics.com/products/jquery/sample/grid/local-sorting" target="_blank"&gt;Sorting&lt;/a&gt; uses, just renamed so it won’t mess with the feature’s CSS, but if you absolutely know you won’t be using Sorting or it’s highlight, it’s safe to just apply ‘ui-state-highlight’. And secondly, if you are using it with sorting CSS you might want to consider some different colors. Having said that, applying the class is extremely easy:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:bd4e027d-790b-4bf4-a78f-b865e6419a33" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;        features: [&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;name: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ColumnMoving&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;mode: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;immediate&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;columnDragStart: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (event, ui) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;ui.owner.element.find(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;tr td:nth-child(&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; + (ui.columnIndex + 1) + &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).addClass(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ui-state-moving&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;colMovingKey = ui.columnKey;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;columnDragEnd: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (event, ui) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; grid = $(event.target).data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;igGrid&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; newindex = grid.options.columns.indexOf(grid.columnByKey(colMovingKey)) + 1;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;grid.element.find(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;tr td:nth-child(&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; + newindex + &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).removeClass(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ui-state-moving&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The drag start and end events correspond directly to the jQuery UI Draggable events, and they even relay most of the common arguments. The &lt;a title="Column Moving events - Ignite UI jQuery API REFERENCE" href="http://help.infragistics.com/jQuery/2012.2/ui.iggridcolumnmoving#events" target="_blank"&gt;other events&lt;/a&gt; include a column moving and moved events to react before and after a move, and then a whole bunch of events related to the additional menu and dialog.&lt;/p&gt; &lt;p&gt;The above snippet is only fit for a very basic layout (the demos include a somewhat acceptable version with multi-column headers as well, so check them out). The result looks something like this – just imagine a much bigger grid and better image quality:&lt;/p&gt; &lt;p&gt;&lt;a title="Using the events of Column Mvoing to add a highlight while dragging." href="http://jsfiddle.net/damyanpetev/B4RbW/" target="_blank"&gt;&lt;img title="Using the events of Column Mvoing to add a highlight while dragging." alt="Using the events of Column Mvoing to add a highlight while dragging." src="http://media.infragistics.com/community/Release/12.2/jQuery/ignite-ui-grid-column-moving/ignite-ui-grid-column-moving-highlight.gif" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;As I always say, it’s not as much about modifying the feature, but showing you can quickly apply enhancements and control at various points of interest. And it’s that easy!&lt;/p&gt; &lt;h1&gt;Resources&lt;/h1&gt; &lt;p&gt;So besides all the links sprinkled all over, here’s a quick and useful list of info and demos:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;a title="Grid Column Moving - Ignite UI Online samples" href="http://www.infragistics.com/products/jquery/sample/grid/column-moving" target="_blank"&gt;Column Moving&lt;/a&gt; and &lt;a title="Grid Column Moving API - Ignite UI Online samples" href="http://www.infragistics.com/products/jquery/sample/grid/column-moving-api" target="_blank"&gt;Column Moving API&lt;/a&gt; samples for you to check out. Also for the &lt;a title="Hierarchical Grid with Column - Ignite UI samples" href="http://www.infragistics.com/products/jquery/sample/hierarchical-grid/hierarchical-grid-column-moving" target="_blank"&gt;Hierarchical Grid with Column moving&lt;/a&gt; and &lt;a title="Hierarchical Grid Column Moving API - Ignite UI samples" href="http://www.infragistics.com/products/jquery/sample/hierarchical-grid/hierarchical-grid-column-moving-api" target="_blank"&gt;Hierarchical Grid Column Moving API&lt;/a&gt;!&lt;/p&gt; &lt;li&gt; &lt;p&gt;&lt;a title="Grid Column Moving - Ignite UI&amp;trade; jQuery API Reference" href="http://help.infragistics.com/jQuery/2012.2/ui.iggridcolumnmoving" target="_blank"&gt;jQuery API Reference for the Column Moving feature&lt;/a&gt; &lt;/p&gt; &lt;li&gt; &lt;p&gt;&lt;a title="Grid Column Moving - Ignite UI&amp;trade; ASP.NET MVC Helper API Reference" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=Infragistics.Web.Mvc~Infragistics.Web.Mvc.GridColumnMoving_members.html" target="_blank"&gt;ASP.NET MVC Helper API Reference for the Column Moving feature&lt;/a&gt; &lt;/p&gt; &lt;li&gt; &lt;p&gt;A fairly elaborate &lt;a title="ASP.NET MVC Demo - both MVC Helper and script definitions of basic grid setup, enhanced with the above highlight, and in combination with Multi-Column Headers." href="http://media.infragistics.com/community/Release/12.2/jQuery/ignite-ui-grid-column-moving/GridColumnMoving.zip" target="_blank"&gt;ASP.NET MVC Demo&lt;/a&gt; using AdventureWorks (&lt;a href="http://msdn.microsoft.com/en-us/library/ms124501(v=sql.100).aspx"&gt;&lt;img title="AdventureWorks Sample Databases (MSDN)" alt="AdventureWorks Sample Databases (MSDN)" src="http://users.infragistics.com/dpetev/external_link.PNG" /&gt;&lt;/a&gt;) with both MVC Helper and script definitions of basic grid setup, enhanced with the above highlight, and in combination with Multi-Column Headers and highlighting.&lt;/p&gt; &lt;li&gt; &lt;p&gt;&amp;nbsp;&lt;a title="Ignite UI Grid Multi-Column Moving Demo" href="http://jsfiddle.net/damyanpetev/B4RbW/" target="_blank"&gt;Multi-Column Moving Demo on JSFiddle&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/p&gt; &lt;li&gt; &lt;p&gt;And finally.. Go get yours:&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p name="gotcha"&gt;I’d love to hear some thoughts, so leave a comment down below or &lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=393798" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/NetAdvantage+for+jQuery/default.aspx">NetAdvantage for jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics+Grid/default.aspx">Infragistics Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Grid/default.aspx">Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igGrid/default.aspx">igGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Hierarchical+Grid/default.aspx">Hierarchical Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Hierarchical/default.aspx">Hierarchical</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igHierarchicalGrid/default.aspx">igHierarchicalGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CTP/default.aspx">CTP</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/multi-column/default.aspx">multi-column</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Multi-column+headers/default.aspx">Multi-column headers</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/headers/default.aspx">headers</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Getting+Started/default.aspx">Getting Started</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/NetAdvantage+12.2/default.aspx">NetAdvantage 12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Highlighting/default.aspx">Highlighting</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI+Grid/default.aspx">Ignite UI Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column/default.aspx">Column</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Move/default.aspx">Move</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drag_2600_drop/default.aspx">drag&amp;drop</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drag/default.aspx">drag</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/draggable/default.aspx">draggable</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery+UI/default.aspx">jQuery UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/13.1/default.aspx">13.1</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/columns+move/default.aspx">columns move</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column+Move/default.aspx">Column Move</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/columns+moving/default.aspx">columns moving</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column+Moving/default.aspx">Column Moving</category></item><item><title>Financial charting with Ignite UI</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/02/13/financial-charting-with-ignite-ui.aspx</link><pubDate>Wed, 13 Feb 2013 19:50:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:391343</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=391343</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/02/13/financial-charting-with-ignite-ui.aspx#comments</comments><description>&lt;p&gt;&lt;img title="Financial charting with the Ignite UI Data Chart" style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="Financial charting with the Ignite UI Data Chart" align="left" src="http://media.infragistics.com/community/Release/12.2/jQuery/financial-chart/financial-charting-ignite-ui-datachart.png" /&gt;&lt;/p&gt; &lt;p&gt;Or should I say “How to deliver charts for &lt;a title="Technical analysis - Wikipedia" href="http://en.wikipedia.org/wiki/Technical_analysis" target="_blank"&gt;Technical analysis&lt;/a&gt;” and then throw in a little bit of understanding for a good measure. So, we are technical people, no? Then technical analysis shouldn’t sound so distant? Yeah, well, in the field of finance it kind of does… It’s used for forecasting the direction of prices, a discipline in security analysis (probably not the kind of security you would think about first). There’s also quite a bit of theory behind this, but put shortly it’s about making assumptions based on study of past prices and volumes. Still, being able to understand what you are doing is essential, so I’ll try to cover just a little bit – I have the feeling many don’t quite get those and will find it rather interesting. The analysis involves a whole set of values (business opening and closing prices, high and low reached, all for a set time frame and often complemented by volumes). That much data calls for more specialized types of series. Fortunately, the &lt;a title="Ignite UI Data Chart" href="http://www.infragistics.com/products/jquery/chart/" target="_blank"&gt;Ignite UI Data Chart&lt;/a&gt; has got you covered! Well, at least the technical part, so you can make the finance crowd happy and leave the analysis part to them. The chart control comes with the Financial Price Series in OHLC mode and Candlestick mode and the recent addition of over 35 financial overlay and indicator series to support those.&lt;/p&gt; &lt;h1&gt;Get to know the Financial Price Series &lt;/h1&gt; &lt;p&gt;These series are a combination of line and bar charts, where each point in the chart is actually a representation of all those 4 price values. But first things first, the data – all the four major values have to do with stock trading price – the high and low are pretty self explanatory, while the open and close are the trading prices agreed upon at the start and end of the business day or whatever time frame is to be plotted. These are all nicely indicated in a single &lt;a title="Open-high-low-close chart - Wikipedia" href="http://en.wikipedia.org/wiki/Open-high-low-close_chart" target="_blank"&gt;OHLC&lt;/a&gt; bar:&lt;/p&gt; &lt;p&gt;&lt;img title="Open-high-low-close chart bar diagram" alt="Open-high-low-close chart bar diagram" src="http://media.infragistics.com/community/Release/12.2/jQuery/financial-chart/financial-charting-ohlc-bar.png" /&gt;&lt;/p&gt; &lt;p&gt;It has a certain continuity to it so I figured it’d be nice to start with and easy to understand. Besides the bar like OHLC, another way of representing stock trades has been the Japanese Candlestick. While they provide the same information, the difference is in the degree of focus on some or all aspects.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Bulls and Bears&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Market sentiment" href="http://en.wikipedia.org/wiki/Market_sentiment" target="_blank"&gt;&lt;img title="Bear and Bull, Reinhard Dachlauer, Frankfurt - from WIkipedia" style="float:right;display:inline;" alt="Bear and Bull, Reinhard Dachlauer, Frankfurt - from WIkipedia" align="right" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Bulle_und_B%C3%A4r_Frankfurt.jpg/220px-Bulle_und_B%C3%A4r_Frankfurt.jpg" /&gt;&lt;/a&gt;It’s beyond me how exactly these two animals came to represent market &lt;a title="Market sentiment - Wikipedia" href="http://en.wikipedia.org/wiki/Market_sentiment" target="_blank"&gt;sentiment&lt;/a&gt; / &lt;a title="Market trend - Wikipedia" href="http://en.wikipedia.org/wiki/Market_trend" target="_blank"&gt;trend&lt;/a&gt;, which is exactly the reason to use such type of charting - because “&lt;em&gt;all boats float or sink with the tide”, &lt;/em&gt;they say, and also &amp;quot;&lt;i&gt;the trend is your friend&lt;/i&gt;&amp;quot;. The bull and bear describe upward or downward market trends and with them come the bullish and bearish bars in the charts that help identify trends. &lt;/p&gt; &lt;p&gt;The OHLC has the open and close on specific sides of the high-low bar, so all the data is equally visible, but there is no immediate focus on whether the open was lower than the close or the other way around (note the Ignite UI Data Chart provides color-coding for bullish/bearish). The Candlesticks, on the other hand, put a lot of emphasis on the opening and closing prices and make it quite easily visible and accessible – with both OHLC and bearishness/bullishness explained this should be pretty clear:&lt;/p&gt; &lt;p&gt;&lt;img title="A bullish OHLC bar / Candlestick" alt="A bullish OHLC bar / Candlestick" src="http://media.infragistics.com/community/Release/12.2/jQuery/financial-chart/financial-charting-bullish-candlestick-bar.png" /&gt;&lt;/p&gt; &lt;p&gt;The candlesticks’ body is symmetrical, but to indicate bullishness it is empty (or differently color-coded), while the bearish is filled (or just darker):&lt;/p&gt; &lt;p&gt;&lt;img title="A bearish OHLC bar / Candlestick" alt="A bearish OHLC bar / Candlestick" src="http://media.infragistics.com/community/Release/12.2/jQuery/financial-chart/financial-charting-bearish-candlestick-bar.png" /&gt;&lt;/p&gt; &lt;p&gt;Again it&amp;#39;s the same data, but rearranged and it&amp;#39;s a matter of preference, really. There&amp;#39;s also a nice technical side effect from this as I&amp;#39;ll describe below. In addition, Candlesticks are much more complicated than this - what I pictured above are actually a Big White and Big Black Candle patterns, but there are the most simple and a lot more advanced patterns used to read/predict trends and if you are interested check out this &lt;a title="Candlestick pattern article on Wikipedia" href="http://en.wikipedia.org/wiki/Candlestick_pattern" target="_blank"&gt;Candlestick pattern article&lt;/a&gt;. &lt;/p&gt; &lt;h1&gt;The technical stuff&lt;/h1&gt; &lt;p&gt;After the brief theory, we reach the part most of you would be interested in. So the series accept high, low, open and close values in the respective &lt;a title="Series Types - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igDataChart_Series_Types.html" target="_blank"&gt;member path property&lt;/a&gt;. The bonus I mentioned about the data being equal between OHLC and Candlestick is that you can effortlessly switch between them – there’s a reason why they are two modes of the same series - all you have to do is set the “displayType” property to either “candlestick” or “ohlc” and the chart will automatically react to changes! An example switch code:&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;$(&lt;span style="color:#006080;"&gt;&amp;quot;#priceChart&amp;quot;&lt;/span&gt;).igDataChart(&lt;span style="color:#006080;"&gt;&amp;quot;option&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;series&amp;quot;&lt;/span&gt;, [{&lt;br /&gt;    name: &lt;span style="color:#006080;"&gt;&amp;quot;stockSeries&amp;quot;&lt;/span&gt;,&lt;br /&gt;    displayType: &lt;span style="color:#006080;"&gt;&amp;quot;ohlc&amp;quot;&lt;/span&gt;&lt;br /&gt;}]);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Following in the footsteps&lt;/strong&gt; 
&lt;p&gt;While looking for a nice data source for my sample I looked into the &lt;strong&gt;amazing &lt;/strong&gt;&lt;a title="Infragistics Finance Dashboard - Silverlight application" href="http://labs.infragistics.com/silverlightdv/Showcases/StocksDashboard/" target="_blank"&gt;Finance Dashboard&lt;/a&gt; showcase (you can also download the &lt;a title="Infragistics Finance Dashboard - WPF Application" href="http://www.infragistics.com/products/wpf/application-samples#finance-dashboard" target="_blank"&gt;WPF Finance Dashboard&lt;/a&gt;). I loved the sample and I wanted to at least partially create something similar for Ignite UI, since the Ignite UI Data Chart comes from the XAML control. Oh, and I totally stole the sample &lt;a href="http://pipes.yahoo.com/pipes/" target="_blank"&gt;Yahoo! Pipes&lt;/a&gt; source, which if I may add is pretty awesome! So with the data out of the way, setting up a chart is rather easy:&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;$(&lt;span style="color:#006080;"&gt;&amp;quot;#priceChart&amp;quot;&lt;/span&gt;).igDataChart({&lt;br /&gt;    dataSource: ds.dataView(),&lt;br /&gt;    axes: [{&lt;br /&gt;        type: &lt;span style="color:#006080;"&gt;&amp;quot;categoryX&amp;quot;&lt;/span&gt;,&lt;br /&gt;        label: &lt;span style="color:#006080;"&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;,&lt;br /&gt;        name: &lt;span style="color:#006080;"&gt;&amp;quot;xAxis&amp;quot;&lt;/span&gt;&lt;br /&gt;      }, {&lt;br /&gt;        type: &lt;span style="color:#006080;"&gt;&amp;quot;numericY&amp;quot;&lt;/span&gt;,&lt;br /&gt;        name: &lt;span style="color:#006080;"&gt;&amp;quot;yAxis&amp;quot;&lt;/span&gt;&lt;br /&gt;    }],&lt;br /&gt;    series: [{&lt;br /&gt;        type: &lt;span style="color:#006080;"&gt;&amp;quot;financial&amp;quot;&lt;/span&gt;,&lt;br /&gt;        displayType: &lt;span style="color:#006080;"&gt;&amp;quot;candlestick&amp;quot;&lt;/span&gt;,&lt;br /&gt;        closeMemberPath: &lt;span style="color:#006080;"&gt;&amp;quot;Close&amp;quot;&lt;/span&gt;,&lt;br /&gt;        highMemberPath: &lt;span style="color:#006080;"&gt;&amp;quot;High&amp;quot;&lt;/span&gt;,&lt;br /&gt;        lowMemberPath: &lt;span style="color:#006080;"&gt;&amp;quot;Low&amp;quot;&lt;/span&gt;,&lt;br /&gt;        openMemberPath: &lt;span style="color:#006080;"&gt;&amp;quot;Open&amp;quot;&lt;/span&gt;,&lt;br /&gt;        xAxis: &lt;span style="color:#006080;"&gt;&amp;quot;xAxis&amp;quot;&lt;/span&gt;,&lt;br /&gt;        yAxis: &lt;span style="color:#006080;"&gt;&amp;quot;yAxis&amp;quot;&lt;/span&gt;,&lt;br /&gt;        name: &lt;span style="color:#006080;"&gt;&amp;quot;stockSeries&amp;quot;&lt;/span&gt;,&lt;br /&gt;        title: &lt;span style="color:#006080;"&gt;&amp;quot;Price Data&amp;quot;&lt;/span&gt;,&lt;br /&gt;        trendLineType: &lt;span style="color:#006080;"&gt;&amp;quot;simpleAverage&amp;quot;&lt;/span&gt;,&lt;br /&gt;        trendLinePeriod: 50&lt;br /&gt;    }]&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;As the Financial Series are often displayed with trend line from a variation of a &lt;a title="Moving Average - Wikipedia" href="http://en.wikipedia.org/wiki/Moving_average" target="_blank"&gt;moving averages,&lt;/a&gt; do note that as above the “simpleAverage” and the others (exponential, modified, cumulative, weighted) are all moving averages right there at your disposal and can have their &lt;a title="Ignite UI Data Chart Trendline Types sample" href="http://www.infragistics.com/products/jquery/sample/chart/trendline-types" target="_blank"&gt;period customized&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also added that accompanying Volume series below in a similar way and a third chart with indicators. Then I figured it’ll also be nice to have some sort of &lt;strong&gt;synchronization&lt;/strong&gt; between the charts to imitate that zoombar’s functionality and event though it’s not quite the same thing, you can easily manipulate them via the World Rectangle. I chose to just use an event from the main stock chart, but this can easily be controlled from a range slider or something similar as well:&lt;/p&gt;
&lt;div&gt;
&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;$(&lt;span style="color:#006080;"&gt;&amp;quot;#priceChart&amp;quot;&lt;/span&gt;).igDataChart({&lt;br /&gt;            windowRectChanged: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; (evt, ui) {&lt;br /&gt;            &lt;span style="color:#008000;"&gt;// Keep the other two charts in sync&lt;/span&gt;&lt;br /&gt;                $(&lt;span style="color:#006080;"&gt;&amp;quot;#indicatorChart&amp;quot;&lt;/span&gt;).add(&lt;span style="color:#006080;"&gt;&amp;quot;#volumeChart&amp;quot;&lt;/span&gt;).igDataChart(&lt;span style="color:#006080;"&gt;&amp;quot;option&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;windowRect&amp;quot;&lt;/span&gt;, {&lt;br /&gt;                    left: ui.newLeft,&lt;br /&gt;                    top: ui.newTop,&lt;br /&gt;                    width: ui.newWidth,&lt;br /&gt;                    height: ui.newHeight&lt;br /&gt;                });&lt;br /&gt;            }&lt;br /&gt;        });&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;As a note, this event is fired a lot so if you intend to use it I suggest you also use the “windowResponse” set to &amp;quot;deferred&amp;quot; on the controlling chart. Careful with cross-linking charts this way – setting new values will also fire the respective charts’ events, just so you know.. and yes the chart is smart enough to ignore values if nothing is really different, but still be mindful. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font color="#00aeef"&gt;Update:&lt;/font&gt; Easier and better &lt;/strong&gt;&lt;strong&gt;synchronization&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;Following up a tip from one of our Chart experts, Graham Murray, it turns out I completely overlooked the fact &lt;strong&gt;Ignite UI Data Chart also has built-in synchronization&lt;/strong&gt;! In this case the above code can be completely replaced by these lines:&lt;/p&gt;
&lt;p&gt;
&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;$(&lt;span style="color:#006080;"&gt;&amp;quot;#priceChart&amp;quot;&lt;/span&gt;).igDataChart({&lt;br /&gt;    syncChannel: &lt;span style="color:#006080;"&gt;&amp;quot;channel1&amp;quot;&lt;/span&gt;,&lt;br /&gt;    synchronizeVertically: &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;,&lt;br /&gt;    syncrhonizeHorizontally: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;br /&gt;});&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;You set the other charts to the same sync channel and settings and you are good to go! This takes care of all the possible issues with the method above and also provides a cool bonus – the zoom preview shown on the main chart (when response is deferred) is also displayed on the other sync’d charts! The JSFiddle demo has been updated, check the link below!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;Notes and tips&lt;/strong&gt; 
&lt;p&gt;I actually have a decent set of other “good to know” stuff along the way, so here’s some:
&lt;ul&gt;
&lt;li&gt;&lt;font color="#00aeef"&gt;Update:&lt;/font&gt; The “resolution” series property has an interesting effect on the Financial Price Series – it determines how many records can be coalesced into a single Candlestick/OHLC bar when there isn’t enough room. Of course, details are revealed when you zoon in. This can be very awesome for huge data sets or really tiny spaces (hello mobile dashboard!). There’s an alternative demo right &lt;a title="Ignite UI Finance Dashboard demo with coalescing for smaller sizes." href="http://jsfiddle.net/damyanpetev/JEnPz/" target="_blank"&gt;here&lt;/a&gt;.
&lt;li&gt;Don’t shy away from using the power of the underlying igDataSource to mold the incoming data to your needs and reduce potentially hulking requests to get filtered sub-sets. As you will be able to see in the demo I’m pre-sorting the data as it comes with the latest first in the array, which would totally make for a backwards plotting if not sorted. The &lt;a title="Ignite UI Data Source Methods API" href="http://help.infragistics.com/jQuery/2012.2/ig.datasource#methods" target="_blank"&gt;igDataSource got the tools&lt;/a&gt; for the job. 
&lt;li&gt;The “outline” brush property will affect both the outline for candle stick and the shadows (they are drawn in the same stroke with the outline, just so know). However, the outline has nothing to do with the OHLC bars – they, like other line-based series, have no outline. 
&lt;li&gt;The OHLC bars are, however, affected by the “brush” – in both series the main brush color will be used to indicate bullish candles(the fill)/bars. If you want both &lt;strong&gt;empty candlesticks&lt;/strong&gt; and the ability to &lt;strong&gt;switch&lt;/strong&gt; between modes on the same series, make sure you change the brush color when going to OHLC as the bullish bars there might be left almost invisible! 
&lt;li&gt;In both series, the the “negativeBrush” property color will be used to indicate bearish candles(the fill)/bars. 
&lt;li&gt;All the brush properties can be altered at runtime just like changing modes, you can also &lt;a title="Styling igDataChart with Themes - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igDataChart_Styling_Themes.html" target="_blank"&gt;style the chart using themes&lt;/a&gt;! 
&lt;li&gt;The Financial Indicator/Overlay series are actually 36 in number - an impressive number to chew through. Keep in mind each has a set of required data-binding properties(out of the the already familiar High, Low, Close and Volume) and the some. I’ll go in much greater detail below. 
&lt;li&gt;Note that with the Data Chart you have freedom to position your indicator series – either as separate charts, or with the main Financial Series using multiple axes. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Financial Indicators&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“These indicators are used to help assess whether an asset is trending, and if it is, the probability of its direction and of continuation. Technicians also look for relationships between price/volume indices and market indicators”. Often found above, below and on top of the financial charts. They can be used the same way as any other series found in the igDataChart control and require specific data mapping to stock price values and stock volume. That last part is where it gets extra interesting…&lt;/p&gt;
&lt;p&gt;The Ignite UI Data Chart does inherit most of it’s features from the XAML Data Chart, so many things true for the latter and also true for the jQuery one. This means you can also check out the &lt;a href="http://help.infragistics.com/NetAdvantage/WPF/2012.2/CLR4.0/?page=xamDataChart_Financial_Indicators.html" target="_blank"&gt;XAML documentation&lt;/a&gt; or possibly re-use previous experience with the control. I have, however, went the extra mile on this one to provide you with a &lt;strong&gt;complete reference&lt;/strong&gt; (Ignite UI jQuery API style) of all the Financial Indicator and Overlay series types, descriptions and their relevant data-binding and setting properties! I give you the:&lt;/p&gt;
&lt;p&gt;&lt;a name="_supportedTable12"&gt;&lt;/a&gt;&lt;a title="Ignite UI Data Chart Financial Indicators and Overlays" href="http://media.infragistics.com/community/Release/12.2/jQuery/financial-chart/Ignite-UI-Chart-Financial-Indicators.htm" target="_blank"&gt;&lt;strong&gt;Ignite UI Data Chart Financial Indicators and Overlays&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; (WARNING! Massive, huge table Inside!)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After all, it 36 series and I slightly failed on finding better arrangement, but hey – you are welcome! &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Smile" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/6378.wlEmoticon_2D00_smile_5F00_74E78528.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title="The demo allows for switching between different financial indicator series with customizable period." alt="The demo allows for switching between different financial indicator series with customizable period." src="http://media.infragistics.com/community/Release/12.2/jQuery/financial-chart/ignite-ui-data-chart-financial-indicators-overlays.png" /&gt;&lt;/p&gt;
&lt;p&gt;Also note all the specific properties like periods and such have defaults in case you are wondering what happens if you skip them. For the demo I picked just a few series with a period (usually defaults to 14, with some exceptions I’ve marked in brackets) so I can safely share settings and let you play with them.&lt;/p&gt;
&lt;p&gt;Oh and the full view?&lt;/p&gt;
&lt;p&gt;&lt;a title="Ignite UI Finance Dashboard" href="http://jsfiddle.net/damyanpetev/vfgkW/embedded/result/" target="_blank"&gt;&lt;img src="http://media.infragistics.com/community/Release/12.2/jQuery/financial-chart/ignite-ui-financial-dashboard-small.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It’s not quite like the Dashboard I was after, but this is as far as I had the time to get it to and there’s still plenty of polishing to do. At the very least this is all real data (one year span) and functional enough to play with and give you a good idea what you can do with the Data Chart.&lt;/p&gt;
&lt;h1&gt;Resources&lt;/h1&gt;
&lt;p&gt;So besides all the links sprinkled all over, here’s a quick and useful list of info and demos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="igDataChart - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igDataChart_Landing_Page.html" target="_blank"&gt;Documentation for the igDataChart&lt;/a&gt; 
&lt;li&gt;
&lt;p&gt;&lt;a title="Chart Financial Series - Ignite UI Online samples" href="http://www.infragistics.com/products/jquery/sample/chart/financial-series" target="_blank"&gt;Financial Series sample&lt;/a&gt;. You can also check out this &lt;a title="Data Chart Financial Indicators - Ignite UI Online Samples" href="http://www.infragistics.com/products/jquery/sample/chart/financial-indicators" target="_blank"&gt;sample with all Financial Indicators available&lt;/a&gt;!&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a title="Ignite UI Finance Dashboard demo" href="http://jsfiddle.net/damyanpetev/vfgkW/embedded/result/" target="_blank"&gt;&lt;strong&gt;Demo Finance Dashboard is on JSFiddle&lt;/strong&gt;&lt;/a&gt; (link is to the result, as this is meant to be viewed in full screen). Top right for a link to the edit page. And in case you want to save this one there’s a pieced-together html file right &lt;a title="Ignite UI Finance Dashboard demo" href="http://media.infragistics.com/community/Release/12.2/jQuery/financial-chart/financial-charting.html#" target="_blank"&gt;here&lt;/a&gt;. Yeah, no ASP.NET demo, at least not yet.&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;font color="#00aeef"&gt;Update:&lt;/font&gt; Alternative demo with &lt;a title="Charts coalescing up to two weeks of data in one bar" href="http://jsfiddle.net/damyanpetev/JEnPz/" target="_blank"&gt;charts coalescing up to two weeks of data in one bar&lt;/a&gt; to fit in smaller spaces and expanding to normal when zoomed.&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;And finally.. Go get yours:&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p name="gotcha"&gt;I’d love to hear some thoughts, so leave a comment down below or &lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=391343" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/NetAdvantage+for+jQuery/default.aspx">NetAdvantage for jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CDN/default.aspx">CDN</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Chart/default.aspx">Chart</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igDataSource/default.aspx">igDataSource</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.1/default.aspx">12.1</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Data+Source/default.aspx">Data Source</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/NetAdvantage+12.2/default.aspx">NetAdvantage 12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery+UI/default.aspx">jQuery UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Financial+Overlay/default.aspx">Financial Overlay</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/OHLC/default.aspx">OHLC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/technical+analysis/default.aspx">technical analysis</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/synchronization/default.aspx">synchronization</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Financial+Price+Series/default.aspx">Financial Price Series</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/stock/default.aspx">stock</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/tips/default.aspx">tips</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igDataChart/default.aspx">igDataChart</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/bearish/default.aspx">bearish</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Financial+Indicators/default.aspx">Financial Indicators</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/bullish/default.aspx">bullish</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Data+Chart/default.aspx">Data Chart</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Candlestick/default.aspx">Candlestick</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Finance/default.aspx">Finance</category></item><item><title>PHP Server-side wrapper for the Ignite UI File Upload</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/01/30/php-server-side-wrapper-for-the-ignite-ui-file-upload.aspx</link><pubDate>Wed, 30 Jan 2013 23:53:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:390486</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=390486</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/01/30/php-server-side-wrapper-for-the-ignite-ui-file-upload.aspx#comments</comments><description>&lt;img title="PHP Ignite UI File Upload wrapper" style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="PHP Ignite UI File Upload wrapper" align="left" src="http://media.infragistics.com/community/jquery/media/PHP/file-upload/ignite-ui-file-upload-php-wrapper.png" /&gt; &lt;p&gt;I’ve been recently having plenty of fun shifting platforms like a mad man and I feel it’s time to share some goodness with you all. Let’s have ourselves some PHP (and even if that’s not your thing you still might want to check out the last part)! While we still stand behind our statement that the &lt;a title="Ignite UI: JavaScript / jQuery &amp;amp; HTML5 UI Framework" href="http://www.infragistics.com/products/jquery/" target="_blank"&gt;Ignite UI&lt;/a&gt; controls can run everywhere and are server-agnostic, there should really be a tiny asterisk on that one. And what it should state is… well, that you would need custom server side logic to use the File Upload as it only comes with ASP.NET support (handlers for IIS) out-of-the-box. With that in mind, it is true that the control itself is still 100% client-side jQuery, but highly dependent (for now) on communication with the server (I’ll explain why in a bit). So I’ve been on this PHP wave going for &lt;a title="Using Ignite UI Controls with WordPress" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/01/10/using-ignite-ui-components-with-wordpress.aspx" target="_blank"&gt;Ignite UI Controls with WordPress&lt;/a&gt; (for which I’m still gather opinions by the way!) and I thought it would be an awesome idea to have proper PHP wrappers for all Ignite UI controls to ease that up and also to be usable as standalone in other apps. Pretty much I’m making baby-steps towards the original goal (bear with me) and I thought I’d start with something useful like the File Upload:&lt;/p&gt; &lt;p&gt;&lt;img title="Ignite UI File Upload in PHP environment?" alt="Ignite UI File Upload in PHP environment?" src="http://media.infragistics.com/community/jquery/media/PHP/file-upload/ignite-ui-upload-progress-php.png" /&gt;&lt;/p&gt; &lt;p&gt;Take into account that the best part of the control is the AJAX multiple file upload and the progress tracking. First part is taken care of on the client, but the latter needs serious back-end push in most cases where the latest XHR is not supported and I’ll mention those last, for now assume you can’t rely on that. I figured the File Upload progress can’t be that hard – boy, was I in for a ride ..&lt;/p&gt; &lt;h1&gt;Limitations, limitations and then some..&lt;/h1&gt; &lt;p&gt;So how is file progress handled without client-side access? Well, you can say it takes a lot of communication &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Smile" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/1488.wlEmoticon_2D00_smile_5F00_2C0DCC09.png" /&gt; For the client side to provide a decent experience it needs to know the size of the file, and sadly no good browser will disclose such information to JavaScript (and thus jQuery). So what do you do when only the server can know the actual file size? You ask, of course! The default way of doing so is to fake the file post with special hint to the server (so the backend can grab the size) and reject it. That, however, only flies when you do have access to the actual incoming stream and control over it. The case with PHP is not such – files reach your code ready-to-use. Essentially all you have to do is pick the files you want from the $_FILES superglobal and move them to where you want them saved, for example:&lt;/p&gt; &lt;div&gt; &lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;$sucess = move_uploaded_file($_FILES[&lt;span style="color:#006080;"&gt;&amp;quot;fileInput&amp;quot;&lt;/span&gt;][&lt;span style="color:#006080;"&gt;&amp;quot;tmp_name&amp;quot;&lt;/span&gt;] , &lt;span style="color:#006080;"&gt;&amp;#39;upload/&amp;#39;&lt;/span&gt; . $_FILES[&lt;span style="color:#006080;"&gt;&amp;quot;fileInput&amp;quot;&lt;/span&gt;][&lt;span style="color:#006080;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;]);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;echo&lt;/span&gt; ($sucess ? &lt;span style="color:#006080;"&gt;&amp;quot;Stored &amp;quot;&lt;/span&gt; : &lt;span style="color:#006080;"&gt;&amp;quot;Failed to store&amp;quot;&lt;/span&gt;) . &lt;span style="color:#006080;"&gt;&amp;quot;in: &amp;quot;&lt;/span&gt; . &lt;span style="color:#006080;"&gt;&amp;quot;upload/&amp;quot;&lt;/span&gt; .  $_FILES[&lt;span style="color:#006080;"&gt;&amp;quot;fileInput&amp;quot;&lt;/span&gt;][&lt;span style="color:#006080;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;];&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Pretty simple! But PHP’s simplicity is both a blessing and a curse - it will upload files to temporary folder and assign temporary names for you, and sadly the actual PHP script you want to use to handle file uploads will only be executed after the file has been completely uploaded or an error has occurred. You can see the problem here, right? Imagine a 100MB file is to be uploaded..so wait for how long to get the size? And the whole&amp;nbsp; file just to grab the size? And then dump it and upload again? It’s just pointless when you can’t immediately cancel the upload. So no initial size will be available, fine, but progress, what about that? Well cue the drums, in comes PHP 5.4 giving you a fairly usable way of tracking just that. The inner handling of the actual file upload will kindly set you some info in a special variable in the $_SESSION so you can check how the file is coming along. So far so good, you’d imagine, but as long as there’s actual progress going on being posted to one point, another would be best to be constantly polled. That ensures quite the additional work to synchronize between those. &lt;/p&gt;
&lt;p&gt;There’s more - remember the part where the file actually makes it all the way to the server, before the realization it’s not welcome happens? Yeah, that also means the progress you are showing to the client is the temporary file being transferred, and only at the end of it will you know if it was successfully saved.&lt;/p&gt;
&lt;p&gt;So you get no initial information on size and the outcome is only available after a short wait time? PHP also offers an additional MAX_FILE_SIZE field (see &lt;a title="http://www.php.net/manual/en/features.file-upload.post-method.php" href="http://www.php.net/manual/en/features.file-upload.post-method.php"&gt;http://www.php.net/manual/en/features.file-upload.post-method.php&lt;/a&gt;) which truly confused the living hell out of me. I’m far from the illusion it’s a browser hint ( I mean I think we can almost take&amp;nbsp; &lt;a title="XMLHttpRequest Level 2 - W3C Working Draft" href="http://www.w3.org/TR/XMLHttpRequest2/" target="_blank"&gt;XMLHttpRequest Level 2&lt;/a&gt; (and &lt;a title="File API -  W3C Working Draft 25 October 2012" href="http://www.w3.org/TR/FileAPI/" target="_blank"&gt;File API&lt;/a&gt;) as granted soon, as it looks like it’s already stable and spreading to even &lt;a title="Can I use... XMLHttpRequest level 2" href="http://caniuse.com/#feat=xhr2" target="_blank"&gt;IE10&lt;/a&gt;!) so I would assume that fields feature is similar to the actual &lt;a title="PHP Session Upload Progress" href="http://php.net/manual/en/session.upload-progress.php" target="_blank"&gt;Session progress field&lt;/a&gt; and &lt;a title="some explanation on stackoverflow" href="http://stackoverflow.com/a/6273418/1613589" target="_blank"&gt;it somewhat is&lt;/a&gt;. While it says it’s supposed to save “users the trouble of waiting for a big file being transferred only to find that it was too large” from my tests(PHP 5.4.7) I find it &lt;a title="Bug #62536: file uploads MAX_FILE_SIZE doesn&amp;#39;t work as described" href="https://bugs.php.net/bug.php?id=62536" target="_blank"&gt;doesn’t really abort the upload&lt;/a&gt;, but the session upload progress does hang.&amp;nbsp; &lt;em&gt;//end rant&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;While I have included this as optional functionality, it should be noted this is easily manipulated and while not very functional, it should definitely not be trusted to restrict the size. I could say the progress hang has the potential with some additional logic to be used to detect when the file has gone over the limit and cancel it(from either side), but I haven’t came around to doing that just yet.&lt;/p&gt;
&lt;p&gt;Oh yeah, finally you have the session info disappearing from the superglobal as soon as the file is done loading, which is because of the auto-clean. That is again simpler to handle, but harder to manipulate. The thing is, it’s highly recommended to have it on, so I won’t ask you to do otherwise, instead more of the guessing game!&lt;/p&gt;
&lt;h1&gt;Workarounds, hacks, tricks, etc.&lt;/h1&gt;
&lt;p&gt;First things first, the settings (in the php.ini or &lt;a title="How to change configuration settings" href="http://php.net/manual/en/configuration.changes.php" target="_blank"&gt;some other way&lt;/a&gt;, depending on the hosting and what not..) &lt;a href="http://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize"&gt;upload_max_filesize&lt;/a&gt; should be set to something reasonable (keep in mind as default it’s just 2MB) and it should be less than &lt;a href="http://www.php.net/manual/en/ini.core.php#ini.post-max-size"&gt;post_max_size&lt;/a&gt;! Note that there is no workaround for those, other maximum sizes you see are ‘soft’ limits. Note that the Ignite UI File Upload will still do multiple requests for separate files, so the maximum post size can be almost the same as the maximum file size, you don’t need to worry about that. Also, &lt;a href="http://www.php.net/manual/en/session.configuration.php#ini.session.upload-progress.enabled"&gt;session.upload_progress.enabled&lt;/a&gt; should be on (it is by default) and I&amp;#39;ve left the rest to defaults as well.&lt;/p&gt;
&lt;p&gt;So to have a working file upload with PHP on the back-end some patching up of the Ignite UI control was required. Since the actual progress requires the special hidden field before the input (of type file) and we can’t really fake-post here – I have a handler removing the actual file input when registering the file with the server for file size (which for the reason is always initially 0) and adding the special hidden field(s) when the actual post does happen. This is done through scripts emitted from the wrapper. What they also do is play yet another trick on the widget and fix the size in the file information once it becomes available (which is only after the upload has actually started) so the user experience can be mostly unaffected. Oh and the &lt;a title="File Upload - IGNITE  UI API REFERENCE" href="http://help.infragistics.com/jQuery/2012.2/ui.igupload#options" target="_blank"&gt;auto-start upload feature&lt;/a&gt; totally plays on every weak side of the PHP handling – skipping the initial register and directly going for posting the file and asking for status – which again is unfortunately not really ideal since I can’t map the key from the post with its file name before the upload has ended…therefore requests with the key would return nothing. So I register the file before the widget gets a change to submit in that case, which might not be ideal, but does the job.&lt;/p&gt;
&lt;p&gt;One last touch is trying had to maintain a minimal footprint in the session storage by deleting keys that have finished/threw error. However, the equivalent ASP.NET wrapper only holds to such information for a given period of time, which is quite a cumbersome task with PHP, so when you register(pick) a file, but then remove it - no more&amp;nbsp; requests are made with that key and it sticks around. Here’s an optional way to deal with that : &lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;$(document).delegate(&lt;span style="color:#006080;"&gt;&amp;quot;#igUpload1&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;iguploadfileuploadaborted&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; (evt, ui) {&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (ui.status == 0) {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; key = $(&lt;span style="color:#006080;"&gt;&amp;quot;#igUpload1&amp;quot;&lt;/span&gt;).igUpload(&lt;span style="color:#006080;"&gt;&amp;quot;getFileInfoData&amp;quot;&lt;/span&gt;).filesInfo[ui.fileId].key;&lt;br /&gt;        $.ajax({&lt;br /&gt;            url: &lt;span style="color:#006080;"&gt;&amp;quot;uploadHandler.php&amp;quot;&lt;/span&gt;,&lt;br /&gt;            type: &lt;span style="color:#006080;"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;,&lt;br /&gt;            data: {&lt;span style="color:#006080;"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;: key, &lt;span style="color:#006080;"&gt;&amp;#39;command&amp;#39;&lt;/span&gt;: &lt;span style="color:#006080;"&gt;&amp;quot;clear&amp;quot;&lt;/span&gt; }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;This is totally optional, of course, you could implement something better.&lt;/p&gt;
&lt;h1&gt;Usage&lt;/h1&gt;
&lt;p&gt;Why PHP wrappers , you’d ask? Well, so you can have this oh-so-very-nice experience inside your IDE:&lt;/p&gt;
&lt;p&gt;&lt;img title="Setting up the Ignite UI PHP object in NetBeans IDE" alt="Setting up the Ignite UI PHP object in NetBeans IDE" src="http://media.infragistics.com/community/jquery/media/PHP/file-upload/file-upload-php-phpdoc-hint.png" /&gt;&lt;/p&gt;
&lt;p&gt;Having pretty much every setting easily available and mostly described (I might’ve failed here) should make using the Ignite UI widgets a joy! And hey, while at it, figured it’s also nice to have the &lt;strong&gt;Loader&lt;/strong&gt; PHP-ready as well! And the options on both classes are identical to the actual jQuery API (so you don’t need PHP specific documentation and so I can serialize them easily &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Smile" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/1488.wlEmoticon_2D00_smile_5F00_2C0DCC09.png" /&gt; ) . &lt;/p&gt;
&lt;p&gt;Note you still need to include jQuery and jQuery UI as usual, and then:&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&amp;lt;?php&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;include_once&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;#39;IG/igLoader.php&amp;#39;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;include_once&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;#39;IG/igUpload.php&amp;#39;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;include_once&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;#39;IG/config.php&amp;#39;&lt;/span&gt;;        &lt;br /&gt;$igLoader = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ig\loader\igLoader(&lt;span style="color:#006080;"&gt;&amp;quot;http://cdn-na.infragistics.com/jquery/20122/latest/css/&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;http://cdn-na.infragistics.com/jquery/20122/latest/js/&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;igUpload&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;echo&lt;/span&gt; $igLoader;&lt;br /&gt;$igUpload1 = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ig\upload\igUpload(&lt;span style="color:#006080;"&gt;&amp;quot;igUpload1&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;upload.php&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;uploadHandler.php&amp;quot;&lt;/span&gt;);&lt;br /&gt;$igUpload1-&amp;gt;allowedExtensions = ig\upload\Config::$allowedExts;&lt;br /&gt;$igUpload1-&amp;gt;mode = ig\upload\UploadMode::Multiple;&lt;br /&gt;$igUpload1-&amp;gt;maxSimultaneousFilesUploads = 2;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;echo&lt;/span&gt; $igUpload1;&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;The upload handler is the endpoint for requesting status updates, handled by the class I’ve also included. And the third main piece of the package is the upload module that handles file posts. The config contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;allowed extensions&amp;nbsp; - set to the Upload control above and also verified by the module when saving. 
&lt;li&gt;accepted Mime types – again verified by the module when saving. 
&lt;li&gt;file upload path – this is the place the module will try to save to, make sure it exists with write rights 
&lt;li&gt;max file size – used by the module, can also be assigned to the Upload control, but as explained above its uses are very limited.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;And one last thing - &lt;strong&gt;security&lt;/strong&gt;..yeah. it&amp;#39;s that part again... well I&amp;#39;m no PHP master and many of the enforced restrictions are based on information that comes from the client. Therefore, they can&amp;#39;t be trusted and just in case I&amp;#39;ve missed something(probably have) you can use the “fileUploaded” event to apply any other checks you want. So in the “upload.php” you can have:&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;&lt;pre id="codeSnippet" style="border-top-style:none;overflow:visible;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&amp;lt;?php&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;include_once&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;#39;IG/igUploadModule.php&amp;#39;&lt;/span&gt;;&lt;br /&gt; $uploadModule = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ig\upload\igUploadModule();&lt;br /&gt; $uploadModule-&amp;gt;fileUploaded(&lt;span style="color:#006080;"&gt;&amp;quot;fileSaving&amp;quot;&lt;/span&gt;);&lt;br /&gt; $uploadModule-&amp;gt;HandleRequests();&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; fileSaving($sKey, $fKey){&lt;br /&gt;     $sessionInfo = $_SESSION[$sKey];&lt;br /&gt;     $fileInfo = $_FILES[$fKey];&lt;br /&gt;     &lt;span style="color:#008000;"&gt;//check if file should be accepted&lt;/span&gt;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;The function will receive two keys – one for the session info and one for the file info in their respective globals, so you can have the final say if the file should be saved by returning true or false.&lt;/p&gt;
&lt;p&gt;Also note that while a blacklist is generally recommended I find a small whitelist to be much more restrictive and closer to the existing control behavior.&lt;/p&gt;
&lt;h1&gt;The future looks HTML5 bright…&lt;/h1&gt;
&lt;p&gt;… but not FLASH-y – and by that I mean HTML5 specifications are actively evolving to make any and all client side plugins a thing of the past and file uploading and general file access have been long overdue. Now, though, HTML5 (well, technically, &lt;a title="XMLHttpRequest Level 2 - W3C Working Draft" href="http://www.w3.org/TR/XMLHttpRequest2/" target="_blank"&gt;XMLHttpRequest Level 2&lt;/a&gt; is not part of HTML5, but still…) is to offer file access as well as upload progress - pretty much everything you need from the browser (one of the sides that already inherently knows the upload status, but never liked to share so far). So in that sense, I would like to proudly announce that all the hacks and what not are soon going to be completely unnecessary – &lt;strong&gt;the Ignite UI File Upload is going HTML5 mode&lt;/strong&gt; with the next release (that is 13.1) so there will be no more file size requests and no more status requests!&lt;/p&gt;
&lt;p&gt;But seriously, that’s not completely true – as I mentioned the standard is not finished and the browser support is not that broad. The point is that the Upload widget itself will fill in the gaps - and the current implementation of the upload module will still verify and accept files just fine, but there will no longer be requests for status. There will be some minor adjustments required to optimize it, but in a up-to-date browser your File Upload widget will produce much less traffic!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Try the &lt;a title="PHP Ignite UI FIle Upload wrapper and test project" href="http://media.infragistics.com/community/jquery/media/PHP/file-upload/ignite-ui-File-Upload.zip" target="_blank"&gt;PHP File Uplaod with Ignite UI&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt; for yourself&lt;/strong&gt; and if you see somewhere I can improve something or you find a bug do let me know. PHP 5.4 is required. Also once you can get your hands on the new File Upload I will try to provide the PHP wrappers updated for 13.1. Perhaps some WordPress plugin and the same treatment are incoming for other controls (I also might be totally overdoing the promises right now &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Smile" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/1488.wlEmoticon_2D00_smile_5F00_2C0DCC09.png" /&gt; ), but in the meantime, grab your version of the awesome Ignite UI toolset:&lt;/p&gt;
&lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p name="gotcha"&gt;I’d love to hear some thoughts, so leave a comment down below or &lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=390486" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/NetAdvantage+for+jQuery/default.aspx">NetAdvantage for jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Upload/default.aspx">Upload</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igUpload/default.aspx">igUpload</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery+UI/default.aspx">jQuery UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/PHP/default.aspx">PHP</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/PHP+wrapper/default.aspx">PHP wrapper</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/File+Upload/default.aspx">File Upload</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/file/default.aspx">file</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/13.1/default.aspx">13.1</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/progress/default.aspx">progress</category></item><item><title>Using jQuery UI Controls with WordPress</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/01/10/using-ignite-ui-components-with-wordpress.aspx</link><pubDate>Thu, 10 Jan 2013 16:54:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:388025</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=388025</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/01/10/using-ignite-ui-components-with-wordpress.aspx#comments</comments><description>&lt;p&gt;&lt;img title="Ignite UI jQUery controls in WordPress? The options." style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="Ignite UI jQUery controls in WordPress? The options." align="left" src="http://media.infragistics.com/community/jquery/media/wordpress/ignite-ui-in-wordpress.png" /&gt;We&amp;rsquo;ve stated time and time again that the &lt;a title="Ignite UI: JavaScript / jQuery &amp;amp; HTML5 UI Framework" href="http://www.infragistics.com/products/jquery/" target="_blank"&gt;Ignite UI&lt;/a&gt; controls based on jQuery and jQuery UI are pure client-side scripts that are completely server agnostic (meaning they do not depend on the back end). So we keep saying you can use them everywhere, yet time limits the number of platforms we can cover with guides and such. There has been one article on &lt;a title="Using jQuery Grid with PHP" href="http://www.infragistics.com/community/blogs/taz_abdeali/archive/2012/02/08/netadvantage-for-jquery-with-php-101.aspx" target="_blank"&gt;Using jQuery Grid with PHP&lt;/a&gt; pretty much. We figured it might be a good time for some more. PHP itself is so tightly integrated with web content (petty much described as HTML-embedded) that every html snippet and sample you find is yours for the taking. Considering that along with JavaScript, they are the two most widely spread scripting languages, I would also assume if you do Web with PHP you probably have a decent experience with both. You can tell&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s all good and merry when integrating with your own site&amp;rsquo;s internals, but what if you are developing for something like &lt;a href="http://wordpress.org/" target="_blank"&gt;WordPress&lt;/a&gt;? It&amp;rsquo;s extremely popular and powers a decent chunk of the top websites. The thing about WordPress is that perhaps part of its popularity is due to the fact that it provides a very powerful, but at the same time very user-friendly platform to build sites on &amp;ndash; and by that I mean a very easy interface for non-programmers, extensive admin panel, widgetized themes and a plethora of extensions. That also means that if you are in the role of the programmer you have a lot of demand and a platform to develop for &lt;img class="wlEmoticon wlEmoticon-smile" style="border-style:none;" alt="Smile" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/0044.wlEmoticon_2D00_smile_5F00_3A4ECAD4.png" /&gt;&lt;/p&gt;
&lt;h1&gt;General&lt;/h1&gt;
&lt;p&gt;I think everyone are/will be quite pleased with the ways you can add functionality to WP &amp;ndash; they all have their strengths in certain areas, but more on that later.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the general concept of running an Ignite UI widget in a page &amp;ndash; you need jQuery, relevant jQuery UI and Ignite UI scripts (an awesome place to get a list of requirements for each control is to visit the &lt;a title="IGNITEUI API REFERENCE" href="http://help.infragistics.com/jQuery/2012.2/" target="_blank"&gt;Ignite UI API Reference&lt;/a&gt; where each control&amp;rsquo;s home page gives a detailed ordered list of dependencies or sink yer teeth in the &lt;a title="Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0" target="_blank"&gt;Documentation&lt;/a&gt;). As you probably already know the reason I mentioned PHP is because WordPress is built with it &amp;ndash; that means you could probably just go and output whatever and wherever you like. However, the beauty of it is that you don&amp;rsquo;t have to &amp;ndash; WordPress kindly offers to handle a lot of that for you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;rsquo;t just output script tags!&lt;/strong&gt; Use the &lt;a title="Function Reference/wp enqueue script" href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script" target="_blank"&gt;wp_enqueue_script()&lt;/a&gt; function instead &amp;ndash; it has jQuery and jQuery UI scripts already registered, so you can simply use something like:&lt;br /&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="overflow:visible;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:black;direction:ltr;text-align:left;margin:0em;width:100%;background-color:#f4f4f4;border-style:none;padding:0px;"&gt;wp_enqueue_script(&lt;span style="color:#006080;"&gt;&amp;#39;jquery&amp;#39;&lt;/span&gt;);&lt;/pre&gt;
&lt;br /&gt;There are a ton of plugins or widgets that use jQuery&amp;nbsp; already and the great deal about this is that the function will not add the library again if it&amp;rsquo;s already been included - trust me you do not want to double it, I&amp;#39;ve seen that cause errors, plus you don&amp;rsquo;t really want to try and check for yourself either, so please use this instead. Also provided are a number of additional settings to provide source location for the script and even define dependencies. Preferably save the Ignite UI control initialization scripts with whatever options you need in a script file and also queue it in the same way.&lt;br /&gt;On a side note, there&amp;rsquo;s also &lt;a title="Function Reference/wp enqueue style" href="http://codex.wordpress.org/Function_Reference/wp_enqueue_style" target="_blank"&gt;wp enqueue style()&lt;/a&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be mindful where you include &lt;/strong&gt;- Note that usually, scripts are added to the head of the document, depending where you do the call, however WordPress will allow mid-page calls to the function that will output the scripts in the footer instead. There&amp;rsquo;s also option to include in the footer. Use the available action and filter hooks to properly initialize those. Also make use of &lt;a title="Function Reference/is admin" href="http://codex.wordpress.org/Function_Reference/is_admin" target="_blank"&gt;is_admin()&lt;/a&gt;to skip unnecessary script loads in admin panel, unless that is your goal.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;No conflict&lt;/span&gt; &amp;ndash; in the queue function reference there&amp;rsquo;s a chapter on the &lt;a title="jQuery noConflict wrappers" href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script#jQuery_noConflict_wrappers" target="_blank"&gt;jQuery noConflict more&lt;/a&gt; &amp;ndash; please be aware of that if you are using the default library. Also, in case you are wondering &amp;ndash; Ignite UI widgets are indeed properly wrapped in a self-executing function to guarantee safe usage of &amp;lsquo;$&amp;rsquo; in private scope. So basically you should only worry about your own code.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;What are your options?&lt;/h1&gt;
&lt;p&gt;So how can leverage the extensibility WordPress provides? Do think of the following as &lt;strong&gt;concepts&lt;/strong&gt;, I might end up doing some, but for now everything below is strictly an idea.&lt;/p&gt;
&lt;h4&gt;Shortcodes&lt;/h4&gt;
&lt;p&gt;I think those are by far the easiest to get going ( plug they are decently user-friendly) and WordPress gives you a &lt;a title="Shortcode API - WordPress" href="http://codex.wordpress.org/Shortcode_API" target="_blank"&gt;Shortcode API&lt;/a&gt;. As you can see there a short code will be kind of good for adding Ignite UI widgets where you don&amp;rsquo;t require a lot of settings from the user (you provide most of the defaults) or the control itself is fairly easy to set. That is because, while the API does provide a method to have attributes, asking someone to enter 20-ish or more of them is just wrong. An example for the igRating can look like this:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="overflow:visible;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:black;direction:ltr;text-align:left;margin:0em;width:100%;background-color:#f4f4f4;border-style:none;padding:0px;"&gt;[ig-rating value=&lt;span style="color:#006080;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And through the add_shortcode() you assign a function to this tittle that WordPress will call to replace the tag.&lt;/p&gt;
&lt;p&gt;On the flip side, short codes can be added anywhere (pages, posts) so you don&amp;rsquo;t have to worry about proper hooks for those. The also tricky part is that the attributes don&amp;rsquo;t do camel casing, therefore you won&amp;rsquo;t be able to match the Ignite UI widget settings exactly and directly pass the encoded the attributes as options for it.&lt;/p&gt;
&lt;p&gt;There are a lot of References at the bottom of every WordPress documantation page (which totally rocks!) so check those out, and here&amp;rsquo;s a bonus from me with an awesome video guide - &lt;a title="WordPress Shortcode API Crash Course" href="http://www.colegeissinger.com/blog/2012/11/12/wordpress-shortcode-api-crash-course/" target="_blank"&gt;WordPress Shortcode API Crash Course&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Widgets&lt;/h4&gt;
&lt;p&gt;These are also pretty popular, as their main goal is to add content and functionality to sidebars of &amp;quot;widgetized&amp;quot; themes, however since that just means sidebars are registered, so there are ways to add a &amp;lsquo;sidebar&amp;rsquo; to your posts and pages (by making a new template, and then using it for new ones). Widgets are not quite as simple to implement, but again there&amp;rsquo;s &lt;a title="Widgets API" href="http://codex.wordpress.org/Widgets_API" target="_blank"&gt;Widgets API&lt;/a&gt; to the rescue. You have a base class to extend and a few functions to override. The end goal of course is to have something like this in the admin panel:&lt;/p&gt;
&lt;p&gt;&lt;img title="An example of how a widget would look like added to a sidebar in the WordPress Appearence &amp;gt; Widgets panel." alt="An example of how a widget would look like added to a sidebar in the WordPress Appearence &amp;gt; Widgets panel." src="http://media.infragistics.com/community/jquery/media/wordpress/wordpress-widget-settings.png" /&gt;&lt;/p&gt;
&lt;p&gt;WordPress will be extremely kind to handle all the database work for you &amp;ndash; serializing back and forth, and calling your functions with the ready-to-use arrays. While that totally rocks, just how many settings fields do you think would be acceptable to stick in there? I&amp;rsquo;d say not too many or you are going to have a really poor user experience. So again much like the short code &amp;ndash; good for not-so complicated controls or when used with plenty of defaults you provide instead.&lt;/p&gt;
&lt;h4&gt;Plugins&lt;/h4&gt;
&lt;p&gt;And we reach to the most capable option to develop with &amp;ndash; as stated the plugins &amp;ldquo;can extend WordPress to do almost anything you can imagine&amp;rdquo;. &lt;a title="Plugins Docs @ WordPress Codex" href="http://codex.wordpress.org/Plugins" target="_blank"&gt;Plugins Docs&lt;/a&gt; can be your starting point, but there&amp;rsquo;s one that is even more interesting &amp;ndash; the option register your own settings page with plugin options via the &lt;a title="Settings API" href="http://codex.wordpress.org/Settings_API" target="_blank"&gt;Settings API&lt;/a&gt; and have it appear in the admin panel like this:&lt;/p&gt;
&lt;p&gt;&lt;img title="An example of how plugin settings page can look in the admin panel menu." alt="An example of how plugin settings page can look in the admin panel menu." src="http://media.infragistics.com/community/jquery/media/wordpress/wordpress-plugin-settings-page.png" /&gt;&lt;/p&gt;
&lt;p&gt;And as you&amp;rsquo;d expect WordPress will abstract away the database plumbing &amp;ndash; much like the Widgets options you can output a settings form and the names of inputs will become attributes of the options object you can later on request. The nicest part is that you get a whole page for your control settings ad you can really go wild here &amp;ndash; tabs and what not and as many settings as it makes sense.&lt;/p&gt;
&lt;p&gt;You will have to worry about hooks and what not, but I&amp;rsquo;m guessing it can be worth it.&lt;/p&gt;
&lt;h1&gt;What do you think?&lt;/h1&gt;
&lt;p&gt;So what do you think would be the most appropriate way to go with this? Do you thing that different solutions fit different controls better? Looking at the &lt;a title="Ignite UI -CONTROLS &amp;amp; SAMPLES" href="http://www.infragistics.com/products/jquery/samples" target="_blank"&gt;Ignite UI toolset&lt;/a&gt;, imagine a control being available in WordPress as whether a short code, widget or plugin &amp;ndash; as an user, which one are you more likely to use and how? What would you do as a developer?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d love to hear some thoughts, so leave a comment down below or &lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;. If you have already developed anything with Ignite UI and WordPress we&amp;rsquo;d love to see your work and if you haven&amp;rsquo;t but you are interested, go for the &lt;a title="WordPress Codex" href="http://codex.wordpress.org/Main_Page" target="_blank"&gt;WordPress documentation&lt;/a&gt; and grab yourself some UI fuel from:&lt;/p&gt;
&lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p name="gotcha"&gt;Also stay tuned to see where this ends up!&lt;/p&gt;
&lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=388025" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/WordPress/default.aspx">WordPress</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/shortcode/default.aspx">shortcode</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/widget/default.aspx">widget</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/plugin/default.aspx">plugin</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery+UI/default.aspx">jQuery UI</category></item><item><title>How to add updating to the Ignite UI Tree’s Drag &amp; Drop</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/01/03/how-to-add-updating-to-the-ignite-ui-tree-s-drag-amp-drop.aspx</link><pubDate>Thu, 03 Jan 2013 16:17:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:387217</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=387217</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2013/01/03/how-to-add-updating-to-the-ignite-ui-tree-s-drag-amp-drop.aspx#comments</comments><description>&lt;p&gt;&lt;img title="Ignite UI Tree&amp;rsquo;s Drag &amp;amp; Drop with Updating and Undo / Redo" style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="Ignite UI Tree&amp;rsquo;s Drag &amp;amp; Drop with Updating and Undo / Redo" align="left" src="http://media.infragistics.com/community/Release/12.2/jQuery/Tree-Drag-Drop/ignite-ui-tree-drag-drop-updating.png" /&gt;&lt;/p&gt; &lt;p&gt;As it turns out the Drag &amp;amp; Drop feature is like the gift that keeps on giving – new year and new enhancement to the functionality! May be because the &lt;a title="Ignite UI - HTML5 / jQuery tools  for Any Browser, Platform or Device" href="http://www.infragistics.com/products/jquery/" target="_blank"&gt;Ignite UI&lt;/a&gt; Tree is flexible enough or maybe because the functionality itself is based on simple Add and Remove API coupled with &lt;a title="jQuery UI provides a set of mouse-based interactions as building blocks for rich interfaces and complex widgets." href="http://api.jqueryui.com/category/interactions/" target="_blank"&gt;jQuery UI interactions&lt;/a&gt;, both of which are easy to understand, manipulate and extend :)&lt;/p&gt; &lt;p&gt;I’m thinking once you allow a user to move nodes around at one point you might come to the conclusion that some of those changes can be persisted. And as with most user actions - no surprise here! -&amp;nbsp;&amp;nbsp; mistakes do and will happen. That gets us to yet another point – why not add functionality for the user to undo and redo Drag &amp;amp; Drop operations? Indeed, why not!&lt;/p&gt; &lt;p&gt;And while it does require some custom code, as we are trying to make this interaction feature into an editing one, which is not how it is intended in its current implementation. On the other hand, the custom code is heavily reduced as we have a number of building blocks right there at our disposal. So far we’ve been looking into the usability side in the previous post with &lt;a title="Tips on Drag &amp;amp; Drop with the Ignite UI Tree" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/12/19/tips-on-drag-amp-drop-with-the-ignite-ui-tree.aspx" target="_blank"&gt;Tips on Drag &amp;amp; Drop with the Ignite UI Tree&lt;/a&gt; and some basics of the &lt;a title="Ignite UI Tree Drag &amp;amp; Drop" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/12/13/ignite-ui-tree-drag-and-drop.aspx" target="_blank"&gt;Drag &amp;amp; Drop with the Ignite UI Tree&lt;/a&gt; – make sure you check those out as we’ll be building on top of some of the knowledge gained and this time dive into the functionality. I’m not saying the enhanced selection and Load On Demand were not functional, they were, but if you look at it this way – they were tweaks based on the Draggable and Droppable nature implemented by the control. Now remember the other API part? That’s our target now..&lt;/p&gt; &lt;h1&gt;Leaving a trace behind&lt;/h1&gt; &lt;p&gt;I’ll try not to bore you too much with Add/Remove ‘getting-started’ stuff, as someone else was kind enough to do that – check out the &lt;a title="Adding and Removing Nodes (igTree) - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igTree_Adding_Removing_Nodes.html" target="_blank"&gt;Adding and Removing Nodes Help topic&lt;/a&gt; and there are some &lt;a title="jQuery Tree Add Remove Node API - Ignite UI Online samples" href="http://www.infragistics.com/products/jquery/sample/tree/add-remove-node-api" target="_blank"&gt;online samples for those API methods&lt;/a&gt; too! The thing that matters the most to us is that those operations create transactions in the underlying data source log and that Drag &amp;amp; Drop uses them. Essentially, we already have a history of the node moves, all you have to do is send it and provide server-side logic to handle the changes. The only thing to keep in mind is that a drop actually calls both methods – removing the original node and adding it to it’s new place. That in turn equals two transactions per drop, rather than one. &lt;/p&gt; &lt;p&gt;The tree also provides an update URL property to set to an endpoint to send transactions to (I’ll use the a similar Tree as the last two blogs for simplicity, again with Northwind’s Categories) :&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:da0a0f30-5dde-42f3-b0a3-6e0c557ab418" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;@model &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;IQueryable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;TreeDragDrop.Models.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Category&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;@&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Infragistics.Web.Mvc;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;@(&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;Html.Infragistics().Tree(Model).ID(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;tree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.DragAndDrop(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.DragAndDropSettings(d =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;d.DragAndDropMode(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DragAndDropMode&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Default);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;d.Revert(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;d.CustomDropValidation(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;customValidation&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;})&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.UpdateUrl(Url.Action(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;saveChanges&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.Bindings(binding =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;binding.PrimaryKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;.TextKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;CategoryName&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;.ValueKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;.ChildDataProperty(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Products&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;.Bindings(b1 =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;b1.TextKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ProductName&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;.ValueKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ProductID&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;.PrimaryKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ProductID&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;})&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.DataBind().Render()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Note line 11 where we set the action link. And, of course, this can be in client-only script as well:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7763f613-d7d3-4a0f-8863-174e55431d16" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#tree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;dataSource: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;/Home/getData&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDrop: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDropSettings : {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dragStartDelay : 100,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;revert : &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;customDropValidation : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;customValidation&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;updateUrl: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;/Home/saveChanges&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;bindings : {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;primaryKey : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;textKey : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;valueKey : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;childDataProperty : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Products&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;bindings : {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;textKey : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;valueKey : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;primaryKey : &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductID&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The controller action will have to deserialize the transactions and make sense of them. You have to do the same too I think, here a quick &lt;strong&gt;anatomy of a Tree transaction:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;type – either &amp;quot;addnode&amp;quot; or &amp;quot;removenode&amp;quot; based on the method used. Remember you get both per single drop!  &lt;li&gt;tid – generated ID of the transaction, useful for deleting a specific transaction.  &lt;li&gt;tdata – all the important goodies are here : the &lt;strong&gt;‘path’&lt;/strong&gt; of the node on which the method was performed and its &lt;strong&gt;entire ‘data’ record&lt;/strong&gt;. It also contains a ‘parentPath’ for add operations.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;As you can tell from the path we can assert from where the node was removed or to which parent was it added. &lt;strong&gt;Don’t forget to validate! &lt;/strong&gt;That is the reason of the custom function, the Drag &amp;amp; Drop would usually allow much more that it might make sense to your model, especially so if you slack on the binding definitions. The function in this example denies a node from being dropped on it’s current parent or one of the other nodes with the same depth as they are all products. Saving&amp;nbsp; the changes should generally be as simple as calling a method, however in this case, since the Add Node API method accepts multiple nodes (unlike the remove that is by path which is pretty specific), its path is an array instead of simple string. In a Drag &amp;amp; Drop scenario the add method will only be called with one value so you can go through the changes and normalize the path of the transaction (Drag &amp;amp; Drop would not add multiples) and unify them:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9155372d-f400-488a-a97b-537e2da0f248" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; save() {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; transLog = $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#tree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;option&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;dataSource&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).root().allTransactions();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//normalize transactions&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; i = 0; i &amp;lt; transLog.length; i++) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (transLog[i].tdata.path &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;instanceof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Array) transLog[i].tdata.path = transLog[i].tdata.path[0];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//send to server&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#tree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;option&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;dataSource&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).root().saveChanges();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Here’s how the controller action looks like:&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:39c364bc-a917-4191-bd4e-ef353b2fd80a" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ActionResult&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; saveChanges()&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; transactions = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;JsonConvert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.DeserializeObject&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;List&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;JObject&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;&amp;gt;(Request.Form[&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ig_transactions&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (transactions.Count % 2 != 0)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;HttpStatusCodeResult&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(System.Net.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Conflict);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; i = 0; i &amp;lt; transactions.Count; i+=2 )&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// a single drag&amp;amp;drop produces 2 transactions - one removeing from the original spot and one adding to the new one.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (((&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)transactions[i][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;] == &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;addnode&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &amp;amp;&amp;amp; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)transactions[i + 1][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;] == &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;removenode&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;) ||&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;((&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)transactions[i][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;] == &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;removenode&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &amp;amp;&amp;amp; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)transactions[i + 1][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;] == &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;addnode&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// node was moved moved&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; ((&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)transactions[i][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;tdata&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;path&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;] == (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)transactions[i + 1][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;tdata&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;path&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;])&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                 &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//merely a change in order, ignore (this will also skip category moves)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                 &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;continue&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Product&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; prod = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;JsonConvert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.DeserializeObject&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Product&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;(transactions[i][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;tdata&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;data&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;].ToString());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; product = db.Products.Where(x =&amp;gt; x.ProductID == prod.ProductID).Single();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; catId;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; ((&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)transactions[i][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;] == &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;addnode&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                 &lt;span style="background:#ffffff;color:#000000;"&gt;catId = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Parse(transactions[i][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;tdata&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;path&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;].ToString().Split(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).First());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                 &lt;span style="background:#ffffff;color:#000000;"&gt;catId = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Parse(transactions[i+1][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;tdata&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;][&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;path&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;].ToString().Split(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).First());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;product.CategoryID = catId;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;db.SaveChanges();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// tell the data source we are cool&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;Response.Write(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;{&amp;#92;&amp;quot;Success&amp;#92;&amp;quot;: true}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;JsonResult&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;As you can see I’ve pretty much made this for the Drag&amp;amp; Drop only (thus the validation if it divides by 2). If you use this in addition to programmatic calls to the Add/Remove API this will require more work ..or the result will be unpredictable. I’m also validating that each two are an add and remove combo and if the path is identical it means this is merely a change in order. Once that is done the actual business part is getting the Category ID (which is the parent part of the path when you have primary keys defined) and assign the one from the add operation to the product.&lt;/p&gt; &lt;p&gt;&lt;img title="Ignite UI Tree&amp;rsquo;s Drag &amp;amp; Drop with Updating" alt="Ignite UI Tree&amp;rsquo;s Drag &amp;amp; Drop with Updating" src="http://media.infragistics.com/community/Release/12.2/jQuery/Tree-Drag-Drop/tree-drag-drop-updating-log.png" /&gt;&lt;/p&gt; &lt;h1&gt;Go there! No, come back! Actually…&lt;/h1&gt; &lt;p&gt;Undo that and redo this. It’s those ‘phew’ moments that always make me happy when I realize I haven’t forever lost something. This part however can be either pretty simple ..or somewhat harder to implement than updating depending if you care for nodes being dragged and dropped around under their parent – as in if you care for order. The reason for this is that the paths for nodes generated by the control instead indexes normally, will actually consist of the primary keys if you have some. However, primary keys will only reflect the node’s place in hierarchy but not the order. Since the igTree I’ve been using so far has primary key I figured going the extra mile for a better experience is totally worth it.&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1170b4ba-f42f-42d2-94d1-c8907e9fefe3" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; redoStack = [], indexMap = {};&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:867b4beb-fd34-4b5c-afb6-c2edca68e405" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; undo() {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;igtree = igtree || $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#tree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;igTree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;treeDS = treeDS || $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#tree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;option&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;dataSource&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; allTransactions = treeDS.root().allTransactions();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (allTransactions.length &amp;gt; 0 &amp;amp;&amp;amp; (allTransactions.length % 2 === 0)) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; transactions = [allTransactions[allTransactions.length - 2], allTransactions[allTransactions.length - 1]];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (transactions[0].type == &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;removenode&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//always need to remove node before adding again!&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;transactions = transactions.reverse();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; deferredIndex = {};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; i = 0; i &amp;lt; 2; i++) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; transaction = transactions[i];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; parentPath = &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//for root node&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (transaction.tdata.path.indexOf(igtree.options.pathSeparator) !== -1) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;parentPath = transaction.tdata.path.split(igtree.options.pathSeparator).slice(0, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.length - 1).join(igtree.options.pathSeparator);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (transaction.type == &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;removenode&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; parent = parentPath == &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; ? igtree.element.children(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ul&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;) : igtree.nodeByPath(parentPath);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; index = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (indexMap[transaction.tdata.path] &amp;lt; parent.children().length) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;index = indexMap[transaction.tdata.path];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;igtree.addNode(transaction.tdata.data, parent, index);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//save index only after add&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; theNode = igtree.nodeByPath(transaction.tdata.path[0]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;deferredIndex[transaction.tdata.path[0]] = theNode.parent().children().index(theNode);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;igtree.removeAt(transaction.tdata.path[0]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;treeDS.root()._removeTransactionByTransactionId(transaction.tid, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;redoStack.push(allTransactions.slice(-1)[0]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// also remove the two newly created last transaction..&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;treeDS.root()._removeTransactionByTransactionId(allTransactions.slice(-1)[0].tid, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;$.extend(indexMap, deferredIndex);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:13014795-4f9b-4885-af71-1c7b9318d961" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; redo() {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;igtree = igtree || $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#tree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;igTree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;treeDS = treeDS || $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#tree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;option&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;dataSource&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (redoStack.length &amp;gt; 0 &amp;amp;&amp;amp; (redoStack.length % 2 === 0)) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//always need to remove node before adding again!&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//this keeps the order:&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; transactions = [redoStack.pop(), redoStack.pop()];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; deferredIndex = {};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; i = 0; i &amp;lt; 2; i++) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; parentPath = &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//for root node&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (transactions[i].tdata.path.indexOf(igtree.options.pathSeparator) !== -1) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;parentPath = transactions[i].tdata.path.split(igtree.options.pathSeparator).slice(0, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.length - 1).join(igtree.options.pathSeparator);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (transactions[i].type == &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;removenode&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; parent = parentPath == &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; ? igtree.element.children(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ul&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;) : igtree.nodeByPath(parentPath);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; index = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (indexMap[transactions[i].tdata.path] &amp;lt; parent.children().length) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;index = indexMap[transactions[i].tdata.path];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;igtree.addNode(transactions[i].tdata.data, parent, index);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//save index only after add&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; theNode = igtree.nodeByPath(transactions[i].tdata.path[0]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;deferredIndex[transactions[i].tdata.path[0]] = theNode.parent().children().index(theNode);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;igtree.removeAt(transactions[i].tdata.path[0]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;$.extend(indexMap, deferredIndex);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;We always want to remove first and then add, this is because the way path is created by primary keys as mentioned. If we add a node with the same path (change in order) and then call remove it will delete both the old and new ones. Also notice the two functions deal with somewhat different issues – the ‘undo’ must clean up additional transactions created by the API methods, while the redo takes advantage the latter in order to have transactions back to the log. Furthermore, processing the ‘addnode’ transaction first means more complications when saving an index, since we need the ‘indexMap’ to still contain the old node’s place when undoing the ‘removenode’, so this calls for saving that index to the side and updating it last. Also to gain initial index we hook up to the node dropping event to save it:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:abdc0560-51e3-4e41-8427-873f0f59778f" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$(document).delegate(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#tree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;igtreenodedropping&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (evt, ui) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;indexMap[ui.draggable.data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)] = ui.draggable.parent().children().index(ui.draggable);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Note that caring for node index in this implementation only has meaning on the client-side, but I think it’s nice to have. Check out below the (slightly large) capture of the Undo/Redo in action – note how the transaction log gets cleared when you undo and the ‘Tofu’ node is back under produce, but the redo stack now holds transactions for it. And as expected it shuffles the two moved nodes afterwards as well:&lt;/p&gt; &lt;p&gt;&lt;img title="Ignite UI Tree&amp;rsquo;s Drag &amp;amp; Drop Undo / Redo in action" alt="Ignite UI Tree&amp;rsquo;s Drag &amp;amp; Drop Undo / Redo in action" src="http://media.infragistics.com/community/Release/12.2/jQuery/Tree-Drag-Drop/tree-drag-drop-undo-redo.gif" /&gt;&lt;/p&gt; &lt;h1&gt;Resources&lt;/h1&gt; &lt;p&gt;As usual the &lt;a title="igTree Overview - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igTree_Overview.html" target="_blank"&gt;Ignite UI Tree Documentation&lt;/a&gt; and &lt;a title="Ignite UI jQuery API Reference" href="http://help.infragistics.com/jQuery/2012.2/ui.igtree" target="_blank"&gt;jQuery API Reference&lt;/a&gt; and &lt;a title="Ignite UI Tree samples" href="http://www.infragistics.com/products/jquery/tree" target="_blank"&gt;detailed samples&lt;/a&gt; are at your disposal to draw code and knowledge from! &lt;/p&gt; &lt;p&gt;For the batch updating and undo/redo sample grab the &lt;a title="ASP.NET MVC demo project for the Ignite UI Tree&amp;#39;s Drag and Drop feature with updating" href="http://media.infragistics.com/community/Release/12.2/jQuery/Tree-Drag-Drop/drag-drop-updating.zip"&gt;ASP.NET MVC demo project&lt;/a&gt; ( with everything from here included in with both MVC helper and script-only demos). &lt;strong&gt;Make sure to check that one out!&lt;/strong&gt;&amp;nbsp; You would need at least a trial version of Ignite UI so hit the banner below if you are still lacking one.&lt;/p&gt; &lt;p&gt;Also you can go for fiddling right now on JSFiddle: &lt;a title="Ignite Ui Tree: Drag &amp;amp; Drop + Updating and Undo/Redo demo on JSFiddle" href="http://jsfiddle.net/damyanpetev/29k6w/" target="_blank"&gt;Ignite UI Tree Drag &amp;amp; Drop + Updating demo&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;If this has caught your interest and want to know what other cool tricks you can do with this feature – once more the &lt;a title="Tips on Drag &amp;amp; Drop with the Ignite UI Tree" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/12/19/tips-on-drag-amp-drop-with-the-ignite-ui-tree.aspx" target="_blank"&gt;Tips on Drag &amp;amp; Drop with the Ignite UI Tree&lt;/a&gt; await!&lt;/p&gt; &lt;h1&gt;Summary&lt;/h1&gt; &lt;p&gt;Yet another spin of the in-depth look at the Ignite UI Tree’s Drag and Drop feature. With some insight on the API methods used we were able to use this interaction feature as editing one, by implementing batch updating with the help of the underlying data source. Building on top of that you can actually manipulate the log and use the very same API to add Undo / Redo functionality. And since we change the actual log, transactions going to the server for saving will also be in tune! Again it’s all thanks to the building blocks of the feature and their extensibility!&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=387217" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Validation/default.aspx">Validation</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Editing/default.aspx">Editing</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igTree/default.aspx">igTree</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igDataSource/default.aspx">igDataSource</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Undo/default.aspx">Undo</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Undo+_2F00_+Redo+Framework/default.aspx">Undo / Redo Framework</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Redo/default.aspx">Redo</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Mouse+Interaction/default.aspx">Mouse Interaction</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/NetAdvantage+12.2/default.aspx">NetAdvantage 12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Updating/default.aspx">Updating</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/droppable/default.aspx">droppable</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drag_2600_drop/default.aspx">drag&amp;drop</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drop/default.aspx">drop</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drag/default.aspx">drag</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/draggable/default.aspx">draggable</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drag_2600_amp_3B00_drop/default.aspx">drag&amp;amp;drop</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/custom+drop+validation/default.aspx">custom drop validation</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Node/default.aspx">Node</category></item><item><title>Tips on Drag &amp; Drop with the Ignite UI Tree</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/12/19/tips-on-drag-amp-drop-with-the-ignite-ui-tree.aspx</link><pubDate>Wed, 19 Dec 2012 17:23:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:386139</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=386139</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/12/19/tips-on-drag-amp-drop-with-the-ignite-ui-tree.aspx#comments</comments><description>&lt;p&gt;&lt;img title="Tips on Drag &amp;amp; Drop with the Ignite UI Tree" style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="Tips on Drag &amp;amp; Drop with the Ignite UI Tree" align="left" src="http://media.infragistics.com/community/Release/12.2/jQuery/Tree-Drag-Drop/ignite-ui-tips-tree-drag-drop.png" /&gt;As promised in the previous blog on &lt;a title="Ignite UI Tree Drag &amp;amp; Drop" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/12/13/ignite-ui-tree-drag-and-drop.aspx" target="_blank"&gt;Drag &amp;amp; Drop with the Ignite UI Tree&lt;/a&gt; – some tips and tricks coming right up. If you haven’t already looked into the control’s features, now’s your chance – overview with main ones listed in the &lt;a title="igTree Overview - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igTree_Overview.html" target="_blank"&gt;Documentation&lt;/a&gt; and &lt;a title="Ignite UI online samples - jQuery Tree" href="http://www.infragistics.com/products/jquery/tree" target="_blank"&gt;live in the Samples&lt;/a&gt;. Looking at those, while each of them is rather nice, how do you think some of them would work alongside each other…and is something missing? The first one is always a potential trouble maker and the latter.. well extending functionality is fun, but as you know there are always new stuff coming with each release – might be just the thing you are missing. We do take feedback on everything through socials (links always below), there’s an active community at the &lt;a title="Forums &amp;raquo; IgniteUI - jQuery Controls" href="http://www.infragistics.com/community/forums/default.aspx?GroupID=80" target="_blank"&gt;Forums&lt;/a&gt; and you can always &lt;a title="Feature Request" href="https://www.infragistics.com/my-account/feature-request/" target="_blank"&gt;submit a feature request( must be logged in)&lt;/a&gt;. Enough with the shameless plugs, on to the discussion!&lt;/p&gt; &lt;h1&gt;Play nice?&lt;/h1&gt; &lt;p&gt;As you’ve already seen in my previous post there are some quirks for example when you have nodes moving around with Drag and Drop and &lt;strong&gt;checkboxes&lt;/strong&gt; at the same time you will loose the checkbox state and when a tri-state parent is fully checked a dropped node will respect the valid-for-all rule. &lt;/p&gt; &lt;p&gt;It’s merely the fact that while drag and drop is a nice interaction from a user standpoint, underneath it involves removing and adding nodes. While that is simple in itself, it does present a number of situations where it can be really tricky to preserve whatever state the node may have applied by multiple other features. There’s a similar scenario with &lt;strong&gt;&lt;a title="Tree Selection - Ignite UI Online Samples" href="http://www.infragistics.com/products/jquery/sample/tree/selection"&gt;selection&lt;/a&gt;&lt;/strong&gt; when you move the selected node around – you still keep the selection data, but the visual is gone as the node is re-created.&lt;/p&gt; &lt;p&gt;Then you have another &lt;a title="Tree Load on Demand - Ignite UI Online Samples" href="http://www.infragistics.com/products/jquery/sample/tree/load-on-demand"&gt;major feature of the Ignite UI Tree – the Load On Demand&lt;/a&gt;. This is an extra tricky one actually. While the moving of nodes happens entirely on the client and there’s little that can come in it’s way.. it’s really hard to add a node to a parent one that hasn’t yet populated its children. Yes, you can easily supply the UI, but the underlying data source would still contain no array of child items for you to add to. Of course, one the node populates it’s all good and cool, but as you get told everywhere users are notoriously impatient and in case they do not wait for the node to load it can get quite messy.&lt;/p&gt; &lt;p&gt;Do keep in mind thought, the Ignite UI toolset keeps evolving with not only new features, but general improvements as well and it’s certain Drag&amp;amp;Drop will become more in tune with the rest. For that reason, what I do provide for now would possible become obsolete, but it’s more of a testimony&amp;nbsp; to the fact that you can &lt;strong&gt;enhance and extend&lt;/strong&gt; Ignite UI controls with very &lt;strong&gt;little effort&lt;/strong&gt;!&lt;/p&gt; &lt;h1&gt;Play nice.. or I’ll make you!&lt;/h1&gt; &lt;p&gt;So let’s get on with the modifications. The Tree’s events will be our heroes of the day as many if not all major changes are represented with them. I have one very easy fix for maintaining proper selection UI with truly minor effort – as I said it’s all really a matter of picking the right time to hook your code. I figured it’s mildly pointless to update a second selection variable on each change, so instead I will check when a drag is starting if the node in question is selected. Then when the said node is dropped I would simply use the API method provided for selection. This will in essence go and set in the new path for the node:&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7b016fcb-b36f-416d-a2b0-89982c66aa25" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;white-space:nowrap;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; selectionDirty = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f6f84add-5272-4ed4-8c46-642899b39d93" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#tree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDrop: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDropSettings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDropMode: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dragStartDelay: 100,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;revert: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//simple icon-only tooltip &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;invalidMoveToMarkup: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;&amp;lt;div&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;containment: $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#tree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;dragStart: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (evt, ui) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// check if element is the one selected&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;selectionDirty = $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#tree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;isSelected&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, ui.element);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;nodeDropped: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(evt, ui) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (selectionDirty) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//if it was selected, re-select when dropped in new place&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; newNode = $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#tree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;nodeByPath&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, ui.path + &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; + ui.draggable.attr(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;data-path&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).split(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).pop());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#tree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;select&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, newNode);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;selectionDirty = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;dataSource: northwindCategories,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;bindings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;textKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;primaryKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;valueKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;childDataProperty: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Products&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;bindings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;textKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;valueKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;primaryKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductID&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;The difference from what you have seen before as code for the tree are the dragStart and nodeDropped events. Because those come in line of the &lt;a title="jQuery UI Interactions" href="http://api.jqueryui.com/category/interactions/"&gt;jQuery UI Draggable &amp;amp; Droppable&lt;/a&gt; events and they can generally handle interaction between two trees, you won’t see the familiar ‘ui.owner‘ to access the tree as it’s kind of hard to tell which tree should be an owner really :) However, since I’m adding handlers separately that’s okay – I know which tree to call. Also, the tree is helpful enough to give nodes by paths – the latter you can get by combining the event provided path (the parent one) and the ID of the dropped element. The way this handles it right now should be suitable for deeper hierarchy that two as well.&lt;/p&gt; &lt;p&gt;Note: Remember you have the same event arguments as in jQuery UI in addition to the Tree adding some stuff (the element for example), but in the case of the drop the element is the actual target and the draggable from the original arguments is the node being dropped. The results:&lt;/p&gt; &lt;p&gt;&lt;img title="An (very low quality) animation to show the comparison between the default selection handling and the enhanced one." alt="An (very low quality) animation to show the comparison between the default selection handling and the enhanced one." src="http://media.infragistics.com/community/Release/12.2/jQuery/Tree-Drag-Drop/ignite-ui-tree-drag-drop-selection.gif" /&gt;&lt;/p&gt; &lt;p&gt;You can take a very similar approach with the checkboxes in bi-state mode Trees to complement that feature, however, the tri-state limitation I feel might be the right design (respecting the parent global state). Up to you really, the option is there.&lt;/p&gt; &lt;h3&gt;Load on Demand&lt;/h3&gt; &lt;p&gt;As I mentioned it’s nothing that complicated stopping this from being flawless, except the very nature of loading data on demand..it’s not there yet! And if the user doesn’t want to wait things go bad. One very simple way is to decrease the expand delay (time till nodes automatically expand when dragged over) to mere nothing. This might make it work just fine if the service you use is fast enough to get ahead of the unsuspecting user. However, go too low and you risk the user triggering a whole bunch of requests on the drag path and actually making the application slower rather than faster. The solution lies in not letting the user drop on non-populated node. However, that would mean that at some point the node would expand and drop would be possible, but the helper will still be showing invalid location. It’s not such a nice experience to make the user shake the node around to force a drag and re-evaluation of the drop target. If you want just the perfect experience, you can have it with one trick – move the mouse for the user! Yup, basically listen for when the node is populated, check if the user is on top of it, and trigger a mouse move so the validation will be re-done:&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8f015cc3-6916-4e15-8f1d-59549962b0dc" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; stateHelper = { dropTarget: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, populatingNode: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, draggedNode: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; };&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e9a0182a-2ed0-48be-ae0d-b749d54a6136" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#tree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDrop: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;parentNodeImageClass: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;parent&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDropSettings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDropMode: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;move&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;customDropValidation: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (element) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// Validates the drop target:&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// Nodes will properly cause targets to expand (and therefore load)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// But we must not allow actual drop before the data is loaded &lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// because we have nothing to add this node to.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;stateHelper.dropTarget = $(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;stateHelper.draggedNode = $(element);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; childNodes = stateHelper.dropTarget.closest(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;li[data-role=node]&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).children(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ul&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (childNodes.length &amp;gt; 0 &amp;amp;&amp;amp; JSON.parse(childNodes.attr(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;data-populated&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)) === &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                 &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;expandDelay: 500&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;dragStop: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(evt, ui) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;stateHelper.dropTarget = undefined;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;nodePopulated: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(evt, ui) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (stateHelper.dropTarget &amp;amp;&amp;amp; $.contains(ui.element, stateHelper.dropTarget)) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;stateHelper.populatingNode = ui.element;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;rendered: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(evt, ui) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (stateHelper.populatingNode) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// forse re-handling of the drag in case the user manages to &lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// shomehow keep his mouse steady when the node expands&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// this will evaluate the target again&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;stateHelper.populatingNode.children(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).trigger({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                 &lt;span style="background:#ffffff;color:#000000;"&gt;type: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;mousemove&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                 &lt;span style="background:#ffffff;color:#000000;"&gt;pageX: stateHelper.draggedNode.data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;draggable&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).position.left,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                 &lt;span style="background:#ffffff;color:#000000;"&gt;pageY: stateHelper.draggedNode.data(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;draggable&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).position.top&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;stateHelper.populatingNode = undefined;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;dataSourceType: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;remoteUrl&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;dataSource: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;http://services.odata.org/OData/OData.svc/Categories?$format=json&amp;amp;$callback=?&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;responseDataKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;d&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;loadOnDemand: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;bindings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;textKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Name&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;valueKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;primaryKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;childDataProperty: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Products&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;bindings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;textKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Name&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;valueKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;primaryKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000;"&gt;childDataProperty: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Supplier&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;As you can see the Tree is bound to the oData Northwind service making calls only when needed, we listen for populated nodes and save them in the ‘stateHelper’ to later trigger the mouse move on them when the UI has been rendered.&lt;/p&gt; &lt;p&gt;&lt;img title="A demonstation of how the experience can be improved with load on demand and Drag&amp;amp;Drop" alt="A demonstation of how the experience can be improved with load on demand and Drag&amp;amp;Drop" src="http://media.infragistics.com/community/Release/12.2/jQuery/Tree-Drag-Drop/drag-drop-load-on-demand.gif" /&gt;&lt;/p&gt; &lt;h3&gt;A word on the custom validation function&lt;/h3&gt; &lt;p&gt;The thing about this functions is that it will be overridden by the internal tree validation, which makes it the last last chance for you as a developer to return false and prevent a node drop on that target. What this also should tell you is that the internal validation will try to validate actual Ignite UI Tree as a target, so your function is not to enable something the feature won’t allow – no call will be made to it when the target is foreign. This begs the question, can you still use other targets? Yes, the drop events still fire on the drop targets! Take the &lt;a title="Simple File Manager - Ignite UI samples" href="http://www.infragistics.com/products/jquery/sample/tree/simple-file-manager" target="_blank"&gt;Simple File Manager&lt;/a&gt; as an example – the trick is in the usage of the droppable events instead!&lt;/p&gt; &lt;p&gt; And as you have already seen form above the context of the function is the droppable element and the parameter is the draggable.&lt;/p&gt; &lt;p&gt;Last but not least, if you are wondering how this JavaScript function is being used with the ASP.NET MVC wrappers, the MVC side property accepts a string with the function’s name. What that means is that such functions need to be discoverable on the global scope (on window really), so be careful where you define it:&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8dcd4c16-8da9-423a-908c-0e534529eb9e" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//rest is omitted&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}).DragAndDropSettings(d =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;d.ExpandDelay(500);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;d.CustomDropValidation(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;customValidation&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;})&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;And then:&lt;/p&gt; &lt;h1&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f6d2fdd6-77fd-4f56-80c7-af2dddb81183" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;script&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; customValidation(element) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// omitted&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;script&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/h1&gt; &lt;h1&gt;Resources&lt;/h1&gt; &lt;p&gt;First let me again remind of the &lt;a title="igTree Overview - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igTree_Overview.html" target="_blank"&gt;elaborate Ignite UI Tree Documentation&lt;/a&gt; and &lt;a title="Ignite UI jQuery API Reference" href="http://help.infragistics.com/jQuery/2012.2/ui.igtree" target="_blank"&gt;jQuery API Reference&lt;/a&gt;. Then don’t forget the &lt;strong&gt;&lt;a title="Ignite UI Tree samples" href="http://www.infragistics.com/products/jquery/tree" target="_blank"&gt;awesome samples&lt;/a&gt;! &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;This time I’ll add in the mix a &lt;a title="ASP.NET MVC demo project for the Ignite UI Tree&amp;#39;s Drag and Drop feature" href="http://media.infragistics.com/community/Release/12.2/jQuery/Tree-Drag-Drop/tree-drag-drop-tips.zip" target="_blank"&gt;solid ASP.NET MVC demo project&lt;/a&gt; ( with everything from here included in with both MVC helper and script-only demos, plus some basic stuff from the previous post). &lt;strong&gt;Make sure to check that one out, the animations above don’t do it justice!&lt;/strong&gt;&amp;nbsp; You would need at least a trial version of Ignite UI so hit the banner below if you are still lacking one.&lt;/p&gt; &lt;p&gt;Also you can go for fiddling with two demos on JSFiddle:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Ignite Ui Tree: Basic settings and events + enhanced selection demo on JSFiddle" href="http://jsfiddle.net/damyanpetev/TZXP2/" target="_blank"&gt;Basic settings and events + enhanced selection demo&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title="Ignite UI Tree: Modified Drag&amp;amp;Drop + Load On Demand behavior with Custom drop validation function on JSFiddle." href="http://jsfiddle.net/damyanpetev/uLxax/" target="_blank"&gt;Modified Drag&amp;amp;Drop + Load On Demand behavior with Custom drop validation function.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Stay tuned,&lt;/strong&gt; for there is still more awesome tricks I have for you – next time we’ll do some updating support!&lt;/p&gt; &lt;h1&gt;Summary&lt;/h1&gt; &lt;p&gt;This was the second part of the in-depth look at the Ignite UI Tree’s Drag and Drop feature. We covered some of the challenges such functionality presents and how you can overcome them. We improved the selection handling of moved nodes, we made the experience a true joy with Load on Demand. We also gave a little attention to the custom validation function – what is it for, what to expect and what you can do with it. At the end of this, I would like to remind you that this has been a proof of the concept that the controls are flexible enough to let you mold them to your needs with little code and great impact!&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;! &lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=386139" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CDN/default.aspx">CDN</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Validation/default.aspx">Validation</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Load/default.aspx">Load</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Load+On+Demand/default.aspx">Load On Demand</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/OData/default.aspx">OData</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Demand/default.aspx">Demand</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igTree/default.aspx">igTree</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Templating/default.aspx">Templating</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Templates/default.aspx">Templates</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Copy/default.aspx">Copy</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Mouse+Interaction/default.aspx">Mouse Interaction</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Checkbox/default.aspx">Checkbox</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/NetAdvantage+12.2/default.aspx">NetAdvantage 12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Events/default.aspx">Events</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Move/default.aspx">Move</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drag_2600_drop/default.aspx">drag&amp;drop</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drag/default.aspx">drag</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/draggable/default.aspx">draggable</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drag_2600_amp_3B00_drop/default.aspx">drag&amp;amp;drop</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/custom+drop+validation/default.aspx">custom drop validation</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Node/default.aspx">Node</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/selection/default.aspx">selection</category></item><item><title>Ignite UI Tree Drag &amp; Drop</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/12/13/ignite-ui-tree-drag-and-drop.aspx</link><pubDate>Thu, 13 Dec 2012 05:51:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:385311</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=385311</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/12/13/ignite-ui-tree-drag-and-drop.aspx#comments</comments><description>&lt;p&gt;&lt;img title="Ignite UI Tree control with Drag and Drop funtionality based on jQuery UI interactions" style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="Ignite UI Tree control with Drag and Drop funtionality based on jQuery UI interactions" align="left" src="http://media.infragistics.com/community/Release/12.2/jQuery/Tree-Drag-Drop/jquery-tree-drag-drop.png" /&gt;With the latest release the Ignite UI Tree has received the nifty feature of drag and drop. It’s a fairly common concept and it allows for a natural (at least I perceive it to be for a long time) interaction with the control’s items. From a user’s stand point it’s all but awesome news&amp;nbsp; - this would allow for nodes to be moved between one tree’s structure and in our case there’s a bonus of being able to do that between two trees even. The feature provides rich interactions with a familiar visual touch out-of-the box.&lt;/p&gt; &lt;p&gt;From a developer’s view things are also quite pleasing – the jQuery Tree Drag and Drop already handles a decent range of common case scenarios, so you can almost set one property and umm.. profit! Then again, when you do need to set things up it offers a possibly familiar API as you’ll see and has pretty much everything conveniently exposed. And while the widget itself will perform a solid range of drop validations it offers you the option to define your additional custom function.&lt;/p&gt; &lt;h1&gt;Quick Setup&lt;/h1&gt; &lt;p&gt;As advertised, this can be achieved via a single property and you can then kick back and enjoy the result with the defaults. Drag&amp;amp;Drop is build directly into the tree, so no additional files required and main star is the ‘dragAndDrop’ property:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:bd32ba31-b052-4597-b1e6-1e61806586f4" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#tree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDrop: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;dataSource: northwindCategories,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;bindings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;textKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;primaryKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;valueKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;childDataProperty: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Products&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;bindings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;textKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;valueKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;primaryKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductID&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;This setup will pretty much produce a fully functional tree with the bare minimum of setup and the equivalent ASP.NET MVC helper definition is about as simple:&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:48adf76d-6892-4f6c-ad79-ce55a464792c" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;@(&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;Html.Infragistics().Tree(Model).ID(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;tree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.DragAndDrop(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.Bindings(binding =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;binding.PrimaryKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;.TextKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;CategoryName&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;.ValueKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;.ChildDataProperty(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Products&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;.Bindings(b1 =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;b1.TextKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ProductName&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;.ValueKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ProductID&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;.PrimaryKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ProductID&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}).DataBind().Render()&lt;/span&gt;&lt;span style="background:#ffff00;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;The resulting tree is the one you see in the heading image. Yes, the helpful indicator to the side too! Make sure you stop by the documentation and check out the &lt;a title="Enabling Drag-and-Drop - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igTree_Drag-and-Drop_Enabling.html" target="_blank"&gt;Enabling Drag-and-Drop&lt;/a&gt; section where you can discover that there’s an additional ‘allowDrop’ setting that allows for nodes to be dropped in you igTree from another igTree!&lt;/p&gt; &lt;h1&gt;Customizations&lt;/h1&gt; &lt;p&gt;Now we come to the part that may be familiar to some of you – the Ignite UI Tree also accepts a ‘Drag and Drop Settings’ object with various settings for the behavior of the feature. Now a small deviation&amp;nbsp; - the reason why the settings might be not so hard to understand is because the control internally implements &lt;a title="jQuery UI provides a set of mouse-based interactions as building blocks for rich interfaces and complex widgets." href="http://api.jqueryui.com/category/interactions/" target="_blank"&gt;interactions from jQuery UI&lt;/a&gt; – the &lt;a title="Draggable Widget - Allow elements to be moved using the mouse." href="http://api.jqueryui.com/draggable/" target="_blank"&gt;Draggabe&lt;/a&gt; (“Allow elements to be moved using the mouse.”) and &lt;a title="Droppable Widget - Create targets for draggable elements." href="http://api.jqueryui.com/droppable/" target="_blank"&gt;Droppable&lt;/a&gt; (“Create targets for draggable elements.”) widgets. Taking a look at the descriptions for those you can tell why – just like the concepts of Drag and drop go together, so do those widgets and the tree&amp;nbsp; initializes both itself. Oh and that settings object? Yeah, some settings go almost directly to the &lt;a title="Draggable Widget - Allow elements to be moved using the mouse." href="http://api.jqueryui.com/draggable/" target="_blank"&gt;Draggabe Widget&lt;/a&gt;’s options: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;helper – Defines what element (helper) should be used to for dragging display. More on that in the future, lets say you can use the original node or a clone too, just don’t deep clone :) Plus the helper I think will almost always end up being the better UX.&lt;/li&gt; &lt;li&gt;dragOpacity( equivalent to ‘opacity’) – Opacity for the helper while being dragged.&lt;/li&gt; &lt;li&gt;zIndex – This directly corresponds to the &lt;a title="CSS z-index Property" href="http://www.w3schools.com/cssref/pr_pos_z-index.asp" target="_blank"&gt;CSS z-index Property&lt;/a&gt; that will be applied to the dragged element. It specifies the stacking order of elements – making the ones with higher index come on top of those with lower. The default 10 is usually enough, but if for some reason you are having issues with your dragged helper being overlapped by something this is the property to increase.&lt;/li&gt; &lt;li&gt;revert – this one is mildly different as for the Tree it’s a Boolean while the &lt;a href="http://api.jqueryui.com/draggable/#option-revert" target="_blank"&gt;jQuery UI Draggable&lt;/a&gt; takes both boolean and two string options. The reasoning behind this is that in the context of drag and drop within the jQuery tree not all of those make sense – like reverting on ‘valid’ drops or always reverting. Plus it makes the option much simpler – false stays the same, while true defaults to ‘invalid’ instead.&lt;/li&gt; &lt;li&gt;revertDuration - The duration of the revert animation, in milliseconds. Ignored if the &lt;code&gt;revert&lt;/code&gt; option is &lt;code&gt;false&lt;/code&gt;.&lt;/li&gt; &lt;li&gt;dragStartDelay ( equivalent to ‘delay’) - Time in milliseconds after ‘mousedown’ until dragging should start. This option can be used to prevent unwanted drags when clicking on an element. This one is big on user experience I think – trust me when I say you don’t want this too low with complex control with elements that perform additional functions. Based on that the minimum you want is &lt;strong&gt;at least 100 milliseconds &lt;/strong&gt;or you risk drags starting on simple selection and node expansion. It’s pointless overhead and even potentially successful but unintended buy the user moving of nodes.&lt;/li&gt; &lt;li&gt;containment - Constrains dragging to within the bounds of the specified element or region. This one is quite versatile – taking a range of values like a selector, the actual element to contain within, string enumeration or even an array of values defining a bounding box. The default false setting restricts the drag to the parent element of the tree.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Possibly half of the others are left to the default and some the Tree widget reserves for itself. There are of course ways to ‘hack’ into those, but let’s not do that.. at least not just yet. But hey, here’s one that barely counts as one – the cursorAt that defines where the helper markup should appear relative to the mouse cursor regardless of what the name may imply is also defined, however it’s value is set form a constant within the tree and that can be replaced. Keep in mind there’s probably a good reason for that not be exposed, so use with caution – there’s at least one danger&amp;nbsp; - if you go too far and bring the helper under the mouse (which you might decide to do) I guess the validation of the drop target fails and all you’ll be seeing is invalid visual – you need the mouse at least 1px clear from the helper sadly. But hey, you can at least reposition the helper closer and to the bottom right corner (Explorer style) for example:&lt;/p&gt; &lt;p&gt;&lt;img title="Ignite UI Tree control with Drag and Drop helper position and markup manipulation" alt="Ignite UI Tree control with Drag and Drop helper position and markup manipulation" src="http://media.infragistics.com/community/Release/12.2/jQuery/Tree-Drag-Drop/jquery-tree-drag-drop-customizations.png" /&gt;&lt;/p&gt; &lt;p&gt;I’ll admit I didn’t do a particularly good job with that, but hey it’s good to know you can tweak that. If you have been playing with the feature so far you’ll also notice the invalid message is different (it usually&amp;nbsp; shows the name of the node you are dragging) – that’s because you can provide markup for any of the multiple helper states. You can look those up in the &lt;a title="Drag-and-Drop Property API Reference (igTree) - Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igTree_Drag-and-Drop_Property_API_Reference.html" target="_blank"&gt;Drag-and-Drop Property API Reference&lt;/a&gt; where you’ll see the defaults too. Oh right, the code:&lt;/p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:76b87266-757c-4209-ae5b-6db31e274361" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$.ig.loader(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;igTree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; () {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;$.extend($.ui.igTree.prototype, {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;_const: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;dragCursorAt: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;top: -20,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;left: 0&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;#tree&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).igTree({&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDrop: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDropSettings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;dragAndDropMode: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;dragStartDelay: 100,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;revert: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;invalidMoveToMarkup: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;strong&amp;gt; Invalid location. &amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;containment: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#tree&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;dataSource: northwindCategories,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;bindings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;textKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;primaryKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;valueKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;CategoryID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;childDataProperty: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;Products&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;bindings: {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;textKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductName&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;valueKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductID&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;primaryKey: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;#39;ProductID&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Regarding the various markups – you’ll notice they all contain an &lt;strong&gt;empty span&lt;/strong&gt;. What’s up with that? Well, the span is the one being targeted by the widget to apply classes for the &lt;strong&gt;icons&lt;/strong&gt;. If you want the icon it’s good to include a span in your markup. You can remove it to remove the icon, or leave just the span (with unbreakable space in the paragraph for height) to have a helper with icon only.&lt;/p&gt; &lt;p&gt;Notable mentions from the snippet above also include the mode of the feature ( move and copy available, the default option combines both with a ‘Ctrl’ as modifier. The line at 17 (containment: &amp;quot;#tree&amp;quot;) prevents the dragging to go on beyond the boundaries of the tree itself (as in my case with a very simple layout the tree’s parent is the body and that doesn’t always produce good results).&lt;/p&gt; &lt;h1&gt;Enhanced Events&lt;/h1&gt; &lt;p&gt;The Tree will fire a number of events during the drag and drop interaction. The familiar equivalents of jQuery UI Draggable (start –&amp;gt; drag –&amp;gt; stop) are as follows: ‘dragStart’ –&amp;gt; ‘drag’ –&amp;gt; ‘dragStop’. A slight name change really to better suit the context of a more complex widget. Speaking of which, the control as you can imagine internally handles the original Draggable events to do its work and conveniently fires event for you to handle in the meantime, but that’s not the whole story. While, yes, the Tree will pass you the original Event object, the arguments you get alongside will be extended with a bunch of useful properties containing the path of the node in question, the actual element itself, its data record and appropriate binding. Again you can refer to the API reference or &lt;a title="Drag-and-Drop Event API Reference (igTree) - Ignite UI&amp;trade; Online Help ::  2012.2" target="_blank"&gt;Documentation&lt;/a&gt; to get additional info on those. All are cancelable.&lt;/p&gt; &lt;p&gt;Since the Ignite UI Tree also must be the target of the drop, it also has an initialized Droppable widget. However, the events for that are different – the tree will fire events as the node is being dropped and after it has been dropped. As you can imagine the first one can be canceled and is a good place for last checks to see if the node dropping is in an acceptable position. These come from the single ‘drop’ event of the jQuery UI widget, so what &lt;a title="Droppable Widget API - jQuery UI" href="http://api.jqueryui.com/droppable/" target="_blank"&gt;happens with the rest&lt;/a&gt;? Well, they didn’t make much sense for the Tree, but if you really need to handle some of them for any reason don’t despair – unlike the draggable deeper inside the structure of the control, the Droppable is initialized of the very same element as the igTree and you can handle it’s events just as described in it’s API, for example:&lt;/p&gt; &lt;p&gt; &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7d1f901a-9cf9-4bc7-9ee1-ecd59daf5592" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;$(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;#tree&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).on(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;dropactivate&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (event, ui) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;alert(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;We have take off!&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;Also you can handle the ‘drop’ as well, but keep in mind you won’t get the extra info the Tree provides in the delegated events and when you do handle drop your handler is likely to be triggered before the Tree’s so you can’t really verify the job is being done there. Just, whatever you do, don’t handle those with alert like I did! :)&lt;/p&gt; &lt;h1&gt;Limitations and not so much&lt;/h1&gt; &lt;p&gt;I mentioned the control will do a plentiful amount of validation (even without a &lt;a title="Configuring Custom Drop Validation (igTree)" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igTree_Drag-and-Drop_Configuring_Custom_Drop_Validation.html" target="_blank"&gt;custom function&lt;/a&gt;) in order to maintain reasonable behavior (like the droppable not accepting anything you throw at it an such). The tree will also validate the drop target is an acceptable part of an igTree widget’s UI. in addition to that, as I mentioned before, there is also a binding validation. What this means is that the node being dropped on &lt;strong&gt;must have bindings compatible with the dragged node&lt;/strong&gt;. Take the case above – we have a top tier of Categories whose children are products. Based on that the control will not allow you to drop one Category into another (as the accepted child is defined as Product already). Same goes with trying to drop product in the root (where category is expected). If your models allows identical bindings on all levels then you can ignore that.&lt;/p&gt; &lt;p&gt;This leads to some issues with performing Drag &amp;amp; Drop between two trees as well – you can’t simple define two completely unrelated trees and expect to be able to move nodes between them. Again similar bindings should exist in the trees in order for the move or copy to be accepted. I’m not sure if it’s a limitation if it’s reasonable, but hey you can always work some magic to get around it.&lt;/p&gt; &lt;h1&gt;Resources&lt;/h1&gt; &lt;p&gt;First let me again remind of the elaborate Ignite UI Tree Documentation and jQuery API Reference. Then don’t forget the &lt;strong&gt;awesome samples:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;h4&gt;&lt;a title="Single Tree Drag and Drop - Ignite UI Samples" href="http://www.infragistics.com/products/jquery/sample/tree/single-tree" target="_blank"&gt;Drag and Drop within a single Tree&lt;/a&gt; – you can observe here two interesting behaviors of the control – when checkboxes are enables their state will not be preserved when moving, however when dropped on a parent whose tri-state box is fully checked (meaning every child also is) then the newly added node will follow that rule and also render with ticked checkbox. Also dragging a node over unexpanded one will (after a short timeout) expand the drop target.&lt;/h4&gt;&lt;/li&gt; &lt;li&gt;&lt;a title="Multi Trees Drag and Drop - Ignite UI Samples" href="http://www.infragistics.com/products/jquery/sample/tree/multi-trees" target="_blank"&gt;Drag and Drop with two Trees&lt;/a&gt; –&amp;nbsp; moving nodes between controls with identical binding while avoiding dropping nodes on the ones marked as a file via a custom validation function.&lt;/li&gt; &lt;li&gt; &lt;h4&gt;&lt;a title="Simple File Manager - Ignite UI samples" href="http://www.infragistics.com/products/jquery/sample/tree/simple-file-manager" target="_blank"&gt;Simple File Manager&lt;/a&gt; – Using Drag &amp;amp; Drop to organize files and folders and an additional droppable target you can drop nodes to delete them – all while watching the respective events fly in the log.&lt;/h4&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Stay tuned!&lt;/strong&gt;&amp;nbsp; There are some more neat tricks to share about this feature and I plan on another part along with demos!&lt;/p&gt; &lt;h1&gt;Summary&lt;/h1&gt; &lt;p&gt;We can all agree that Drag and Drop is awesome, simple and intuitive and it’s always great to be able to provide that for your users. As we’ve seen that is as easy as child&amp;#39;s play with a mere property or two. However, once you know what you want and the defaults are not it – there’s a plethora of knobs to tweak and some of them.. do they sound familiar? Yes they do, as some come directly from the jQuery UI Dragable and Droppable widgets. Helpers are separated for cases so each can be controlled separately. The control handles much of the work for you by validating proper drop targets on multiple criteria while still providing you with the option to build on that – be it with validation function or by hooking up to one of the elaborate events. Go check out those samples and stay tuned for more!&lt;/p&gt;            &lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;! &lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=385311" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Tree/default.aspx">Tree</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igTree/default.aspx">igTree</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Templates/default.aspx">Templates</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Copy/default.aspx">Copy</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Mouse+Interaction/default.aspx">Mouse Interaction</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Checkbox/default.aspx">Checkbox</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Getting+Started/default.aspx">Getting Started</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/NetAdvantage+12.2/default.aspx">NetAdvantage 12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Events/default.aspx">Events</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/droppable/default.aspx">droppable</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Move/default.aspx">Move</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drag_2600_drop/default.aspx">drag&amp;drop</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drop/default.aspx">drop</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/drag/default.aspx">drag</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/draggable/default.aspx">draggable</category></item><item><title>The Future of Story Tests with Selenium WebDrivers and ISTA 2012</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/12/05/the-future-of-story-tests-with-selenium-webdrivers-and-ista-2012.aspx</link><pubDate>Wed, 05 Dec 2012 17:59:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:384189</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=384189</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/12/05/the-future-of-story-tests-with-selenium-webdrivers-and-ista-2012.aspx#comments</comments><description>&lt;p&gt;&lt;img title="Test Automation: A Future with Selenium WebDrivers, ISTA 2012 conference presentation" style="float:left;margin:0px 5px 0px 0px;display:inline;" alt="Test Automation: A Future with Selenium WebDrivers, ISTA 2012 conference presentation" align="left" src="http://media.infragistics.com/community/jquery/media/ISTA/test-automation-selenium-ista.png" /&gt;This year we had the pleasure of being part of the second “Innovations in Software Test Automation (&lt;a title="Innovations in Software Test Automation ISTA 2012" href="http://istabg.org/" target="_blank"&gt;ISTA 2012&lt;/a&gt;)” conference! This year with even more companies joining for knowledge sharing, additional workshop/hands-on track and a lot more participants. ISTA is gathering a healthy range of quality engineers, software test automation experts and developers to the common goal of sharing new technologies and best practices in the fields of automation. This conference provides for a greater exposure of the software test automation role, which makes it a good place for some to choose career path, gain new insight( or share some of their own! ) and generally gain a better&amp;nbsp; understanding of just how diverse problems can be met and solved in the field. Our Principal Architect, Angel Todorov, who’s been recently focused on our &lt;a title="Ignite UI -  jQuery + HTML5 Toolset for Any Browser, Platform or Device" href="http://www.infragistics.com/products/jquery" target="_blank"&gt;Ignite UI jQuery controls&lt;/a&gt; gave an awesome presentation on &lt;a title="Automated Web UI Testing on Steroids: Behavior-Driven Development, Headless Browser Environments, and Test Bed Generation." href="http://istabg.org/?presentation=automated-web-ui-testing-on-steroids-behavior-driven-development-headless-browser-environments-and-test-bed-generation" target="_blank"&gt;Automated Web UI Testing… on Steroids&lt;/a&gt;! More on that later. The goodness spreading doesn’t have to be only once a year, right? Right. So the conference is also issuing a quarterly newsletter (&lt;a title="ISTA 2012 Newsletter" href="http://istabg.org/?page_id=304" target="_blank"&gt;you can sign up here&lt;/a&gt;). One of our talented Quality Engineers, Borislav Traikov,&amp;nbsp; has been providing some food for thought via article for the conference newsletter. &lt;/p&gt; &lt;h1&gt;The Future of Story Tests with Selenium and WebDrivers&lt;/h1&gt; &lt;p&gt;&lt;a href="http://seleniumhq.org/" target="_blank"&gt;Selenium&lt;/a&gt; has been a recurring mention when it comes to Web Test automation – either directly, or a subtle-yet-preferred base for a framework, it comes up one way or another. And frankly I think that’s a good thing, as major companies having interest in the project simply means better support and contribution to it. And I’m definitely not the only one – taken from Borislav’s article:&lt;/p&gt; &lt;p&gt;&lt;em&gt;Performing automated tests on web applications can be crucial to the success of a project, due to the fact that cross-browser support is a mine field for potential problems and defects. On the other hand, web applications are platform-independent (for the most part). Thus, they can be tested natively (with frameworks such as QUnit) in the browser, or by frameworks that utilize first-class languages (such as C#, Java, Python and so on, while this choice provides a wide window for automated testers to step in and start writing tests. So, if a web application testing framework is to be successful, it should satisfy these needs. Selenium has been doing great so far, providing a cross-browser API over multiple languages. While the &lt;/em&gt;&lt;a href="http://release.seleniumhq.org/selenium-remote-control/1.0-beta-2/doc/java/com/thoughtworks/selenium/Selenium.html"&gt;&lt;em&gt;Selenium API&lt;/em&gt;&lt;/a&gt;&lt;em&gt; provided great DOM abstraction and traversal, it had its shortcomings – the biggest of which was its use of JavaScript sandboxing (Selenium v.1, also known as Selenium RemoteControl, used the JavaScript engine of the current browser as a way of interacting with it). In most cases that wouldn’t matter, but with more complicated web applications under test, interaction with JavaScript events, rather than emulation of real mouse clicks or keyboard interaction simply wasn’t enough. Also, the Selenium API was growing steadily with each release, and while that was awesome (grey areas were addressed and bug fixes were applied), one had to wait for a release or two to get the API method that they sorely needed (or extend the framework themselves – after all, Selenium is an open-source framework).&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;While Selenium was rising to fame among automated testers and gathering commercial support, an engineer at Google wanted something more: a test framework that would break free from the JS sandboxing and instead would natively speak to the browser. With so many different browsers, that was no small feat. Thus, the &lt;/em&gt;&lt;em&gt;WebDriver project was born&lt;/em&gt;&lt;em&gt;. With backing from Google, this automatically meant that Google Chrome (well-known for its distribution of stable nightly builds) and its little brother: the Android browser would be supported. This alone would open the door to a huge improvement in test automation, seeing as how the &lt;/em&gt;&lt;em&gt;Android browser holds a solid 24% of the mobile OS market&lt;/em&gt;&lt;em&gt; (during the time of writing of this article). However, the other runners-up in this “mobile browser war” – Safari and Opera – are still tough challenges for any cross-browser testing framework.&lt;/em&gt; &lt;p&gt;&lt;em&gt;In 2008, the Selenium and WebDriver teams decided that it was time to join forces and to improve Selenium with the advantages of WebDriver: &lt;/em&gt;&lt;em&gt;Selenium WebDriver&lt;/em&gt;&lt;em&gt;. The transition from RemoteControl to WebDriver is still going strong alongside the continuous development of the WebDriver API – these facts raise both hopes and questions about the near and far future of test automation with Selenium.&lt;/em&gt; &lt;p&gt;There’s a ton of interesting info in there, pros and cons of the &lt;a title="Selenium WebDriver" href="http://seleniumhq.org/docs/03_webdriver.html" target="_blank"&gt;WebDriver&lt;/a&gt; and some thoughts on the (hopefully) bright future of test automation. It’s definitely worth checking out, so go ahead and read &lt;a title="The Future of Story Tests with Selenium and WebDrivers" href="http://istabg.org/?p=641" target="_blank"&gt;&lt;strong&gt;The Future of Story Tests with Selenium and WebDrivers&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;!&lt;/strong&gt; &lt;h3&gt;Honorable mentions&lt;/h3&gt; &lt;p&gt;That’s not all! There are more topics to spark your interest: &lt;p&gt;&lt;a title="Software Localization &amp;hellip; more than just using Google Translate - ISTA Newsletter" href="http://istabg.org/?p=419" target="_blank"&gt;Software Localization … more than just using Google Translate&lt;/a&gt;, by Desislava Nikolova&lt;/p&gt; &lt;p&gt;&lt;a title="Best Practices: How To Test Performance Of A New Product, ISTA Newsletter" href="http://istabg.org/?p=297" target="_blank"&gt;Best Practices: How To Test Performance Of A New Product&lt;/a&gt;, by Grigor Svetoslavov&lt;/p&gt; &lt;h1&gt;Automated Web UI Testing on Steroids:&lt;/h1&gt; &lt;p&gt;&lt;strong&gt;&lt;img title="Automated Web UI Testing on Steroids: Behavior-Driven Development, Headless Browser Environments, and Test Bed Generation." style="float:left;display:inline;" alt="Automated Web UI Testing on Steroids: Behavior-Driven Development, Headless Browser Environments, and Test Bed Generation." align="left" src="http://media.infragistics.com/community/jquery/media/ISTA/automated-web-UI-testing.png" /&gt;&lt;/strong&gt;&lt;strong&gt;Behavior-Driven Development, Headless Browser Environments, and Test Bed Generation.&lt;/strong&gt; &lt;p&gt;As I mentioned &lt;a href="http://istabg.org/?speaker=angel-todorov" target="_blank"&gt;Angel Todorov&lt;/a&gt; presented some of the methods and innovations used right here at Infragistics. Yup, it’s basically info straight from source and it’s pretty interesting stuff as well. &lt;a title="Automated Web UI Testing on Steroids: Behavior-Driven Development, Headless Browser Environments, and Test Bed Generation." href="http://istabg.org/?presentation=automated-web-ui-testing-on-steroids-behavior-driven-development-headless-browser-environments-and-test-bed-generation" target="_blank"&gt;The presentation&lt;/a&gt; covers a number of limitations, problems and approaches to address them. It starts by giving an overview of some common frameworks and practices used to automate Web UIs, and lists their advantages and disadvantages. It continues by describing a unified framework for UI automation, involving a combination of tools, some of which come from relatively new concepts such as headless browser environments. The key goals? -&amp;nbsp; Faster test execution, more reliable test results, improving code reuse, and achieving greater productivity! &lt;p&gt;There are details on the cucumber-based framework we are using to describe scenarios and features in the Gherkin syntax and the tools to integrate that into the process. It’s a style that provides readability for the test cases so the stakeholders and managers can take part of the action. Again, something you should definitely not miss – you can follow the link above to read some more and there’s a downloadable version of the presentation deck. For those of you that can’t wait here’s a direct link to slides for the &lt;a title="Automated Web UI Testing on Steroids presentation" href="http://sdm-marketing.com/istabg/wp-content/uploads/2012/12/Automated-Web-UI-Testing-on-Steroids-Infragistics-ISTA-2012.pdf" target="_blank"&gt;Automated Web UI Testing on Steroids presentation&lt;/a&gt;. &lt;p&gt;&amp;nbsp; &lt;p&gt;I’ll end this with something I’d like to say, but as you see I’ll have to just repeat: &lt;p&gt;&lt;a href="http://twitter.com/ISTA_Conference"&gt;@&lt;b&gt;ISTA_Conference&lt;/b&gt;&lt;/a&gt; &lt;p&gt;That was ISTA 2012! You guys rock, thank you! &lt;a href="http://t.co/JGnqlToy"&gt;pic.twitter.com/JGnqlToy&lt;/a&gt; &lt;p&gt;&lt;a href="http://twitter.com/ISTA_Conference/status/271901901229023232/photo/1/large"&gt;&lt;img alt="Embedded image permalink" src="https://pbs.twimg.com/media/A8X9Vq0CYAACDlE.jpg" width="435" height="290" /&gt;&lt;/a&gt; &lt;p&gt;And see you next year!     &lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=384189" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Framework/default.aspx">Framework</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/WebDriver/default.aspx">WebDriver</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ISTA+Conference/default.aspx">ISTA Conference</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Test/default.aspx">Test</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Gherkin/default.aspx">Gherkin</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Automation/default.aspx">Automation</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Software+Test+Automation/default.aspx">Software Test Automation</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/BDD/default.aspx">BDD</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Headless+Browser+Environments/default.aspx">Headless Browser Environments</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ISTA/default.aspx">ISTA</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Selenium/default.aspx">Selenium</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Behavior-Driven+Development/default.aspx">Behavior-Driven Development</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Innovation/default.aspx">Innovation</category></item><item><title>Ignite UI jQuery Mobile layouts and ASP.NET MVC– wrapping it all up</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/11/08/ignite-ui-jquery-mobile-layouts-and-asp-net-mvc-wrapping-it-all-up.aspx</link><pubDate>Thu, 08 Nov 2012 18:15:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:380844</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=380844</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/11/08/ignite-ui-jquery-mobile-layouts-and-asp-net-mvc-wrapping-it-all-up.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;float:left;" title="Ignite UI mobile applications with jQuery Mobile based controls and ASP.NET MVC" alt="Ignite UI mobile applications with jQuery Mobile based controls and ASP.NET MVC" align="left" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-applications-layout.png" /&gt;After we’ve looked into the &lt;a title="Reach further with IgniteUI jQuery Mobile controls and ASP.NET MVC" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/11/05/reach-further-with-igniteui-jquery-mobile-controls-and-asp-net-mvc.aspx" target="_blank"&gt;range of input jQuery mobile controls you can use with the greatest ease with Ignite UI ASP.NET MVC wrappers&lt;/a&gt;, there is something more you can do. If you try the snippets as is you will find them working well and in tone, but rather lacking in terms of layout. So now that you have an idea how to provide content, let’s wrap it up in some proper containers and provide navigation. &lt;/p&gt; &lt;p&gt;For the record, it’s only fair to say that if you run a sample with just the controls defined you still get the entire page styled. Why is that? Well you can have a look at jQuery Mobile’s “&lt;a title="Anatomy of a jQuery Mobile page" href="http://jquerymobile.com/demos/1.2.0/docs/pages/page-anatomy.html" target="_blank"&gt;Anatomy of a page&lt;/a&gt;”. As it says there the layout consists of conventions, rather than requirements. Wheat this means is that you are not forced to add a header, footer, content or page for that matter. What jQuery Mobile will do is to wrap your entire HTML in the body in a DIV with the page role. That while convenient is not optimal – if you have script tags in the body the process of wrapping the content will also load them again, so it is best advised to still have a properly defined mobile ‘page’ in your HTML. This is also absolutely necessary when two or mode pages are to be delivered in a single file, and yes, that is possible, but again not recommended way of design. So yeah, conventions and not requirements, however those conventions are there for a good reason and you are better off following them. So how about Ignite UI ASP.NET MVC wrappers? Will they help here? Sure!&lt;/p&gt; &lt;h1 id="mobile-page-basics" name="mobile-page-basics"&gt;Mobile pages 101&lt;/h1&gt; &lt;p&gt;Let’s start with the most basic thing – the actual&lt;strong&gt; page&lt;/strong&gt;. The helpers will&amp;nbsp; offer a way of defining it that is very similar to how you would go about a Form element. That is in the sense that there are separate methods to begin a page and to end it. However, unlike the form being a set of two methods, the page being Ignite UI means it can also be initialized with a Page Model passed to the view. Here’s how a simple definition with chaining syntax goes ( logically, any options should be in the page opening) :&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:638fc1fd-17e6-4202-a49e-01e9da0dabcd" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Infragistics.Web.Mvc.Mobile&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:91c2d065-bbe0-4563-94cc-59bc36a26616" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Page().Title(&lt;span style="color:#a31515;"&gt;&amp;quot;My App&amp;quot;&lt;/span&gt;).Theme(&lt;span style="color:#a31515;"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;).BeginRender()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#006400;"&gt;&amp;lt;!-- page content goes in here --&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Page().EndRender()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;And as I mentioned this can be done via Page Model:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:284dc03c-a8f2-41f9-ad24-ddce6bec70e3" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#2b91af;"&gt;PageModel&lt;/span&gt; page = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PageModel&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;page.Title = &lt;span style="color:#a31515;"&gt;&amp;quot;My App&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;page.AddBackButton = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;page.BackButtonText = &lt;span style="color:#a31515;"&gt;&amp;quot;Lost? Go back!&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;ViewBag.secPage = page;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1817c881-17d3-47d9-8744-be285e70a071" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Page(ViewBag.secPage &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PageModel&lt;/span&gt;).BeginRender()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#006400;"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Page().EndRender()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;How about that back button setting up there? What could that possibly do? Well it’s related to the next otherwise not required layout element – &lt;strong&gt;the header&lt;/strong&gt;. For that setting to have any meaning, you will need a header on your pages as the button will appear just there). There’s another button that you can set text (for tooltip) to but you can’t customize, and that is the close button. Page with close button? Of course, that one is present when the page is opened as a dialog. We’ll talk about how that goes later or, but keep in mind it only makes sense to set one as the close is dialogs’ replacement for the back button.&lt;/p&gt; &lt;p&gt;Headers are used in much the same way as pages (begin and end) and among other things can be set to fixed position:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b0c7dde7-35e3-4035-b3aa-e89678184e24" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Page(ViewBag.secPage &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PageModel&lt;/span&gt;).Url(&lt;span style="color:#a31515;"&gt;&amp;quot;secondary&amp;quot;&lt;/span&gt;).BeginRender()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().PageHeader().FixedOptions(options =&amp;gt; { &lt;/li&gt; &lt;li&gt;            options.Fixed(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;).TapToggle(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;).Transition(&lt;span style="color:#a31515;"&gt;&amp;quot;slide&amp;quot;&lt;/span&gt;); &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }).BeginRender()&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;h1&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; Second page&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;h1&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().PageHeader().EndRender()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#006400;"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Page().EndRender()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The ‘FixedOptions’ can also set behaviors like tap (or click) to show/hide the fixed header and transition animation for showing (the default is slide). There’s more of course and you can pay our &lt;a title="Ignite UI&amp;trade; Online Help - jQuery Mobile controls&amp;#39; Documentation" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=jQuery_Mobile_Landing_Page.html" target="_blank"&gt;Ignite UI Mobile Documentation&lt;/a&gt; a visit. The And you will see something similar to this in the light WP theme:&lt;/p&gt; &lt;p&gt;&lt;img title="Ignite UI Mobile page&amp;#39;s header in Windows Phone Light theme" alt="Ignite UI Mobile page&amp;#39;s header in Windows Phone Light theme" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-applications-page-header.png" /&gt;&lt;/p&gt; &lt;h3 id="Linking" name="Linking"&gt;Linking&lt;/h3&gt; &lt;p&gt;One thing still is escaping – how did the user get here? Well he followed a&lt;strong&gt; link&lt;/strong&gt; of course. jQuery mobile provides some enhancements to those as well. Links can be in three styling modes – the native for the browser, the link styling of the theme or as a button. Note that links inside headers and footers will always be styled as buttons whether you set them to or not. Also I mentioned dialog and you can tell the framework to load something as dialog when you specify an option on the link itself:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:80f7d67b-42f5-4ccd-8f51-0455e547c508" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Link().NavigateUrl(&lt;span style="color:#a31515;"&gt;&amp;quot;#secondary&amp;quot;&lt;/span&gt;).RenderMode(&lt;span style="color:#2b91af;"&gt;LinkRenderMode&lt;/span&gt;.Button).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;secondary page&amp;quot;&lt;/span&gt;).Render()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Link().NavigateUrl(&lt;span style="color:#a31515;"&gt;&amp;quot;#dialog&amp;quot;&lt;/span&gt;).DestinationRelationship(&lt;span style="color:#2b91af;"&gt;LinkDestinationRelationshipOptions&lt;/span&gt;.Dialog).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;dialog page&amp;quot;&lt;/span&gt;).Render()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The above will produce:&lt;/p&gt; &lt;p&gt;&lt;img title="Ignite UI Mobile links - with dialog relation and styled as a button" alt="Ignite UI Mobile links - with dialog relation and styled as a button" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-applications-links.png" /&gt;&lt;/p&gt; &lt;p&gt;As you can see you have the option to define a relation with the destination or the link, and this is how you create interactions to open up dialogs and popups. This is a similar page opened up by the dialog link above:&lt;/p&gt; &lt;p&gt;&lt;img title="Ignite UI Mobile page opened as a dialog" alt="Ignite UI Mobile page opened as a dialog" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-applications-dialog.png" /&gt;&lt;/p&gt; &lt;p&gt;You can also specify relation to be ‘back’ so you can add back buttons not just in headers but anywhere in your content. Keep in mind automatic Back button on on pages only appears if there&amp;#39;s actual history – as in when they have been navigated to by a link. This is somewhat important to know when using multiple pages in a single document (even thought it’s not a recommended practice) as you can force loading secondary pages by entering their URL but this way jQuery Mobile won’t add those to the history. Still, there’s a very minor chance someone will be entering links by hand, but you never know. Also for back buttons it’s good to still provide a meaningful link for browser compatibility.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;More?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;So far you can create basic pages and provide navigation. Also at your disposal is the &lt;strong&gt;content&lt;/strong&gt; element – as the documentation describes it is helpful for “providing some basic formatting and structure”. But, hey, have you noticed the simulator screenshot in the previous blog? Does it seem odd items are stretched so far out it feels they are about to be cut off by the viewport edges? That’s because as direct page content they tend to spread to the maximum width… Wrapping those in a content element is at least the easiest way to provide proper formatting as the content will squeeze them a little. Also you can set separate theme to he content this way or apply classes to add custom styling and behavior with.&lt;/p&gt; &lt;p&gt;The same statement that describes the content is also true for the &lt;strong&gt;footer.&lt;/strong&gt; But while it is not required for automatic page functionality like back/close buttons and it also serves the structural and potentially visual separation of content, it can much like the header be fixed, which can sometimes be really useful. So for that secondary page we have above we can add something like the following:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b2adef6b-cf13-46a5-b7b6-27d3eb043348" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().PageContent().BeginRender()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    There&amp;#39;s some content in here. x 50&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().PageContent().EndRender()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().PageFooter().BeginRender()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;p&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; (c) My Company &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;p&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().PageFooter().EndRender()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;&lt;img title="Ignite Ui mobile page with a header and footer" alt="Ignite Ui mobile page with a header and footer" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-page-content-footer.png" /&gt;&lt;/p&gt; &lt;h1 id="enhanced-layout-mobile" name="enhanced-layout-mobile"&gt;Enhanced Layout&lt;/h1&gt; &lt;p&gt;Now that you can properly fill those pages comes yet another potential problem. While you have been refactoring your site’s experience into mobile pages to be properly consumed on mobile devices it still is too hard to fit relevant content together into a single page? Well you don’t have to, really. &lt;/p&gt; &lt;p&gt;You can separate content that is not for immediate consumption or instead of swapping pages on some event show content in a &lt;strong&gt;popup.&lt;/strong&gt; It’s extremely useful for a range of cases – from simple tooltip to login forms and application menus. Keep in mind the &lt;strong&gt;popup is available from 1.2.0 version of jQuery Mobile&lt;/strong&gt;! Like other content containers, the popup has begin and end methods and content between them is not displayed by default. To display a popup you can set up a link (on the same page) that navigates to the popup ID and has a relation of that type and inside you can add another link as close button:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0f01c2b4-b687-40e7-96e2-8745dfeac2e3" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Link().NavigateUrl(&lt;span style="color:#a31515;"&gt;&amp;quot;#DownloadPopup&amp;quot;&lt;/span&gt;).DestinationRelationship(&lt;span style="color:#2b91af;"&gt;LinkDestinationRelationshipOptions&lt;/span&gt;.Popup).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;Click here!&amp;quot;&lt;/span&gt;).Render()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt; &lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Popup().ID(&lt;span style="color:#a31515;"&gt;&amp;quot;DownloadPopup&amp;quot;&lt;/span&gt;).History(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;).PositionTo(&lt;span style="color:#a31515;"&gt;&amp;quot;window&amp;quot;&lt;/span&gt;).Tolerance(10).Transition(&lt;span style="color:#a31515;"&gt;&amp;quot;pop&amp;quot;&lt;/span&gt;).BeginRender()&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffff00;"&gt;@(&lt;/span&gt;Html.InfragisticsMobile().Link().NavigateUrl(&lt;span style="color:#a31515;"&gt;&amp;quot;#&amp;quot;&lt;/span&gt;).DestinationRelationship(&lt;span style="color:#2b91af;"&gt;LinkDestinationRelationshipOptions&lt;/span&gt;.Back).RenderMode(&lt;span style="color:#2b91af;"&gt;LinkRenderMode&lt;/span&gt;.Button)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;             .Icon(&lt;span style="color:#2b91af;"&gt;DefaultIcons&lt;/span&gt;.Delete).IconPosition(&lt;span style="color:#2b91af;"&gt;IconPositions&lt;/span&gt;.NoText)&lt;/li&gt; &lt;li&gt;             .HtmlAttributes(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt;() { {&lt;span style="color:#a31515;"&gt;&amp;quot;class&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;ui-btn-right&amp;quot;}&lt;/span&gt; }).Render()&lt;span style="background:#ffff00;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;a&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Donwload your Ignite UI Free Trial now!&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;href&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://www.infragistics.com/products/jquery/downloads&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;target&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;_blank&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;img&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Url.Content(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;~/Content/IgniteUI-download.jpg&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;)&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;alt&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Download Ingine UI&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;a&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Popup().EndRender()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;  &lt;p&gt;&lt;img title="Ignite UI mobile popup" alt="Ignite UI mobile popup" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-popup.png" /&gt;&lt;/p&gt; &lt;p&gt;The button class can be left and right and the contents of the popup can be any HTML. As seen options include positional settings like centering over the element that was clicked (origin) or the window. You can even pass a jQuery selector to position the popup over the matched element. And the tolerance sets up how much in the minimum spacing between the popup and the edge of the window. The MVC wrapper method has 3 overloads that let you put a single common value, just for top and left or for all sides. The transition has the usual jQuery animations available and another allows (or not) for jQuery Mobile to modify the page Url and add it to the history. This means you can let your users to close popups with the back button.&lt;/p&gt; &lt;p&gt;Another extremely useful layout trick is to organize things within collapsible container. They come in two varieties – a &lt;strong&gt;standalone&amp;nbsp; Collapsible and a Collapsible Set. &lt;/strong&gt;While pretty self-explanatory the single version consists of a header and a content block that is either visible or collapsed. You have a number of options to control themes, header state icons and their position and more. For example the default icons are plus and minus, while we can use arrows instead:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:63401db0-30ee-49d8-b274-46090bb9baec" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@(&lt;/span&gt;Html.InfragisticsMobile().Collapsible().HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;radio button groups&amp;quot;&lt;/span&gt;).ContentTheme(&lt;span style="color:#a31515;"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        .ExpandedIcon(&lt;span style="color:#2b91af;"&gt;DefaultIcons&lt;/span&gt;.UpArrow).CollapsedIcon(&lt;span style="color:#2b91af;"&gt;DefaultIcons&lt;/span&gt;.DownArrow).BeginRender()&lt;span style="background:#ffff00;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#006400;"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Collapsible().EndRender()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;&lt;img title="Ignite UI mobile collapsible content in both states and with modified state icons" alt="Ignite UI mobile collapsible content in both states and with modified state icons" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-collapsible.png" /&gt;&lt;/p&gt; &lt;p&gt;The set version is essentially an accordion – only one out of a group of blocks can be expanded at a time and current collapses automatically when the user opens another. The model is pretty much identical – you have the set that is a container for single collapsibles and it even has the same general options (icons, themes) that you can apply for all child blocks:&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2bbff3bc-c554-4a6b-809b-f36426e08f1b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().CollapsibleSet().ContentTheme(&lt;span style="color:#a31515;"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;).BeginRender()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#006400;"&gt;&amp;lt;!-- standalone collapsibles here --&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().CollapsibleSet().EndRender()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;&lt;img title="Ignite UI mobile collapsible set of content with second block expanded" alt="Ignite UI mobile collapsible set of content with second block expanded" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-collapsible-set.png" /&gt;&lt;/p&gt; &lt;h1 id="navbar" name="navbar"&gt;A nicely packed navigation&lt;/h1&gt; &lt;p&gt;Of course, it’s always nice when you can make the web page feel more like an application and provide nice buttons instead of links. It’s also nice if those are not spread all over the page, but rather grouped. Here is where the Navigation bar comes in play – it allows you provide up to 5 (after which it wraps them in multiline..) buttons with customizable themes, icons and exclusive selection (kinda like horizontal radio group but without the form input support). This toolbar is most common in headers or footers. The control itself has a collection of items, global icon positioning an theme options. Each item has Url and text as expected:&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9578f992-e4fd-4ec5-9024-ea68f5ca9a48" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().NavBar().IconPosition(&lt;span style="color:#2b91af;"&gt;IconPositions&lt;/span&gt;.Top).Items( item =&amp;gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        item.NavBarItem().NavigateUrl(&lt;span style="color:#a31515;"&gt;&amp;quot;#secondary&amp;quot;&lt;/span&gt;).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;secondary page&amp;quot;&lt;/span&gt;).Icon(&lt;span style="color:#2b91af;"&gt;DefaultIcons&lt;/span&gt;.RightArrow);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        item.NavBarItem().NavigateUrl(&lt;span style="color:#a31515;"&gt;&amp;quot;#dialog&amp;quot;&lt;/span&gt;).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;dialog page&amp;quot;&lt;/span&gt;).Icon(&lt;span style="color:#2b91af;"&gt;DefaultIcons&lt;/span&gt;.Info);&lt;/li&gt; &lt;li&gt;        item.NavBarItem().NavigateUrl(Url.Action(&lt;span style="color:#a31515;"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;Type&amp;quot;&lt;/span&gt;)).Icon(&lt;span style="color:#2b91af;"&gt;DefaultIcons&lt;/span&gt;.Gear).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;Strongly-typed&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }).Render()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;&lt;img title="Ignite UI mobile page&amp;#39;s footer with a NavBar with 3 buttons (focus on first one)" alt="Ignite UI mobile page&amp;#39;s footer with a NavBar with 3 buttons (focus on first one)" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-navbar.png" /&gt;&lt;/p&gt;        &lt;h1 id="stay-tuned" name="stay-tuned"&gt;&lt;font style="font-size:24pt;"&gt;TL;DR | Summary&lt;/font&gt;&lt;/h1&gt; &lt;p name="stay-tuned"&gt;In this article we’ve looked into the basic ways to create structure in your mobile applications using the Ignite UI ASP.NET MVC wrappers/helpers. In addition, we saw how linking between pages can be done with different relations and styles. Furthermore, there were the mode advanced ways to enhance experience with your app by providing interactive content with popups and collapsible content. Lastly, a more neatly organized way to build your navigation in a toolbar that also provides a nice touch of ‘native’ feel to the mobile app.&lt;/p&gt; &lt;p name="stay-tuned"&gt;Make sure you stop by the first part for some &lt;a title="Reach further with IgniteUI jQuery Mobile controls and ASP.NET MVC" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/11/05/reach-further-with-igniteui-jquery-mobile-controls-and-asp-net-mvc.aspx" target="_blank"&gt;input jQuery mobile controls you can use with the greatest ease with Ignite UI ASP.NET MVC wrappers&lt;/a&gt;, check out our &lt;a title="Ignite UI&amp;trade; Online Help - jQuery Mobile controls&amp;#39; Documentation" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=jQuery_Mobile_Landing_Page.html" target="_blank"&gt;Ignite UI Mobile Documentation&lt;/a&gt; and visit our &lt;a title="Ignite UI contorls and samples" href="http://www.infragistics.com/products/jquery/samples" target="_blank"&gt;samples you can experience on your mobile device as well&lt;/a&gt;! I have packed all of the described examples in a &lt;a title="ASP.NET MVC solution with Ignite UI mobile controls/wrappers" href="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/IgniteUI_Mobile.zip" target="_blank"&gt;very simple ASP.NET MVC solution&lt;/a&gt; for you to download and try and in order to run that you will need at least a Trial version of Ignite UI for the mobile assembly, but hey it’s free, grab one from here:&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;! &lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=380844" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Razor/default.aspx">Razor</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CSS3/default.aspx">CSS3</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CDN/default.aspx">CDN</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Themes/default.aspx">Themes</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jqm/default.aspx">jqm</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery+Mobile/default.aspx">jQuery Mobile</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/mobile/default.aspx">mobile</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Touch/default.aspx">Touch</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/iPod+Touch/default.aspx">iPod Touch</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/iPad/default.aspx">iPad</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/iPhone/default.aspx">iPhone</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/iOS/default.aspx">iOS</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/intelliSense/default.aspx">intelliSense</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Windows+Phone+theme/default.aspx">Windows Phone theme</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/collapsible/default.aspx">collapsible</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/mobile+dialog/default.aspx">mobile dialog</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/mobile+page+layout/default.aspx">mobile page layout</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/navbar/default.aspx">navbar</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/navigtion+toolbar/default.aspx">navigtion toolbar</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/popup/default.aspx">popup</category></item><item><title>Reach further with IgniteUI jQuery Mobile controls and ASP.NET MVC</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/11/05/reach-further-with-igniteui-jquery-mobile-controls-and-asp-net-mvc.aspx</link><pubDate>Mon, 05 Nov 2012 22:54:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:380171</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=380171</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/11/05/reach-further-with-igniteui-jquery-mobile-controls-and-asp-net-mvc.aspx#comments</comments><description>&lt;p&gt;&lt;img style="margin:0px 3px 0px 0px;display:inline;float:left;" title="IgniteUI mobile applications with jQuery Mobile based controls and ASP.NET MVC" alt="IgniteUI mobile applications with jQuery Mobile based controls and ASP.NET MVC" align="left" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-applications.png" /&gt;&lt;/p&gt; &lt;p&gt;Out of the new and exciting things happening around &lt;a title="Ignite UI: The World&amp;rsquo;s Most Advanced JavaScript &amp;amp; HTML5 UI Framework" href="http://www.infragistics.com/community/blogs/jason_beres/archive/2012/10/12/ignite-ui-the-world-s-most-advanced-javascript-amp-html5-ui-framework.aspx" target="_blank"&gt;IgniteUI&lt;/a&gt; is the enhancement of the mobile toolset. These controls are based on &lt;a title="jQuery Mobile: Touch-Optimized Web Framework for Smartphones &amp;amp; Tablets" href="http://jquerymobile.com/" target="_blank"&gt;jQuery Mobile&lt;/a&gt; rather than &lt;a title="jQuery UI" href="http://jqueryui.com/" target="_blank"&gt;jQuery UI&lt;/a&gt;, as it provides optimizations for mobile devices. Applications built using them meet the demands of phones and tablets when it comes to usability and design. Windows (Phone) 8,&amp;nbsp; iOS and Android devices are everywhere and the flavor of the year word is &lt;strong&gt;TOUCH&lt;/strong&gt;&amp;nbsp; - support for that and responsive design both come out-of-the-box. But this isn’t the first time we’re taking on the subject – some time ago (in 12.1) we released the &lt;a title="jQuery Mobile Controls by Infragistics" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/05/18/infragistics-jquery-mobile-controls.aspx" target="_blank"&gt;mobile ListView and Rating&lt;/a&gt; where some parts were covered. Even though for now I’ll keep to the present and show you some of the new stuff, leave a comment if you have some thoughts on anything else. Also make sure to check out the topmost link for a list of all IgniteUI changes.&lt;/p&gt; &lt;p&gt;So, possibly the biggest change introduced with 12.2 now is for all of you ASP.NET MVC lovers :) We’ve devoted effort to enrich the mobile toolset by adding 17 ‘new’ controls by providing what we call “re-assurance” wrappers around existing jQuery Mobile controls. What this means is that you get not only Infragistics support for them, but hey, as part of our suite you can bet on each of them having a model for neat ASP.NET MVC Helper action! Yup – means you can code jQuery Mobile based applications with Razor syntax in C# or VB.NET! Also you get enhancements such as the control model themselves so they can be configured outside the View as well for maximum control and when in the View – the option to create strongly-typed controls!&lt;/p&gt; &lt;h1 id="benefits" name="benefits"&gt;What are the goodies?&lt;/h1&gt; &lt;p&gt; &lt;p&gt;With the latest additions the IgniteUI package is capable of delivering an application in its entirety all in the comfort of the IDE and language you feel accustomed with. But it’s not just the controls that grew in numbers – to truly provide a full-fledged end-user experiences we also added themes for Android (whole 3 of them) and two for Windows Phone! And there’s even support for adaptive theming to match the device platform feel! I’ll try to demonstrate different themes along the way and you can always hit up our &lt;a title="IgniteUI Online samples" href="http://www.infragistics.com/products/jquery/samples" target="_blank"&gt;samples&lt;/a&gt; and see for yourself!&lt;/p&gt; &lt;p&gt;There are also a number of benefits you get – the mobile jQuery controls now have their own section in the &lt;a title="IgniteUI Documentation/Online Help" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=jQuery_Mobile_Landing_Page.html" target="_blank"&gt;IgniteUI Documentation/Online Help&lt;/a&gt; with very useful mobile-centric &lt;a title="Ignite UI&amp;trade; Online Help : Deployment Guide" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=Deployment_Guide_Mobile.html" target="_blank"&gt;Deployment guide&lt;/a&gt; and detailed control documentation. You should totally check that one out as well. &lt;/p&gt; &lt;p&gt;In addition to what I mentioned above ( the comfort of your IDE and language, strongly-typed) the MVC wrappers bring quite a bit more – having server model of your client controls lets you define them without requiring the knowledge of their HTML structure and with &lt;a title="IntelliSense - wikipedia" href="http://en.wikipedia.org/wiki/IntelliSense"&gt;IntelliSense&lt;/a&gt; support. &lt;/p&gt; &lt;p&gt;&lt;img title="IgniteUI mobile MVC helper allows control creation in familiar manner and with the conforts of IntelliSense" alt="IgniteUI mobile MVC helper allows control creation in familiar manner and with the conforts of IntelliSense" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-mvc-intelliSense.png" /&gt;&lt;/p&gt; &lt;p&gt;They will also prefill defaults for you, the ones that matter the most – required for the control to be initialized,&amp;nbsp; automatic element IDs and in the case of strongly-typed controls like above the proper model property will be set as both ‘id’ and ‘name’ attribute of the elements in order to be properly picked up and sent upon form submits.&lt;/p&gt; &lt;p&gt;In case you think typed models of controls will take away the freedom you can have with just HTML, you can rest assured that is not the case as all the models accept extra settings via the HtmlAttributes method.&lt;/p&gt; &lt;h1 id="getting-started-mobile-inputs" name="getting-started-mobile-inputs"&gt;Getting started with mobile controls&lt;/h1&gt; &lt;p&gt;Let’s see just how easy it is to create basic mobile applications. Make sure you have followed the Deployment guide above and referenced the jQuery mobile recourses&amp;nbsp; and IgniteUI ones or the mobile version of the loader widget. &lt;/p&gt; &lt;p&gt;The most basic control you could use is the &lt;strong&gt;TextBox&lt;/strong&gt; that supports different modes such as password, multiline and search.&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:72cb26f4-7a9a-49f0-b826-6596256f2943" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().TextBox().Mode(&lt;span style="color:#2b91af;"&gt;TextEditorTextMode&lt;/span&gt;.Search).Render()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;And this in the Android “Holo Light-Dark” theme comes out as:&lt;/p&gt; &lt;p&gt;&lt;img title="The jQuery Mobile search text box as produced by the IgniteUI MVC helper" alt="The jQuery Mobile search text box as produced by the IgniteUI MVC helper" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-textbox-search.png" /&gt;&lt;/p&gt; &lt;p&gt;Then you can have &lt;strong&gt;Buttons&lt;/strong&gt; of course! Notable properties of the buttons are the icons (with related positioning properties) along with the ability to define them as inline (otherwise to ensure fit for small screens jQuery Mobile elements are usually displayed in block, as in a new line):&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e930350d-2a08-459e-bfff-12ee2ff21ee2" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Button().HtmlAttributes(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt; { { &lt;span style="color:#a31515;"&gt;&amp;quot;class&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;pop&amp;quot;&lt;/span&gt; } }).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;button&amp;quot;&lt;/span&gt;).Mini(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;).Icon(&lt;span style="color:#a31515;"&gt;&amp;quot;gear&amp;quot;&lt;/span&gt;).Render()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Button().IsSubmitButton(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;submit&amp;quot;&lt;/span&gt;).Inline(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;).Render()&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Button().Text(&lt;span style="color:#a31515;"&gt;&amp;quot;cancel&amp;quot;&lt;/span&gt;).Inline(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;).Render()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#800000;"&gt;.pop&lt;/span&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#ff0000;"&gt;text-decoration&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;none&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#ff0000;"&gt;line-height&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;1.5em&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#ff0000;"&gt;background-color&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;#ACACAC&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#ff0000;"&gt;color&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;#fff&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#ff0000;"&gt;border&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;none&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#800000;"&gt;.pop:hover&lt;/span&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;     &lt;span style="color:#ff0000;"&gt;background-color&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;#007FAF&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#800000;"&gt;.pop:active&lt;/span&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;     &lt;span style="color:#ff0000;"&gt;background-color&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;#00AEEF&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;I’ve also added the style in here so you can see that you can even make use of the html attributes to add class and apply custom styling:&lt;/p&gt; &lt;p&gt;&lt;img title="jQuery Mobile buttons with custom styling and icon and two inline buttons" alt="jQuery Mobile buttons with custom styling and icon and two inline buttons" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-buttons.png" /&gt;&lt;/p&gt; &lt;p&gt;That doesn’t really fit, but oh well :)&lt;/p&gt; &lt;p&gt;Next up is the &lt;strong&gt;Slider&lt;/strong&gt; so let’s see how you can set it up on the server using the model:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8c82c354-ad3a-4131-8e38-791ecec1e3ee" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Infragistics.Web.Mvc.Mobile;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c28efe56-05e5-4e7f-b7cf-6981c4b2a722" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#2b91af;"&gt;SliderModel&lt;/span&gt; slider = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SliderModel&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;slider.NumericInputDisplayMode = &lt;span style="color:#2b91af;"&gt;DisplayMode&lt;/span&gt;.Inline;&lt;/li&gt; &lt;li&gt;slider.MinValue = 0;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;slider.MaxValue = 100;&lt;/li&gt; &lt;li&gt;slider.Value = 30;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;slider.Label = &lt;span style="color:#a31515;"&gt;&amp;quot;Progress:&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;slider.LabelAlignment = &lt;span style="color:#2b91af;"&gt;Alignment&lt;/span&gt;.Top;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;ViewBag.Slider = slider;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;You can pass the model itself if you will, but I’m actually using the dynamic ViewBag because I have more then one model for that view. The Helper as always comes with an overload taking a ready control model:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:18a69b35-03fd-4a6d-bd15-65fa8d815485" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().Slider(ViewBag.Slider &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SliderModel&lt;/span&gt;)&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;&lt;img title="Mobile slider in the IgniteUI iOS theme" alt="Mobile slider in the IgniteUI iOS theme" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-slider.png" /&gt;&lt;/p&gt; &lt;p&gt;Moving on with the all-time favorite &lt;strong&gt;Toggle switch.&lt;/strong&gt; It’s one of those mobile specific controls that is very easily recognized. The two states of the control are called on and off and you can specify text for both, as well as initial state. With all controls you can also apply themes (or swatches as they are defined within the jQuery Mobile styling):&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2a75b53d-2e54-495f-a9d8-d857e2c62285" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@(&lt;/span&gt; Html.InfragisticsMobile().ToggleSwitch().Render()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffff00;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@(&lt;/span&gt; Html.InfragisticsMobile().ToggleSwitch().ID(&lt;span style="color:#a31515;"&gt;&amp;quot;test2&amp;quot;&lt;/span&gt;).OffText(&lt;span style="color:#a31515;"&gt;&amp;quot;disabled&amp;quot;&lt;/span&gt;).OnText(&lt;span style="color:#a31515;"&gt;&amp;quot;enabled&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        .SwitchedState(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;).Width(&lt;span style="color:#a31515;"&gt;&amp;quot;10em&amp;quot;&lt;/span&gt;).Theme(&lt;span style="color:#a31515;"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;).Render()&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;&lt;img title="Mobile toggle switches in the IgniteUI Android theme and tow different swatches (sub-themes)" alt="Mobile toggle switches in the IgniteUI Android theme and tow different swatches (sub-themes)" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-toggle-switches.png" /&gt;&lt;/p&gt; &lt;p&gt;Those are the Android-styled toggles.&lt;/p&gt; &lt;p&gt;Another very mobile-oriented control would be the &lt;strong&gt;Select Menu&lt;/strong&gt; – very much behaving like a select but with enhanced popup-like modal selection for better mobile experience. Much like other selects and combo boxes, it supports both single and multiple selection, the option to use native menus ( don’t know why would you punish users like that, but it’s there) and a collection of items:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ebba35aa-6414-426c-86c7-2bccd740a7c4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().SelectMenu().Multiple(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;).Label(&lt;span style="color:#a31515;"&gt;&amp;quot;Favorite language:&amp;quot;&lt;/span&gt;).NativeMenu(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;).Items(s =&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        s.MenuItems.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SelectMenuItem&lt;/span&gt; { Text = &lt;span style="color:#a31515;"&gt;&amp;quot;JavaScript&amp;quot;&lt;/span&gt;, Selected = &lt;span style="color:#0000ff;"&gt;true}&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        s.MenuItems.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SelectMenuItem&lt;/span&gt; {  Text = &lt;span style="color:#a31515;"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt;, Value = &lt;span style="color:#a31515;"&gt;&amp;quot;CSharp&amp;quot;&lt;/span&gt; });&lt;/li&gt; &lt;li&gt;        s.MenuItems.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SelectMenuItem&lt;/span&gt; { Text = &lt;span style="color:#a31515;"&gt;&amp;quot;TypeScript&amp;quot;}&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        s.MenuItems.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SelectMenuItem&lt;/span&gt; {  Text = &lt;span style="color:#a31515;"&gt;&amp;quot;VB.NET&amp;quot;&lt;/span&gt; });&lt;/li&gt; &lt;li&gt;    }).Render()&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;img title="The initial state of the IgniteUI select menu with a label and default selection" alt="The initial state of the IgniteUI select menu with a label and default selection" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-select-menu.png" /&gt;&lt;/p&gt; &lt;p&gt;The interesting part is that it would also display a counter if multiple are selected(if you want it to naturally – as with most it is customizable):&lt;/p&gt; &lt;p&gt;&lt;img title="The popup with options shown for the Select menu and the dynamic counter for selected items." alt="The popup with options shown for the Select menu and the dynamic counter for selected items." src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-select-menu-popup-counter.png" /&gt;&lt;/p&gt; &lt;p&gt;Speaking of selection there are two more well-known user-selection that the above menu is really based on. First are the &lt;strong&gt;Checkbox&lt;/strong&gt; and &lt;strong&gt;Checkbox Group&lt;/strong&gt; – fairly simple two-state input element, that when used in group allows for multiple selection. The checkbox can be used as stand-alone as expected or as part of the group model’s collection of items:&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:166a016c-dc9c-48f5-8b7b-b30b1dd67989" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#2b91af;"&gt;CheckBoxGroupModel&lt;/span&gt; cbgrp = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CheckBoxGroupModel&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;cbgrp.ID = &lt;span style="color:#a31515;"&gt;&amp;quot;chkBoxGrp&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;cbgrp.Items.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CheckBoxModel&lt;/span&gt;() { Checked = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;, ID = &lt;span style="color:#a31515;"&gt;&amp;quot;opt1&amp;quot;&lt;/span&gt;, Text = &lt;span style="color:#a31515;"&gt;&amp;quot;Option1&amp;quot;}&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;cbgrp.Items.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CheckBoxModel&lt;/span&gt;() { ID = &lt;span style="color:#a31515;"&gt;&amp;quot;opt2&amp;quot;&lt;/span&gt;, Text = &lt;span style="color:#a31515;"&gt;&amp;quot;Option2&amp;quot;}&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;cbgrp.Items.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CheckBoxModel&lt;/span&gt;() { ID = &lt;span style="color:#a31515;"&gt;&amp;quot;opt3&amp;quot;&lt;/span&gt;, Text = &lt;span style="color:#a31515;"&gt;&amp;quot;Option3&amp;quot;}&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;ViewBag.ChbxGrp = cbgrp;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e10602c0-867c-4cf0-9464-5a25de06607d" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.InfragisticsMobile().CheckBoxGroup(ViewBag.ChbxGrp &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CheckBoxGroupModel&lt;/span&gt;)&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;&lt;img title="The popup with options shown for the Select menu and the dynamic counter for selected items." alt="A checkbox group in Windows phone theme (light)" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-checkbox-group.png" /&gt;&lt;/p&gt; &lt;p&gt;And if you set the ‘Horizontal’ property to true you get a single line button or also called toggle set:&lt;/p&gt; &lt;p&gt;&lt;img title="A horizontal version of the checkbox group in Windows phone theme (light)" alt="A horizontal version of the checkbox group in Windows phone theme (light)" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-checkbox-group-horizontal.png" /&gt;&lt;/p&gt; &lt;p&gt;The other selection option in the toolset is the &lt;strong&gt;Radio Button Group&lt;/strong&gt; – with the difference that radio buttons make no sense outside of a group and when grouped only a single one can be selected. Again as you’ve seen above you can set initial selection, but the group model itself can be assigned a ‘SelectionIndex’ (but keep in mind it is overridden by selection assigned on the radio elements themselves). Also, much like above the the group can be set up as horizontal button set:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:94eb7ff5-96ed-4a69-ae91-32080ac0867f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@(&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt; Html.InfragisticsMobile()&lt;/li&gt; &lt;li&gt;    .RadioButtonGroup()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .ID(&lt;span style="color:#a31515;"&gt;&amp;quot;ageRange&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    .SelectedIndex(1)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .Items(item =&amp;gt;&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        item.RadioButton().ID(&lt;span style="color:#a31515;"&gt;&amp;quot;grp1&amp;quot;&lt;/span&gt;).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;18-25&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        item.RadioButton().ID(&lt;span style="color:#a31515;"&gt;&amp;quot;grp2&amp;quot;&lt;/span&gt;).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;26-35&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        item.RadioButton().ID(&lt;span style="color:#a31515;"&gt;&amp;quot;grp3&amp;quot;&lt;/span&gt;).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;36-45&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        item.RadioButton().ID(&lt;span style="color:#a31515;"&gt;&amp;quot;grp4&amp;quot;&lt;/span&gt;).Text(&lt;span style="color:#a31515;"&gt;&amp;quot;45+&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    })&lt;/li&gt; &lt;li&gt;    .Render()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffff00;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;&lt;img title="A radio button group in Windows phone theme (light)" alt="A radio button group in Windows phone theme (light)" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-radiobutton-group.png" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img title="A horizontal version of the radio button group in iOS theme" alt="A horizontal version of the radio button group in iOS theme" src="http://media.infragistics.com/community/Release/12.2/jQuery/Mobile/igniteui-mobile-radiobutton-group-horizontal.png" /&gt;&lt;/p&gt; &lt;h1 id="form-elemnt-support" name="form-elemnt-support"&gt;As form elements&lt;/h1&gt; &lt;p&gt;Since in this article the main focus is on input elements, I feel it’s important to explain a bit how they work in the context of HTML forms. Usually you will be working with all familiar elements, however as mentioned above some controls provide the ability to use native ones – what does it mean? Well, even though there are probably default UI elements available, in jQuery mobile standard elements are primarily built out of spans. This ensures no browser enforces its own default UI or behavior and therefore cross-browser compatibility. This applies to things such as buttons, checkboxes, radio elements and so on. However, in the interest of remaining with a functional application when jQuery mobile is not supported (simple HTML mode, no JavaScript - although I have no idea where you&amp;#39;d find that except for those that turn it off on purpose), buttons (and other inputs) intended to perform the default browser submit functionality will be created as styled standard input of type submit.&lt;/p&gt; &lt;p&gt;Also a very important part is that the &lt;strong&gt;IgniteUI ASP.NET MVC wrappers will create the proper markup&lt;/strong&gt; (such as intended to be used with jQuery mobile) that would create native browser elements and assign them the proper ‘id’ or ‘name’. Those contain the actual values and are the ones picked by the browser on submits. However, when jQuery mobile is functional they will remain hidden, while the user interacts with the enhanced mobile controls. That also means in case something goes wrong the application will have this whole set of active controls and will perform as expected, but with reduced usability. Again this is something you won’t have to worry about, but it’s good to know.&lt;/p&gt; &lt;h1 id="stay-tuned" name="stay-tuned"&gt;&lt;font style="font-size:24pt;"&gt;TL;DR | Summary&lt;/font&gt;&lt;/h1&gt; &lt;p name="stay-tuned"&gt;We’ve looked into mobile controls that assist with user input and help you create immersive mobile experiences that implement cross-browser and cross-platform responsive design and go beyond – while optimized for touch and mobile, jQuery mobile applications actually look and work beautifully on desktop browsers! There’s a very &lt;a title="jQuery Mobile 1.2.0 Supported Platforms" href="http://jquerymobile.com/gbs/" target="_blank"&gt;extensive list of supported platforms&lt;/a&gt; and let’s just say the A-grade list is impressive.&lt;/p&gt; &lt;p name="stay-tuned"&gt;But there’s more – the IgniteUI mobile toolset will also provide you with a number of wrappers around layout elements to help you build your application that much easier in a familiar way and environment. So stay tuned for the upcoming blog demonstrating those, demos and more! In the meantime you can always try it for yourself:&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;em&gt;And as always, you can follow us on Twitter &lt;/em&gt;&lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;! &lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=380171" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Razor/default.aspx">Razor</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CSS3/default.aspx">CSS3</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CDN/default.aspx">CDN</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Themes/default.aspx">Themes</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jqm/default.aspx">jqm</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery+Mobile/default.aspx">jQuery Mobile</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/mobile/default.aspx">mobile</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Touch/default.aspx">Touch</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/iPad/default.aspx">iPad</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/iPhone/default.aspx">iPhone</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/iOS/default.aspx">iOS</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Checkbox/default.aspx">Checkbox</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/checkbox+group/default.aspx">checkbox group</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/select+menu/default.aspx">select menu</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/toggle+switch/default.aspx">toggle switch</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/intelliSense/default.aspx">intelliSense</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/radiobutton+group/default.aspx">radiobutton group</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Windows+Phone+theme/default.aspx">Windows Phone theme</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Android+theme/default.aspx">Android theme</category></item><item><title>Get JavaScript code generated for you with the IgniteUI control configurator</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/30/get-javascript-code-generated-for-you-with-the-igniteui-control-configurator.aspx</link><pubDate>Tue, 30 Oct 2012 20:33:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:379412</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=379412</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/30/get-javascript-code-generated-for-you-with-the-igniteui-control-configurator.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;float:left;" title=" Configurator for IgniteUI jQuery controls" alt=" Configurator for IgniteUI jQuery controls" align="left" src="http://media.infragistics.com/community/jquery/media/Configurator/IgniteUI-Configurator.png" /&gt;Not so long ago when &lt;a title="Ignite UI: The World&amp;rsquo;s Most Advanced JavaScript &amp;amp; HTML5 UI Framework" href="http://www.infragistics.com/community/blogs/jason_beres/archive/2012/10/12/ignite-ui-the-world-s-most-advanced-javascript-amp-html5-ui-framework.aspx" target="_blank"&gt;Jason announced IgniteUI and a plethora of other goodness&lt;/a&gt; he mentioned a tool called Configurator that would help you code (or not code really) widgets included in the suite. As as he put it, for all of you server-side developers with desire to fire up your pages with some HTML5 and jQuery that sounds fantastic!&lt;/p&gt; &lt;p&gt;“Configurator for IgniteUI jQuery widgets?&amp;nbsp; Where?&amp;nbsp; Why is it not in my install folder/IDE?”&lt;/p&gt; &lt;p&gt;So yeah, there’s that. It’s not something you’d find in the installation of IgniteUI. It’s a live tool actually and there’s actually a link for that in the post in case you missed it. &lt;/p&gt; &lt;p&gt;You could always follow the direct link to the Configurator which is &lt;a title="IgniteUI jQuery widget configurator" href="http://labs.infragistics.com/jquery/configure/"&gt;http://labs.infragistics.com/jquery/configure/&lt;/a&gt;, but it’s not all too confortable and far from enough don’t you think? Well we agree and we are moving forward with the Configurator making it easily accessible from the &lt;a title="Ignite UI: The World&amp;rsquo;s Most Advanced JavaScript &amp;amp; HTML5 UI Framework" href="http://www.infragistics.com/products/jquery/"&gt;IgniteUI home page&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.infragistics.com/products/jquery/"&gt;&lt;img title="Location of the configurator tool on the IgniteUI homepage" alt="Location of the configurator tool on the IgniteUI homepage" src="http://media.infragistics.com/community/jquery/media/Configurator/IgniteUI-Configurator-location.png" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;There you go, now you know where you can find it when you feel like some fiddling.&lt;/p&gt; &lt;p&gt;Note: This is in a early stage (hence the big ‘BETA’ stamp on it). While we welcome you to give it a try, you shouldn’t expect correct behavior in all cases.&lt;/p&gt; &lt;h1 id="goal" name="goal"&gt;The Goal&lt;/h1&gt; &lt;p&gt;Speaking of&amp;nbsp; fiddling the experience does remind me a bit of a reverse JFiddle – where you start from the results you want to see and get the code as a result. And that’s exactly what this tool is all about - it’s all “Developers, developers, developers!” deal with this one. And if you are like me and you love to learn by example and in our line of work that is by code. Then getting a ‘default settings’ code with very little knowledge of the IgniteUI controls – sure we want that. Also improve the learning curve of the controls? Why yes please! Experienced developers could instead use it instead to grab a quick piece of code to begin molding to their needs? Sure! There are a whole bunch of ideas behind such a tool that are just awesome. And you can say that yes we have samples (which I might add are quite awesome!) but they can’t cover all the events a control has as it would just not make sense in a real case. Also there are sometimes more properties that can be stuffed in there as well. And yes we do have rich API reference that lists all options and events, but hey what if you could see what they do instantly? What if the demo-ing control could also be modeled to your specification and data model? Well that’s the goal! To let you access and customize controls in a familiar fashion and with boosted speed and ease.&lt;/p&gt; &lt;h1 id="introduction-configuration-studio" name="introduction-configuration-studio"&gt;The Configuration ‘studio’ &lt;/h1&gt; &lt;p&gt;It’s kind of weird to have a getting started guide for a tool that is partly here to help with get star.. you get the point! Well ‘Introduction’ then. Firstly, you don’t really need to worry about resources and stuff, just follow the link and tweak/fiddle! Once there you will see the ‘studio’ has three main areas –&lt;strong&gt; toolbox with IgniteUI controls, live workspace and Visual Studio style properties and events tabs&lt;/strong&gt; ( nice touch with familiar experience there):&lt;/p&gt; &lt;p&gt;&lt;img title="IgniteUI configurator tool layout" alt="IgniteUI configurator tool layout" src="http://media.infragistics.com/community/jquery/media/Configurator/IgniteUI-Configurator-layout.png" /&gt;&lt;/p&gt; &lt;p&gt;Furthermore, on the matter of properties – the configurator is aware what are the default options for the controls so when met they will be omitted to produce clearer code. Let me give an example – as with the editor above you can set the vote count to 6 or 7 and that will reflect in the code, however when you enter back 5 the property won’t be in the source anymore as that is the default option to begin with. And once you are happy with the result you can hit “Source” and grab the corresponding code:&lt;/p&gt; &lt;p&gt;&lt;img title="IgniteUI configurator generated jQuery / JavaScript code for the igRating" alt="IgniteUI configurator generated jQuery / JavaScript code for the igRating" src="http://media.infragistics.com/community/jquery/media/Configurator/IgniteUI-Configurator-source.png" /&gt;&lt;/p&gt; &lt;p&gt;Note: While the code field is editable as I said this is like a reverse fiddle – the source is generated from the design rather than the other way around and changes made in code will just be lost once you switch to design. This is somewhat of a limitation regarding events as you can see – you get a handler function prepared for you, but since the tool can’t anticipate what it should do it is empty.&lt;/p&gt; &lt;h1 id="configuring-grid" name="configuring-grid"&gt;So we heard you like Grids…&lt;/h1&gt; &lt;p&gt;So while the Configurator has a lot of catching up to do, but there has been a special focus on our powerful and feature rich jQuery Grids! And by feature rich in this case read “a plethora of settings to customize each” – I don’t even know if there is a golden middle between ease of use and freedom for the developer, I guess IgniteUI grid features being separate widgets helps some, but it does sometimes make it hard to find what you are looking for. For that reason the grids are sometimes difficult to configure and this is where this tool shines. Currently it does have some quirks still so I’ll attempt to guide you. Once you have picked a control you get it in a ‘sample’ version with some dummy data..that unfortunately isn’t being pre-populated in the options to the side. So if you want to get some customizations rolling, first make sure you have your data set. Simple walkthrough with a grid:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Start by setting the data source type and response key&lt;/strong&gt; (if any, as with lack of scheme it is used to parse the data) before you paste actual data because for now the workspace is not equipped with a reset button and the grid will error out attempting to parse the data:&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;img title="Data related options for the IgniteUI jQuery Grid" alt="Data related options for the IgniteUI jQuery Grid" src="http://media.infragistics.com/community/jquery/media/Configurator/IgniteUI-Configurator-data-setup.png" /&gt;&lt;/p&gt; &lt;p&gt;Also for advanced features it’s best to also set the primary key. After that you can paste your data in the data source field. Here’s mine and you can reuse or just provide your own:&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:53fbe82b-dc3a-4378-aa72-f514d3812aac" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#800000;"&gt;&amp;quot;Records&amp;quot;&lt;/span&gt; : [{&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt; : 2,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt; : 20,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt; : 1,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;test&amp;quot;&lt;/span&gt; : 1&lt;/li&gt; &lt;li&gt;        }, {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt; : 3,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt; : 21,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt; : 2,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;test&amp;quot;&lt;/span&gt; : 2&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt; : 5,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt; : 22,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt; : 5,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;test&amp;quot;&lt;/span&gt; : 3&lt;/li&gt; &lt;li&gt;        }, {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt; : 6,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt; : 23,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt; : 6,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;test&amp;quot;&lt;/span&gt; : 4&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt; : 14,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt; : 21,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt; : 3,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;test&amp;quot;&lt;/span&gt; : 5&lt;/li&gt; &lt;li&gt;        }, {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt; : 15,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt; : 22,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt; : 4,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;test&amp;quot;&lt;/span&gt; : 6&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;li&gt;    ]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;The grid is auto-generating columns&amp;nbsp; by default and once the source field loses focus the grid should appear. &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Tweak options. Keep in mind field blurs cause the demo grid to reload with the new settings and produce errors if vital ones are missing/incorrect. &lt;strong&gt;Also enable and configure grid features! &lt;/strong&gt;In the properties tab there’s a features option with an edit button that takes you to a view with all available features that can be enabled:&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;img title="IgniteUI Grid features available for use with one click in the configurator" alt="IgniteUI Grid features available for use with one click in the configurator" src="http://media.infragistics.com/community/jquery/media/Configurator/IgniteUI-Configurator-grid-features.png" /&gt;&lt;/p&gt; &lt;p&gt;And as you can see each feature has its own ‘Edit’ button that takes you the respective feature widget options where you can toggle and set even more options and at any point you can hit the source and grab the generated code.&lt;/p&gt; &lt;p&gt;Note: What I explained for the grid with dummy data and the need to provide your own is true for all data bound controls at the moment. So, for example, a Pie Chart would require you to set data type, along with Value and Label member paths and paste something like the following JSON:&lt;/p&gt; &lt;p&gt;[{&amp;quot;Budget&amp;quot;:60,&amp;quot;Label&amp;quot;:&amp;quot;Administration&amp;quot;},{&amp;quot;Budget&amp;quot;:40,&amp;quot;Label&amp;quot;:&amp;quot;Sales&amp;quot;},{&amp;quot;Budget&amp;quot;:60,&amp;quot;Label&amp;quot;:&amp;quot;Finance&amp;quot;}]&lt;/p&gt; &lt;p&gt;This is the actual pie chart dummy data by the way :)&lt;/p&gt; &lt;h1 id="limitations-advanced-console" name="limitations-advanced-console"&gt;Just for now&lt;/h1&gt;&lt;strong&gt;&lt;/strong&gt; &lt;p&gt;For those experienced with web development the developer tools console of your favorite browser should feel like natural habitat. For those not so much experienced, well lets say that is while you are making changes something goes wrong for now the way to get at least some in for is by looking at the console. Also while at it you can use it to define global variables and functions to use with the controls – there are no iframe-s going on in the Configurator so you won’t to worry if those will be available.&lt;/p&gt; &lt;h1 id="future" name="future"&gt;Looking ahead&lt;/h1&gt; &lt;p&gt;It seems this is quite often the case – the simpler a tool is supposed to make your like, the harder it would be for someone else to create it. It’s really a lot of work to make this perform flawlessly and then even more so to pack it up with amazing features. So as I mentioned before it is in beta stage and right now is the ideal moment for your voice to be heard. &lt;/p&gt; &lt;p&gt;For the future of the tool we’d like to let you add multiple controls to the workspace and also provide generation for ASP.NET MVC code. There are also a number of functionality enhancements and fixes and until then if you get stuck.. refresh away :)&lt;/p&gt; &lt;p&gt;We would appreciate feedback on what you think about the tool, what would like to see in the future and how would you like to use such a tool. &lt;em&gt;&lt;/em&gt;&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;em&gt;As always, you can follow us on Twitter &lt;/em&gt;&lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;! &lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=379412" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CDN/default.aspx">CDN</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igVideoPlayer/default.aspx">igVideoPlayer</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Chart/default.aspx">Chart</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igGrid/default.aspx">igGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Hierarchical+Grid/default.aspx">Hierarchical Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Hierarchical/default.aspx">Hierarchical</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igHierarchicalGrid/default.aspx">igHierarchicalGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igTree/default.aspx">igTree</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Source/default.aspx">Source</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igRating/default.aspx">igRating</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/rating/default.aspx">rating</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI+Grid/default.aspx">Ignite UI Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Configure/default.aspx">Configure</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Pie+Chart/default.aspx">Pie Chart</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Workspace/default.aspx">Workspace</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Properties/default.aspx">Properties</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Events/default.aspx">Events</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/configurator/default.aspx">configurator</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Beta/default.aspx">Beta</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Toolbox/default.aspx">Toolbox</category></item><item><title>IgniteUI jQuery Grid Unbound Columns: Updating and Hierarchy</title><link>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/26/igniteui-jquery-grid-unbound-columns-updating-and-hierarchy.aspx</link><pubDate>Fri, 26 Oct 2012 23:01:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:379000</guid><dc:creator>[Infragistics] Damyan Petev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.infragistics.com/community/blogs/damyan_petev/rsscomments.aspx?PostID=379000</wfw:commentRss><comments>http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/26/igniteui-jquery-grid-unbound-columns-updating-and-hierarchy.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/4810.igniteui_2D00_jquery_2D00_grid_2D00_unbound_2D00_columns_2D00_updating_2D00_hierarchy_5F00_095E0559.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;float:left;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="igniteui-jquery-grid-unbound-columns-updating-hierarchy" border="0" alt="igniteui-jquery-grid-unbound-columns-updating-hierarchy" align="left" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/3733.igniteui_2D00_jquery_2D00_grid_2D00_unbound_2D00_columns_2D00_updating_2D00_hierarchy_5F00_thumb_5F00_3606BF32.png" width="250" height="250" /&gt;&lt;/a&gt;Unbound Columns bring you the freedom of flexible layouts in the IgniteUI Grid and neat support for features to make your grid behave like nothing’s that different.&amp;nbsp; After you’ve seen some of the capabilities (&lt;a title="How to get started with jQuery Grid Unbound Columns" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/how-to-get-started-with-jquery-grid-unbound-columns.aspx" target="_blank"&gt;getting started blog&lt;/a&gt;) and inner workings(&lt;a title="jQuery Grid Unbound Column: How to make the most of it" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/jquery-grid-unbound-column-how-to-make-the-most-of-it.aspx" target="_blank"&gt;configure and make the most of it&lt;/a&gt;) it’s only natural to tackle some not too basic cases. We’ll throw in some editing action – in all fairness, something very basic as far as the user or desired end-result are concerned, however nothing simple in the eyes of the developer. Following that some curious scenarios when using the Hierarchical Grid with unbound columns. So let’s jump right on topic.&lt;/p&gt; &lt;h1 id="updating" name="updating"&gt;To Save or not to Save&lt;/h1&gt; &lt;h3 id="deserialization" name="deserialization"&gt;Custom Deserialization&lt;/h3&gt; &lt;p&gt;Adding &lt;a title="Ignite UI&amp;trade; Online Help - igGrid Updating" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igGrid_Updating_LandingPage.html" target="_blank"&gt;Updating&lt;/a&gt; should be fairly straight-forward, but there’s a catch.. or rather a few. One thing you are extremely likely to face is handling updates to the server. The grid will behave as expected and kindly include unbound values in the transactions. For that reason, as we already mentioned. the client-side model that includes Unbound columns would not match the one the grid was bound to on the server. That means direct deserialization using the standard .NET serializators won&amp;#39;t go very well(more like at all) and the same goes for using the &lt;a title="Ignite UI&amp;trade; Online Help - MVC API" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=Infragistics.Web.Mvc~Infragistics.Web.Mvc.GridModel~LoadTransactions.html" target="_blank"&gt;Grid model&amp;#39;s LoadTransactions method&lt;/a&gt;(which is the same thing really). The most reasonable way to go about this is custom deserialization. Don’t let that fool you – it’s actually very easy with something like &lt;a title="Json.NET is a popular high-performance JSON framework for .NET" href="http://json.codeplex.com/" target="_blank"&gt;Json.NET&lt;/a&gt;. Plus, it even comes pre-packed with some (all?) new MVC4 templates anyway. It’s fast and, as far as my experience goes, it handles missing or extra values easily. Let’s have the following Grid configuration with AdventureWorks (&lt;a title="AdventureWorks Sample Databases (MSDN)" href="http://msdn.microsoft.com/en-us/library/ms124501(v=sql.100).aspx" target="_blank"&gt;&lt;img title="AdventureWorks Sample Databases (MSDN)" alt="AdventureWorks Sample Databases (MSDN)" src="http://users.infragistics.com/dpetev/external_link.PNG" /&gt;&lt;/a&gt;) Employees similar to so far used examples:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:51c053a8-918b-4ee4-855b-94ede26b6308" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;$(&lt;span style="color:#800000;"&gt;&amp;#39;#grid&amp;#39;&lt;/span&gt;).igGrid({&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    updateUrl : &lt;span style="color:#800000;"&gt;&amp;#39;/Home/UpdateUrl&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;    localSchemaTransform : &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    autoGenerateColumns : &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;    autoGenerateLayouts : &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;,        &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    primaryKey: &lt;span style="color:#800000;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;    columns : [{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            key : &lt;span style="color:#800000;"&gt;&amp;#39;BusinessEntityID&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            dataType : &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            headerText : &lt;span style="color:#800000;"&gt;&amp;#39;B.E. Id&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        }, {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            unbound : &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            key : &lt;span style="color:#800000;"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            headerText : &lt;span style="color:#800000;"&gt;&amp;#39;Name&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            dataType : &lt;span style="color:#800000;"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            key : &lt;span style="color:#800000;"&gt;&amp;#39;LoginID&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            dataType : &lt;span style="color:#800000;"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            headerText : &lt;span style="color:#800000;"&gt;&amp;#39;Login Id&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            key : &lt;span style="color:#800000;"&gt;&amp;#39;SickLeaveHours&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            dataType : &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            headerText : &lt;span style="color:#800000;"&gt;&amp;#39;Sick Leave Hours&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            key : &lt;span style="color:#800000;"&gt;&amp;#39;VacationHours&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            dataType : &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            headerText : &lt;span style="color:#800000;"&gt;&amp;#39;Vacation Hours&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            unbound : &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            key : &lt;span style="color:#800000;"&gt;&amp;#39;total&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            headerText : &lt;span style="color:#800000;"&gt;&amp;#39;Total&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            dataType : &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            formula : calcTotal,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            template : &lt;span style="color:#800000;"&gt;&amp;#39;&amp;lt;span {{if parseInt(${total})/100 &amp;gt; 1 }} class=&amp;#92;&amp;#39;red&amp;#92;&amp;#39; {{/if}}&amp;gt; ${total} / 100 &amp;lt;/span&amp;gt;&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    ],&lt;/li&gt; &lt;li&gt;    features : [{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            name : &lt;span style="color:#800000;"&gt;&amp;#39;Updating&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            enableAddRow : &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            columnSettings : [{&lt;/li&gt; &lt;li&gt;                    columnKey : &lt;span style="color:#800000;"&gt;&amp;#39;total&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    readOnly : &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                }, {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    columnKey : &lt;span style="color:#800000;"&gt;&amp;#39;BusinessEntityID&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                    readOnly : &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                }]&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    ],&lt;/li&gt; &lt;li&gt;    height : &lt;span style="color:#800000;"&gt;&amp;#39;600px&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    dataSource : &lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffff00;color:#800000;"&gt;@&lt;/span&gt;Url.Action(&lt;span style="color:#a31515;"&gt;&amp;quot;HrcEmployees&amp;quot;&lt;/span&gt;)&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;    rendered: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; (evt, ui){&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        ui.owner.setUnboundValues(peopleNames , &lt;span style="color:#800000;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;});&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Or the equivalent in ASP.NET MVC using the helper with chaining:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:61f81bb5-9916-432e-a918-7331254b2c3d" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@(&lt;/span&gt;Html.Infragistics().Grid(Model).AutoGenerateColumns(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;).AutoGenerateLayouts(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .PrimaryKey(&lt;span style="color:#a31515;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    .Columns(column =&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        column.For(x =&amp;gt; x.BusinessEntityID).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;B.E. Id&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        column.Unbound(&lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        column.For(x =&amp;gt; x.LoginID).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Login Id&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        column.For(x =&amp;gt; x.SickLeaveHours).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Sick Leave Hours&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        column.For(x =&amp;gt; x.VacationHours).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Vacation Hours&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        column.Unbound(&lt;span style="color:#a31515;"&gt;&amp;quot;total&amp;quot;&lt;/span&gt;).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Total&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;            .Formula(&lt;span style="color:#a31515;"&gt;&amp;quot;calcTotal&amp;quot;&lt;/span&gt;).Template(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;span {{if parseInt(${total})/100 &amp;gt; 1 }} class=&amp;#39;red&amp;#39; {{/if}}&amp;gt; ${total} / 100 &amp;lt;/span&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    })&lt;/li&gt; &lt;li&gt;    .Height(&lt;span style="color:#a31515;"&gt;&amp;quot;600px&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .Features(feature =&amp;gt; &lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            feature.Updating().EnableAddRow(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;).ColumnSettings(colSetting =&amp;gt;&lt;/li&gt; &lt;li&gt;            {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                colSetting.ColumnSetting().ColumnKey(&lt;span style="color:#a31515;"&gt;&amp;quot;total&amp;quot;&lt;/span&gt;).ReadOnly(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;                colSetting.ColumnSetting().ColumnKey(&lt;span style="color:#a31515;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt;).ReadOnly(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            }).EditMode(&lt;span style="color:#2b91af;"&gt;GridEditMode&lt;/span&gt;.Row);&lt;/li&gt; &lt;li&gt;        })&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .UpdateUrl(Url.Action(&lt;span style="color:#a31515;"&gt;&amp;quot;UpdateUrl&amp;quot;&lt;/span&gt;))&lt;/li&gt; &lt;li&gt;    .SetUnboundValues(&lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;, (ViewBag.people &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;).Cast&amp;lt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt;().ToList())&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .DataBind()&lt;/li&gt; &lt;li&gt;    .Render()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffff00;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;As you can see the ID is not editable for obvious reasons and so is the formula field. What you would get from the grid as a transaction would contain all of the above properties. One approach would be to take advantage of the flexibility of Json.Net and go about it as you normally would:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:74805add-9aa7-4a2b-9eb1-caf4d694e216" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; transactions = &lt;span style="color:#2b91af;"&gt;JsonConvert&lt;/span&gt;.DeserializeObject&amp;lt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Transaction&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;EmployeeDTO&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt;(Request.Form[&lt;span style="color:#a31515;"&gt;&amp;quot;ig_transactions&amp;quot;&lt;/span&gt;]);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Form there on it is identical to what you can find in the &lt;a title="Ignite UI&amp;trade; Online Help : igGrid Updating" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igGrid_Updating.html" target="_blank"&gt;documentation on Batch Updating&lt;/a&gt;. Another take would be to go for LINQ to JSON instead and deserialize to JObject:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7b1c9936-2911-4a73-8219-6b7c145b3208" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; transactions = &lt;span style="color:#2b91af;"&gt;JsonConvert&lt;/span&gt;.DeserializeObject&amp;lt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Transaction&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;JObject&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt;(Request.Form[&lt;span style="color:#a31515;"&gt;&amp;quot;ig_transactions&amp;quot;&lt;/span&gt;]);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;An advantage you get is that if you like me don’t have the whole model displayed in the grid and therefore the transactions don’t contain quite the whole records and assigning it blindly will just put nulls in the ones I’m missing. Besides picking separate properties from the record this approach is also the easiest way to access unbound values if you need them:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cf69ac62-ac1f-429b-a141-39c74f7cb5e0" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#2b91af;"&gt;AdventureWorksEntities&lt;/span&gt; context = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AdventureWorksEntities&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Transaction&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;JObject&lt;/span&gt;&amp;gt; transaction &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; transactions)&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; id = (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)transaction.row[&lt;span style="color:#a31515;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt;];&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#008000;"&gt;// take id in advance as accessing it is not a canonical method and then find the data records &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; employee = context.Employees.Where(x =&amp;gt; x.BusinessEntityID == id).Single();&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; person = context.People.Where(x =&amp;gt; x.BusinessEntityID == id).Single();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (transaction.type == &lt;span style="color:#a31515;"&gt;&amp;quot;row&amp;quot;&lt;/span&gt;) &lt;span style="color:#008000;"&gt;//edit!&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        employee.VacationHours = (&lt;span style="color:#0000ff;"&gt;short&lt;/span&gt;)transaction.row[&lt;span style="color:#a31515;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt;];&lt;/li&gt; &lt;li&gt;        employee.SickLeaveHours = (&lt;span style="color:#0000ff;"&gt;short&lt;/span&gt;)transaction.row[&lt;span style="color:#a31515;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt;];&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        employee.LoginID = (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;)transaction.row[&lt;span style="color:#a31515;"&gt;&amp;quot;LoginID&amp;quot;&lt;/span&gt;];&lt;/li&gt; &lt;li&gt;        person.FirstName = transaction.row[&lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;].ToString().Split(&lt;span style="color:#a31515;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;).First();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        person.LastName = transaction.row[&lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;].ToString().Split(&lt;span style="color:#a31515;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;).Last();&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (transaction.type == &lt;span style="color:#a31515;"&gt;&amp;quot;delete&amp;quot;&lt;/span&gt;) &lt;span style="color:#008000;"&gt;//delete!&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        context.Employees.DeleteObject(employee);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;context.SaveChanges();&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;h3 id="set-unbound-value-transaction" name="set-unbound-value-transaction"&gt;“My Unbound values don’t reach the server”&lt;/h3&gt; &lt;p&gt;So you use the client-side ‘setUnboundValues()’ method like you are supposed to and attempt to save the changes with the method above but they never appear to persist. What gives? Well, for starters “you are supposed to” in the last sentence is truly wrong – the method does set values but since it’s designed to work without updating on the grid, the changes it makes are “client-side only” type and are completely unrelated with Updating and transactions. That means that you are setting a value but it is never sent to the server or persisted in other way. So to achieve the desired result you should turn to the &lt;a title="IgniteUI API reference - Grid Updating" href="http://help.infragistics.com/jQuery/2012.2/ui.iggridupdating#methods" target="_blank"&gt;Updating API&lt;/a&gt; instead and &lt;strong&gt;use either ‘setCellValue’ or ‘updateRow’&lt;/strong&gt;. Yes, they work work with Unbound columns! Frankly, the methods have very subtle differences with&amp;nbsp; the main one being the type of transaction they generate and I usually pick the one that matches the edit mode:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a463e45c-e914-4973-9027-6611fe7269bf" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;button&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;onclick&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;$(&amp;#39;#grid&amp;#39;).data(&amp;#39;igGridUpdating&amp;#39;).setCellValue(2, &amp;#39;name&amp;#39;, &amp;#39;John Doe&amp;#39;)&amp;quot;&amp;gt;&lt;/span&gt; Update names [cell]&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;button&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;button&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;onclick&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;$(&amp;#39;#grid&amp;#39;).data(&amp;#39;igGridUpdating&amp;#39;).updateRow(2, { name : &amp;#39;John Doe&amp;#39;})&amp;quot;&amp;gt;&lt;/span&gt; Update names [row]&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;button&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;There basically produce the same result with different type of transaction. In the demo and the JFiddle versions linked below I’ve put up a simple demonstration of this with a log you can use to list the current transactions on the grid in order to see that there are indeed none after a ‘setUnboundValues()’ call but the Updating methods behave as expected.&lt;/p&gt; &lt;h3 id="formula" name="formula"&gt;Formula Trouble&lt;/h3&gt; &lt;p&gt;So you save&amp;nbsp; your changes and everything obviously goes well with the server, but ..&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/2744.igniteui_2D00_jquery_2D00_grid_2D00_unbound_2D00_columns_2D00_updating_2D00_formula_5F00_3C4D95C0.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="igniteui-jquery-grid-unbound-columns-updating-formula" border="0" alt="igniteui-jquery-grid-unbound-columns-updating-formula" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/3821.igniteui_2D00_jquery_2D00_grid_2D00_unbound_2D00_columns_2D00_updating_2D00_formula_5F00_thumb_5F00_6DD90355.png" width="472" height="126" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Find something wrong? This is a row in which I’ve edited the Vacation hours value, however the total value calculated from a formula stays the same and moreover, it’s the same after the actual submit of transaction to the server passes too. Because of the type of functionality formula property – it is neither a template nor a formatting function, it’s supposed to provide the initial value. Therefore, it’s called on binding and from there on the grid has data to work with as if it is part of the data source and formula is no longer needed. But hey, I want my value correct and I don’t feel like reloading the page for sure. So how do you get this to work? Consider this, the &lt;a title="IgniteUI jQuery API reference" href="http://help.infragistics.com/jQuery/2012.2/ui.iggrid#methods" target="_blank"&gt;save changes method&lt;/a&gt; does not offer a callback and in case you are wondering neither does the original in the igDataSource. But it does say AJAX and it should have a callback, right? And it does, lets just say it’s well hidden. It’s called a success handler and the grid maintains an array of them to call when it handles the AJAX success (only!). Also the problem is I want to refresh my view in order to update the formula calculations. However, simply calling ‘dataBind()’ on the data source won’t do in my case as I have additional unbound values(the names) that are still the same and they won’t update until a refresh of the page. Plus, it&amp;#39;s a lot of overhead I don&amp;#39;t really need(goodness forbid using the grid&amp;#39;s data bind method that does a whole lot more work even). Thankfully you have grid operations that cause a re-bind such as paging and sorting without messing with the actual data in the source. What if we could use that? Well we can! A slight hack if you will would be to trick the grid into changing page without actually changing it which would essentially be a page re-fresh. This can be done using the ‘&lt;a title="IgniteUI jQuery API reference for the igDataSOurce methods" href="http://help.infragistics.com/jQuery/2012.2/ig.datasource#methods" target="_blank"&gt;pageIndex()&lt;/a&gt;’ data source method you&amp;#39;d normally use to programmatically change page or get current index:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:460c3b23-6115-49eb-85c8-b581980a0eea" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;$(&lt;span style="color:#800000;"&gt;&amp;quot;#grid&amp;quot;&lt;/span&gt;).live(&lt;span style="color:#800000;"&gt;&amp;quot;iggridrendered&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; (event, ui) {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#006400;"&gt;//rendered event only fired once so add success update handler here&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    ui.owner.dataSource._addChangesSuccessHandler(updateSuccess);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;});&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; updateSuccess(data, textStatus, jqXHR) {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (data.Success === &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt; &amp;amp;&amp;amp; textStatus == &lt;span style="color:#800000;"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;) {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#006400;"&gt;//&amp;#39;re-bind&amp;#39; to force formula calculation with new verified values.&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; gridDS = $(&lt;span style="color:#800000;"&gt;&amp;quot;#grid&amp;quot;&lt;/span&gt;).data(&lt;span style="color:#800000;"&gt;&amp;quot;igGrid&amp;quot;&lt;/span&gt;).dataSource;&lt;/li&gt; &lt;li&gt;        gridDS.pageIndex(gridDS.pageIndex());&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;This registers your own handler that gets the very same parameters as a normal AXAJ callback (and this can be useful in many other scenarios!) and in it we access the grid’s data source now that we know that the save has gone through and do our little refresh inception-style. It’s not perfect, but it kind of works; another very plausible solution would be to just go ahead and set the right value.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Keep in mind that if you use template to display value in unbound column that is built with values from other columns it will update once they change. There’s a demo available for that in both MVC and JFiddle below.&lt;/p&gt; &lt;h1 id="hierarchical-grid-unbound-column" name="hierarchical-grid-unbound-column"&gt;Hierarchical Grid with Unbound Columns&lt;/h1&gt; &lt;p&gt;Now here’s another good one. By design the &lt;a title="Ignite UI&amp;trade; Online Help - igHierarchicalGrid Overview" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=igHierarchicalGrid_Overview.html" target="_blank"&gt;hierarchical grid uses flat igGrids&lt;/a&gt; and for that reason we consider most of the functionality&amp;nbsp; to be shared and used in the same way with the same results. However, there are a few logical, yet important differences to consider when using hierarchy with Unbound Columns.&lt;/p&gt; &lt;h3 id="set-unbound-value-child-layout" name="set-unbound-value-child-layout"&gt;Setting values and child column layouts&lt;/h3&gt; &lt;p&gt;Of course, &lt;a title="Adding data for the unbound columns" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/how-to-get-started-with-jquery-grid-unbound-columns.aspx#unbound-data" target="_blank"&gt;all the methods&lt;/a&gt; to do that are still available, but consider this – you now have not just one grid, but rather a whole bunch of them. Using the ‘unboundValues’ is mostly logical as they are tied to their column definitions. But when you decide to set some unbound values on the client but nothing happens? For reference here’s how the grid definition looks:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:95cc2ae2-3093-4eba-a370-0926cb95656f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;$(&lt;span style="color:#800000;"&gt;&amp;#39;#grid&amp;#39;&lt;/span&gt;).igHierarchicalGrid({&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    dataSource: &lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.Raw(&lt;span style="color:#2b91af;"&gt;Json&lt;/span&gt;.Encode(Model)),&lt;/li&gt; &lt;li&gt;    dataSourceType: &lt;span style="color:#800000;"&gt;&amp;#39;json&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    autoGenerateColumns: &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;    autoGenerateLayouts: &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    columns: [{&lt;/li&gt; &lt;li&gt;        key: &lt;span style="color:#800000;"&gt;&amp;#39;DepartmentID&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        headerText: &lt;span style="color:#800000;"&gt;&amp;#39;DEP Id&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        dataType: &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }, {&lt;/li&gt; &lt;li&gt;        key: &lt;span style="color:#800000;"&gt;&amp;#39;Name&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        headerText: &lt;span style="color:#800000;"&gt;&amp;#39;Name&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        dataType: &lt;span style="color:#800000;"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }, {&lt;/li&gt; &lt;li&gt;        key: &lt;span style="color:#800000;"&gt;&amp;#39;GroupName&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        headerText: &lt;span style="color:#800000;"&gt;&amp;#39;Group Name&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        dataType: &lt;span style="color:#800000;"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }, {&lt;/li&gt; &lt;li&gt;        key: &lt;span style="color:#800000;"&gt;&amp;#39;ModifiedDate&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        headerText: &lt;span style="color:#800000;"&gt;&amp;#39;Modified Date&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        dataType: &lt;span style="color:#800000;"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }, {&lt;/li&gt; &lt;li&gt;        unbound: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        key: &lt;span style="color:#800000;"&gt;&amp;#39;employees&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        headerText: &lt;span style="color:#800000;"&gt;&amp;#39;Employees&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        dataType: &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        unboundValues: [7, 3, 18, 9, 12, 4, 180, 5, 6]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;],&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    columnLayouts: [{&lt;/li&gt; &lt;li&gt;        autoGenerateColumns: &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        autoGenerateLayouts: &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        mergeUnboundColumns: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        columns: [{&lt;/li&gt; &lt;li&gt;            key: &lt;span style="color:#800000;"&gt;&amp;#39;BusinessEntityID&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            headerText: &lt;span style="color:#800000;"&gt;&amp;#39;B.E. Id&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            dataType: &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            key: &lt;span style="color:#800000;"&gt;&amp;#39;DepartmentID&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            headerText: &lt;span style="color:#800000;"&gt;&amp;#39;Dep id&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            dataType: &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            hidden: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        }, {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            unbound: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            key: &lt;span style="color:#800000;"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            headerText: &lt;span style="color:#800000;"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            dataType: &lt;span style="color:#800000;"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            key: &lt;span style="color:#800000;"&gt;&amp;#39;VacationHours&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            headerText: &lt;span style="color:#800000;"&gt;&amp;#39;Vacation Hours&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            dataType: &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            key: &lt;span style="color:#800000;"&gt;&amp;#39;SickLeaveHours&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            headerText: &lt;span style="color:#800000;"&gt;&amp;#39;Sick Leave Hours&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            dataType: &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            unbound: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            key: &lt;span style="color:#800000;"&gt;&amp;#39;counter&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            headerText: &lt;span style="color:#800000;"&gt;&amp;#39;Counter&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            dataType: &lt;span style="color:#800000;"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        ],&lt;/li&gt; &lt;li&gt;        key: &lt;span style="color:#800000;"&gt;&amp;#39;Employees&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        primaryKey: &lt;span style="color:#800000;"&gt;&amp;#39;BusinessEntityID&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        foreignKey: &lt;span style="color:#800000;"&gt;&amp;#39;DepartmentID&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;],&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    height: &lt;span style="color:#800000;"&gt;&amp;#39;500px&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;    autoCommit: &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    primaryKey: &lt;span style="color:#800000;"&gt;&amp;#39;DepartmentID&amp;#39;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;    localSchemaTransform: &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;});&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;&lt;a href="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/2742.igniteui_2D00_jquery_2D00_hierarchical_2D00_grid_2D00_unbound_2D00_columns_5F00_7B3F165B.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="igniteui-jquery-hierarchical-grid-unbound-columns" border="0" alt="igniteui-jquery-hierarchical-grid-unbound-columns" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/8623.igniteui_2D00_jquery_2D00_hierarchical_2D00_grid_2D00_unbound_2D00_columns_5F00_thumb_5F00_6C283781.png" width="650" height="311" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And to sill some of the missing values you attempt calling something like:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:89b8dc01-3f64-4f8f-9ad3-f8722d5e5d1a" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;$(&lt;span style="color:#800000;"&gt;&amp;#39;#grid&amp;#39;&lt;/span&gt;).igHierarchicalGrid(&lt;span style="color:#800000;"&gt;&amp;#39;setUnboundValues&amp;#39;&lt;/span&gt;, [ 52, 522, 368, 42635], &lt;span style="color:#800000;"&gt;&amp;#39;counter&amp;#39;&lt;/span&gt;);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;However nothing happens. If you had attempted the same with say ‘employees’ it would’ve. That is because as we explained there are multiple grids here and &lt;strong&gt;set value methods are to be called for the respective layout.&lt;/strong&gt; So in order to add values to the child layout you need to access it first. The hierarchical grid provides a method to do that:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:eb99331f-741d-45d9-8056-fc7b3c4f77e0" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;$.each($(&lt;span style="color:#800000;"&gt;&amp;#39;#grid&amp;#39;&lt;/span&gt;).data(&lt;span style="color:#800000;"&gt;&amp;#39;igHierarchicalGrid&amp;#39;&lt;/span&gt;).allChildrenWidgets(), &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; (i, grid) {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    grid.setUnboundValues([12.2, 12.2, 12.2, 12.2], &lt;span style="color:#800000;"&gt;&amp;#39;counter&amp;#39;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;});&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;You could pick one, but above I’m targeting all available child grids and setting values and there’s a good reason. To be able to target specific layout you need to be aware it is there – the Hierarchical grid creates the child grids only when expanding for performance reasons, therefore you cannot set values to something that doesn’t exist yet. Furthermore, unless you provide you unbound values in advance ( set them on the column property or merge them on the server) even after calling the above, newly expanded(created) layouts will still be with empty unbound columns. My best advice is to assign even temporary initial values to spare the user the sight of empty columns and/or handle a &lt;a title="IgniteUI API reference - igHierarchicalGrid events" href="http://help.infragistics.com/jQuery/2012.2/ui.ighierarchicalgrid#events" target="_blank"&gt;suitable event such as &amp;#39;childGridCreated&amp;#39;&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;ASP.NET MVC&lt;/p&gt; &lt;p&gt;MVC offers some additional challenges such as the relevant &lt;a title="Merge Unbound Columns property" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/jquery-grid-unbound-column-how-to-make-the-most-of-it.aspx#merge-unbound-columns" target="_blank"&gt;Merge Unbound Columns property&lt;/a&gt; and others. First and foremost let me remind again the SetUnboundValues’s Dictionary method overload is still your best bet to get things going as expected. Also the client-side explanations above still holds true although this time you set values to column layouts of the main grid, but it has to be done for the respective layout.&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:85b6747e-b8fd-42dc-b877-f3c4cb5630e8" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;childLayout.MergeUnboundColumns = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;childLayout.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;UnboundColumn&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    Key = &lt;span style="color:#a31515;"&gt;&amp;quot;counter&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;    HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;Counter&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;    UnboundValues = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt;() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}); &lt;span style="color:#008000;"&gt;//This will not work!&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Using the Unbound values column property which if used in child layout definition will be applied to all layouts by default. However when you enable merging the values inside the column definition are not supported and pretty much ignored. So in their place you get the default null values and empty columns on the client. &lt;/p&gt; &lt;p&gt;Then you have the SetUnboundValues’s List overload that suspiciously looks very much like the property, but you will be surprised when it actually works with merging. But there’s also a catch – since the method’s purpose is to provide all values for for a grid in one go, when used it will still map values to ID’s ..of the first child layout only. This is as far as the grid is willing to do the guessing for you I guess. However if the child layout doesn’t have primary key another default behavior kicks in and those values are applied separately to each child. I’m only explaining all of this as I think in some situations child layouts could be sharing values or just need an example values for one layout and these can turn out just fine.&lt;/p&gt; &lt;p&gt;Once again, assigning with the Dictionary overload applies the required mapping so values will properly be added throughout children&amp;nbsp; based on key matches.&lt;/p&gt; &lt;h3 id="loadOnDemand-MergeUnboundColumn" name="loadOnDemand-MergeUnboundColumn"&gt;Load On Demand and Merge Unbound columns don’t go well…&lt;/h3&gt; &lt;p&gt;These really don’t go well at all! And it’s really not that surprising – LoadOnDemand assures the grid that data for child layouts will be provided later on and merging demands they are present in the data source, so even though you may have Unbound Values set using the property itself and you can see it on the client code it will still be ignored and data for the unbound columns will be required from the data received when creating the child. That mean that you need to send it along with the original grid model and this makes the Unbound Columns redundant or if the source is oData nearly absurd to implement. SO better don’t try this at home. The best part is that if you don’t provide those values and the grid starts looking for them it will end up badly..with exceptions :) This is true for SetUnboundValue methods as well, however this is not hopeless combination of functionality:&lt;/p&gt; &lt;h3 id="getdata-method" name="getdata-method"&gt;GetData() to the rescue&lt;/h3&gt; &lt;p&gt;Of course, this is the &lt;a title="Ignite UI&amp;trade; Online Help - GetData Method" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0?page=Infragistics.Web.Mvc~Infragistics.Web.Mvc.GridModel~GetData.html" target="_blank"&gt;Grid models’ GetData() method&lt;/a&gt; and it’s extremely helpful when using load on demand. In fact, so helpful, that when used to generate responses for the child layouts it will look at your model and properly merge unbound values applied with SetUnboundValue methods again following the default&amp;nbsp; behavior – with list values are added to each generated response essentially added to very layout and with dictionary overload just the matching ones. So this (lines 73/74 in the model show the setting of values with both List and Dictionary):&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f8d273fa-3090-4c6c-af12-5696b15e5bd9" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 3em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;JsonResult&lt;/span&gt; BindChild(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; path, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; layout)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#2b91af;"&gt;GridModel&lt;/span&gt; viewModel = GenerateGridModel();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#2b91af;"&gt;AdventureWorksEntities&lt;/span&gt; context = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AdventureWorksEntities&lt;/span&gt;();&lt;/li&gt; &lt;li&gt;    viewModel.DataSource = context.Employees.ToList().ConvertAll(eh =&amp;gt; eh.ToDTO()).AsQueryable();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; viewModel.GetData(path, layout);&lt;/li&gt; &lt;li&gt;}   &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridModel&lt;/span&gt; GenerateGridModel()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#2b91af;"&gt;GridModel&lt;/span&gt; grid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridModel&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    grid.Height = &lt;span style="color:#a31515;"&gt;&amp;quot;500px&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    grid.AutoCommit = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    grid.PrimaryKey = &lt;span style="color:#a31515;"&gt;&amp;quot;DepartmentID&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;   &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    grid.AutoGenerateColumns = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    grid.AutoGenerateLayouts = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#2b91af;"&gt;GridColumnLayoutModel&lt;/span&gt; childLayout = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridColumnLayoutModel&lt;/span&gt;();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#008000;"&gt;//settings&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    grid.LoadOnDemand = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    childLayout.Key = &lt;span style="color:#a31515;"&gt;&amp;quot;Employees&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    childLayout.PrimaryKey = &lt;span style="color:#a31515;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    childLayout.ForeignKey = &lt;span style="color:#a31515;"&gt;&amp;quot;DepartmentID&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    childLayout.MergeUnboundColumns = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;/li&gt; &lt;li&gt;    childLayout.AutoGenerateColumns = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    childLayout.AutoGenerateLayouts = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/li&gt; &lt;li&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    childLayout.DataSourceUrl = Url.Action(&lt;span style="color:#a31515;"&gt;&amp;quot;BindChild&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    childLayout.Columns = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;GridColumn&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;    childLayout.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridColumn&lt;/span&gt;()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;B.E. Id&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    });&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    childLayout.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridColumn&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;DepartmentID&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;Dep id&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        Hidden = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    });&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    childLayout.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;UnboundColumn&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;    });&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    childLayout.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridColumn&lt;/span&gt;()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;Vacation Hours&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    });&lt;/li&gt; &lt;li&gt;    childLayout.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridColumn&lt;/span&gt;()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;Sick Leave Hours&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    });&lt;/li&gt; &lt;li&gt;    childLayout.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;UnboundColumn&lt;/span&gt;()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;counter&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;Counter&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    });&lt;/li&gt; &lt;li&gt;    childLayout.SetUnboundValues(&lt;span style="color:#a31515;"&gt;&amp;quot;counter&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt;() { 1, 2, 3, 4, 5, 6, 7, 8, 9 });&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    childLayout.SetUnboundValues(&lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;, peopleNames);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    grid.Columns = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;GridColumn&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;    grid.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridColumn&lt;/span&gt;()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;DepartmentID&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;DEP Id&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    });&lt;/li&gt; &lt;li&gt;    grid.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridColumn&lt;/span&gt;()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    });&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    grid.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridColumn&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;GroupName&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;Group Name&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    });&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    grid.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GridColumn&lt;/span&gt;()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;ModifiedDate&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;Modified Date&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    });&lt;/li&gt; &lt;li&gt;    grid.Columns.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;UnboundColumn&lt;/span&gt;()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        Key = &lt;span style="color:#a31515;"&gt;&amp;quot;employees&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        HeaderText = &lt;span style="color:#a31515;"&gt;&amp;quot;Employees&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        DataType = &lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        UnboundValues = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt;() { 7, 3, 18, 9, 12, 4, 180, 5, 6 }&lt;/li&gt; &lt;li&gt;    });&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    grid.ColumnLayouts.Add(childLayout);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; grid;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Will produce the following response to the client:&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cfd8fb5a-3928-4563-867f-2d594b993eb3" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#800000;"&gt;&amp;quot;Records&amp;quot;&lt;/span&gt; : [{&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt; : 11,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;DepartmentID&amp;quot;&lt;/span&gt; : 2,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt; : &lt;span style="color:#800000;"&gt;&amp;quot;Ovidiu Cracium&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt; : 7,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt; : 23,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;counter&amp;quot;&lt;/span&gt; : 1&lt;/li&gt; &lt;li&gt;        }, {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt; : 12,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;DepartmentID&amp;quot;&lt;/span&gt; : 2,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt; : &lt;span style="color:#800000;"&gt;&amp;quot;Thierry D&amp;#92;u0027Hers&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt; : 9,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt; : 24,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;counter&amp;quot;&lt;/span&gt; : 2&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }, {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt; : 13,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;DepartmentID&amp;quot;&lt;/span&gt; : 2,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt; : &lt;span style="color:#800000;"&gt;&amp;quot;Janice Galvin&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;VacationHours&amp;quot;&lt;/span&gt; : 8,&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;SickLeaveHours&amp;quot;&lt;/span&gt; : 24,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#800000;"&gt;&amp;quot;counter&amp;quot;&lt;/span&gt; : 3&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    ],&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#800000;"&gt;&amp;quot;TotalRecordsCount&amp;quot;&lt;/span&gt; : 0,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#800000;"&gt;&amp;quot;Metadata&amp;quot;&lt;/span&gt; : {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#800000;"&gt;&amp;quot;timezoneOffset&amp;quot;&lt;/span&gt; : 10800000&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Even when merging is not in use, this method will be kind enough to include the said values as metadata instead and achieve the same results. One thing to note is that the method does require the presence of primary and foreign key in the child layout in order to perform proper mapping, which if not needed can be hidden but still must be present. Despite that,&amp;nbsp; using the Grid model with Load On demand is the best way to have child data generated properly and it allows Unbound Columns to be merged along with all else!&lt;/p&gt; &lt;h3 id="using-unbound-values-in-templates" name="using-unbound-values-in-templates"&gt;Bonus scene (formula + template)&lt;/h3&gt; &lt;p&gt;Or more like bonus scenario. Since unbound columns are not even tied with values what happens if as above and examples before you got that Unbound Column with both formula to calculate total &lt;strong&gt;and &lt;/strong&gt;template. Now that template uses a static value for the max…how about we add yet another column for that, provide some values and use that instead in the template?&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7c736013-bdf4-469d-aec4-f63fface0f27" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:200px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@(&lt;/span&gt;Html.Infragistics().Grid(Model).AutoGenerateColumns(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;).AutoGenerateLayouts(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;).LocalSchemaTransform(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .ColumnLayouts(layout =&amp;gt; layout.For(x =&amp;gt; x.Employees).AutoGenerateColumns(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;).Columns(column =&amp;gt;&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            column.For(x =&amp;gt; x.BusinessEntityID).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;B.E. Id&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;            column.For(x =&amp;gt; x.SickLeaveHours).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Sick Leave Hours&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            column.For(x =&amp;gt; x.VacationHours).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Vacation Hours&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;            column.Unbound(&lt;span style="color:#a31515;"&gt;&amp;quot;total&amp;quot;&lt;/span&gt;).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Total / Max&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;).Formula(&lt;span style="color:#a31515;"&gt;&amp;quot;calcTotal&amp;quot;&lt;/span&gt;).Template(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;span {{if ${total}/parseInt(${max}) &amp;gt; 1 }} class=&amp;#39;red&amp;#39; {{/if}}&amp;gt; ${total} / ${max} &amp;lt;/span&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            column.Unbound(&lt;span style="color:#a31515;"&gt;&amp;quot;max&amp;quot;&lt;/span&gt;).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Max&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;).Hidden(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        })&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        .LocalSchemaTransform(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;        .SetUnboundValues(&lt;span style="color:#a31515;"&gt;&amp;quot;max&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt;() { { 2, 50 }, { 3, 100 }, { 5, 80 }, { 6, 100 }, { 11, 25 }, { 12, 66 }, { 13, 76 }, { 4, 32 }, { 15, 18 } })&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        .PrimaryKey(&lt;span style="color:#a31515;"&gt;&amp;quot;BusinessEntityID&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    )&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .PrimaryKey(&lt;span style="color:#a31515;"&gt;&amp;quot;DepartmentID&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    .Columns(column =&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        column.For(x =&amp;gt; x.DepartmentID).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;DEP Id&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        column.For(x =&amp;gt; x.Name).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        column.For(x =&amp;gt; x.GroupName).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Group Name&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        column.For(x =&amp;gt; x.ModifiedDate).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Modified Date&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        column.Unbound(&lt;span style="color:#a31515;"&gt;&amp;quot;employees&amp;quot;&lt;/span&gt;).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Employees&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;).UnboundValues(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt;() { 7, 3, 18, 9, 12, 4, 180, 5, 6 });&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    })&lt;/li&gt; &lt;li&gt;    .Height(&lt;span style="color:#a31515;"&gt;&amp;quot;600px&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .Features(feature =&amp;gt; &lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            feature.Paging().Type(&lt;span style="color:#2b91af;"&gt;OpType&lt;/span&gt;.Local).PageSize(10);&lt;/li&gt; &lt;li&gt;            feature.Sorting().Type(&lt;span style="color:#2b91af;"&gt;OpType&lt;/span&gt;.Local);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            feature.Filtering().Type(&lt;span style="color:#2b91af;"&gt;OpType&lt;/span&gt;.Local);&lt;/li&gt; &lt;li&gt;        })&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .DataSource(Model)&lt;/li&gt; &lt;li&gt;    .ClientDataSourceType(&lt;span style="color:#2b91af;"&gt;ClientDataSourceType&lt;/span&gt;.JSON)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    .DataBind()&lt;/li&gt; &lt;li&gt;    .Render()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffff00;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;Would it work as expected? For a moment, it might. See there’s no merging enabled, therefore it happens on the client and since the schema doesn&amp;#39;t include the Unbound columns the grid isn’t as kind as to go about and apply null-s to every record missing unbound value. So in essence unless you provide all of them, records will not even have a ‘max’ property and guess what happens when the templating engine tries to get a value for it :) But no worries, a solution is possible using yet another formula:&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:31f8c30e-dd14-4161-ac06-0d99a8eea1ce" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;column.Unbound(&lt;span style="color:#a31515;"&gt;&amp;quot;max&amp;quot;&lt;/span&gt;).HeaderText(&lt;span style="color:#a31515;"&gt;&amp;quot;Max&amp;quot;&lt;/span&gt;).DataType(&lt;span style="color:#a31515;"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;).Hidden(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;).Formula(&lt;span style="color:#a31515;"&gt;&amp;quot;maxFix&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;And in it you can assign values or in this case keep the ones available and place defaults. It doesn’t even have to be null-s anymore:&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:78f5ad47-34b3-4331-b378-91a9b7cf2568" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; maxFix(row, grid) {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; row.max ?   row.max : &lt;span style="color:#800000;"&gt;&amp;quot;???&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;};&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;And you get quite lovely results:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/2766.igniteui_2D00_jquery_2D00_grid_2D00_unbound_2D00_columns_2D00_formulas_2D00_templates_5F00_03DF6EE8.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="igniteui-jquery-grid-unbound-columns-formulas-templates" border="0" alt="igniteui-jquery-grid-unbound-columns-formulas-templates" src="http://www.infragistics.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/damyan_5F00_petev.metablogapi/8130.igniteui_2D00_jquery_2D00_grid_2D00_unbound_2D00_columns_2D00_formulas_2D00_templates_5F00_thumb_5F00_50A3357E.png" width="650" height="325" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;h1 name="resources-demos"&gt;Resources and demos&lt;/h1&gt; &lt;ul&gt; &lt;li&gt; &lt;div name="gotcha"&gt;&lt;a title="How to get started with jQuery Grid Unbound Columns" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/how-to-get-started-with-jquery-grid-unbound-columns.aspx" target="_blank"&gt;How to get started with jQuery Grid Unbound Columns&lt;/a&gt;&lt;/div&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;a title="Why Unbound columns? Benefits and possible use cases." href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/how-to-get-started-with-jquery-grid-unbound-columns.aspx#why-unbound-columns" target="_blank"&gt;Why Unbound columns?&lt;/a&gt;&lt;/p&gt; &lt;li&gt; &lt;p&gt;&lt;a title="Ignite UI Grid quick setup with Unbound Column" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/how-to-get-started-with-jquery-grid-unbound-columns.aspx#quick-setup" target="_blank"&gt;Quick setup&lt;/a&gt; + &lt;a title="Quick setup with ASP.NET MVC wrapper" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/how-to-get-started-with-jquery-grid-unbound-columns.aspx#asp-net-mvc" target="_blank"&gt;with ASP.NET MVC wrapper&lt;/a&gt;&lt;/p&gt; &lt;li&gt; &lt;p&gt;&lt;a title="Adding data for the unbound columns" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/how-to-get-started-with-jquery-grid-unbound-columns.aspx#unbound-data" target="_blank"&gt;Adding data&lt;/a&gt;: with the &lt;a title="Unbound Values property" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/how-to-get-started-with-jquery-grid-unbound-columns.aspx#unbound-values" target="_blank"&gt;UnboundValues property&lt;/a&gt;, &lt;a title="Set Unbound Values methods" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/how-to-get-started-with-jquery-grid-unbound-columns.aspx#set-unbound-values" target="_blank"&gt;Set Unbound Values methods&lt;/a&gt; and &lt;a title="Unbound Column formula option." href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/how-to-get-started-with-jquery-grid-unbound-columns.aspx#formula" target="_blank"&gt;calculating them via formula&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt; &lt;li&gt; &lt;div name="gotcha"&gt;&lt;a title="jQuery Grid Unbound Column: How to make the most of it" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/jquery-grid-unbound-column-how-to-make-the-most-of-it.aspx" target="_blank"&gt;How to configure jQuery Grid Unbound Column and make the most of it&lt;/a&gt;&lt;/div&gt; &lt;ul&gt; &lt;ul&gt; &lt;li&gt; &lt;div name="gotcha"&gt;&lt;a title="Merge Unbound Columns property" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/jquery-grid-unbound-column-how-to-make-the-most-of-it.aspx#merge-unbound-columns" target="_blank"&gt;Merge Unbound Columns property&lt;/a&gt; and &lt;a title="Merge Unbound Columns Performance implications" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/jquery-grid-unbound-column-how-to-make-the-most-of-it.aspx#performance" target="_blank"&gt;&lt;strong&gt;Performance&lt;/strong&gt; implications&lt;/a&gt;&lt;/div&gt; &lt;li&gt; &lt;div name="gotcha"&gt;&lt;a title="Merging Unbound Columns and setting values on data-bound client event" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/jquery-grid-unbound-column-how-to-make-the-most-of-it.aspx#merge-set-unbound-values" target="_blank"&gt;Merging Unbound Columns and setting values on data-bound client event&lt;/a&gt;&lt;/div&gt; &lt;li&gt; &lt;div name="gotcha"&gt;&lt;a title="Client-side methods to get Unbound columns and their values" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/jquery-grid-unbound-column-how-to-make-the-most-of-it.aspx#get-columns-values" target="_blank"&gt;Client-side methods to get Unbound columns and their values&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt; &lt;div name="gotcha"&gt;Using unbound columns with &lt;a title="Unbound Column with Templating or formatting?" href="http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/10/16/jquery-grid-unbound-column-how-to-make-the-most-of-it.aspx#template-format" target="_blank"&gt;advanced column options such as Templating or formatting&lt;/a&gt;.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt; &lt;li&gt; &lt;div name="gotcha"&gt;You can instantly try the the feature with the following JSFiddle-s:&lt;/div&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt; &lt;div name="gotcha"&gt;&lt;a title="A JFIddle demo showing the IgniteUI Grid with Unbound columns and the ways to set values in order to support proper Updating." href="http://jsfiddle.net/damyanpetev/TswUa/" target="_blank"&gt;Updating and setting unbound values. Transactions.&lt;/a&gt;&lt;/div&gt; &lt;li&gt; &lt;div name="gotcha"&gt;&lt;a title="A JFIddle demo showing the IgniteUI Hierarchical Grid with Unbound columns and  unbound values in both parent and child layouts." href="http://jsfiddle.net/damyanpetev/eMYCS/" target="_blank"&gt;Setting unbound values in both parent and child layouts in the Hierarchical Grid&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt; &lt;div name="gotcha"&gt;I’ve prepared a&lt;strong&gt; fairly elaborate &lt;a title="Unbound-Column-Updating-Hierarchy - ASP.NET MVC demo project" href="http://media.infragistics.com/community/Release/12.2/jQuery/Unbound-Columns/Unbound-Column-Updating-Hierarchy.zip" target="_blank"&gt;ASP.NET MVC project&lt;/a&gt;&lt;/strong&gt; with various grid configurations described above with both jQuery/JavaScript and MVC Helper. &lt;em&gt;Keep in mind most views use the MVC wrapper and require at least a trial version of Ignite UI on your machine – click the banner below to get yourself one.&lt;/em&gt;&lt;/div&gt; &lt;li&gt; &lt;div name="gotcha"&gt;There are two demos available in our Samples: &lt;a title="Ignite UI Grid - Unbound Column sample" href="http://www.infragistics.com/products/jquery/sample/grid/unbound-column" target="_blank"&gt;Unbound Column in the Grid&lt;/a&gt; and &lt;a title="Ignite UI sample - Hierarchical Grid with Unbound Column" href="http://www.infragistics.com/products/jquery/sample/hierarchical-grid/unbound-column-hierarchical-grid" target="_blank"&gt;Unbound Column in the Hierarchical Grid&lt;/a&gt;.&lt;/div&gt; &lt;li&gt; &lt;div name="gotcha"&gt;You can find general and control specific help in our &lt;a title="Infragistics(R) Ignite UI&amp;trade; Online Help ::  2012.2" href="http://help.infragistics.com/NetAdvantage/jQuery/2012.2/CLR4.0" target="_blank"&gt;Online Documentation&lt;/a&gt;&lt;/div&gt; &lt;li&gt; &lt;div name="gotcha"&gt;You can find the client-side options and methods in the &lt;a title="Ignite UI API Reference : igGrid" href="http://help.infragistics.com/jQuery/2012.2/ui.iggrid" target="_blank"&gt;Ignite UI jQuery Grid API reference&lt;/a&gt;.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p name="gotcha"&gt;&lt;a title="Donwload your Ignite UI Free Trial now!" href="http://www.infragistics.com/products/jquery/downloads" target="_blank"&gt;&lt;img title="Donwload your Ignite UI Free Trial now!" alt="Donwload your Ignite UI Free Trial now!" src="http://media.infragistics.com/community/Release/12.2/jQuery/IgniteUI-download.jpg" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p name="gotcha"&gt;&lt;em&gt;As always, you can follow us on Twitter &lt;/em&gt;&lt;a title="That would be me!" href="https://twitter.com/DamyanPetev"&gt;&lt;em&gt;@DamyanPetev&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on Twitter" href="https://twitter.com/infragistics" target="_blank"&gt;&lt;em&gt;@Infragistics&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and stay in touch on &lt;/em&gt;&lt;a title="Infragistics on Facebook" href="http://www.facebook.com/infragistics" target="_blank"&gt;&lt;em&gt;Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a title="Infragistics on Google+" href="https://plus.google.com/110651137371189140377" target="_blank"&gt;&lt;em&gt;Google+&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a title="Infragistics on LinkedIn" href="http://www.linkedin.com/company/16069" target="_blank"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;! &lt;/em&gt;&lt;/p&gt; &lt;h1 id="tldr-summary" name="tldr-summary"&gt;TL;DR | Summary&lt;/h1&gt; &lt;p name="gotcha"&gt;In this article we covered the usage the Updating feature with Unbound Columns in the IgniteUI Grid – how to deserialize the now non-conforming model of data the client side jQuery widget is sending. We also looked into the proper methods of setting values so they can be persisted and how to deal with editing and formula updating upon dependency field change.&lt;/p&gt; &lt;p name="gotcha"&gt;In addition to those, some light was shone upon how the Hierarchical version of the grid ever so slightly differs from the flat one and the unique challenges it poses – setting values and the dynamic creation of child widgets. The odd interaction between options such as Merge Unbound columns and Load on Demand and just how bad can things so and how useful the ASP.NET MVC Grid model ‘GetData()’ method can be to prevent that. Lastly, a small demo just to give head up when using Unbound Column values in templates without merging values on the server.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=379000" width="1" height="1"&gt;</description><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/CDN/default.aspx">CDN</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics/default.aspx">Infragistics</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Editing/default.aspx">Editing</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Infragistics+Grid/default.aspx">Infragistics Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igGrid/default.aspx">igGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Load/default.aspx">Load</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Load+On+Demand/default.aspx">Load On Demand</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Demand/default.aspx">Demand</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igHierarchicalGrid/default.aspx">igHierarchicalGrid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Unbound+Column/default.aspx">Unbound Column</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Unbound+Field/default.aspx">Unbound Field</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igDataSource/default.aspx">igDataSource</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Templating/default.aspx">Templating</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/igTemplating/default.aspx">igTemplating</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Templates/default.aspx">Templates</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Merge/default.aspx">Merge</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Merging/default.aspx">Merging</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/12.2/default.aspx">12.2</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/setUnboundValues/default.aspx">setUnboundValues</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Formula/default.aspx">Formula</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Unbound/default.aspx">Unbound</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI/default.aspx">Ignite UI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite+UI+Grid/default.aspx">Ignite UI Grid</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Column/default.aspx">Column</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Ignite/default.aspx">Ignite</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/IgniteUI/default.aspx">IgniteUI</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Merge+Unbound+Columns/default.aspx">Merge Unbound Columns</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/serialization/default.aspx">serialization</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/JSON.NET/default.aspx">JSON.NET</category><category domain="http://www.infragistics.com/community/blogs/damyan_petev/archive/tags/Updating/default.aspx">Updating</category></item></channel></rss>