<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Desktop Applications Archives - Anuj Varma, Hands-On Technology Architect, Clean Air Activist</title>
	<atom:link href="https://www.anujvarma.com/category/technology/winforms/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.anujvarma.com/category/technology/winforms/</link>
	<description>Production Grade Technical Solutions &#124; Data Encryption and Public Cloud Expert</description>
	<lastBuildDate>Tue, 19 Nov 2013 23:48:25 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.anujvarma.com/wp-content/uploads/anujtech.png</url>
	<title>Desktop Applications Archives - Anuj Varma, Hands-On Technology Architect, Clean Air Activist</title>
	<link>https://www.anujvarma.com/category/technology/winforms/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Windows DataGridView &#8211; Improving the Data Display (Refresh) Performance</title>
		<link>https://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance-2/</link>
					<comments>https://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance-2/#comments</comments>
		
		<dc:creator><![CDATA[Anuj Varma]]></dc:creator>
		<pubDate>Fri, 09 Mar 2012 18:56:22 +0000</pubDate>
				<category><![CDATA[High Performance Desktop Apps]]></category>
		<category><![CDATA[slow refresh rate datagridview]]></category>
		<category><![CDATA[dgv .net]]></category>
		<category><![CDATA[.net winforms grid]]></category>
		<category><![CDATA[datagridview performance]]></category>
		<category><![CDATA[refresh rate datagridview]]></category>
		<category><![CDATA[data grid view windows]]></category>
		<category><![CDATA[.net datagrid]]></category>
		<category><![CDATA[data grid performance]]></category>
		<guid isPermaLink="false">http://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance-2/</guid>

					<description><![CDATA[<p>&#160; The DataGridView is used everywhere – both in ASP.net apps as well as WinForms apps. A quick google search will reveal the scale of users affected by the slow [&#8230;]</p>
<p>The post <a href="https://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance-2/">Windows DataGridView &ndash; Improving the Data Display (Refresh) Performance</a> appeared first on <a href="https://www.anujvarma.com">Anuj Varma, Hands-On Technology Architect, Clean Air Activist</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>&nbsp; The DataGridView is used everywhere – both in ASP.net apps as well as WinForms apps. A quick google search will reveal the scale of users affected by the slow refresh rate on the DataGridView control.&nbsp; How the data is displayed is dictated by a property called the <em>Display Mode. </em>The <em>Display Mode </em>that most datagridview users opt for is the <em>Bound mode.</em></p>
<h3>An object-bound datagridview</h3>
<p>Object binding refers to the ability to <em>bind </em>a control to a custom data type (your domain objects). In pre-object binding days, one would bind a control directly to the raw data (e.g. an int <em>CustomerID</em> and a string <em>CustomerName</em> retrieved from the datasource). This was a cumbersome approach since most of the data could logically be grouped into custom data types (e.g. <em>Customer</em>). The User Interface was mainly interested in displaying the domain types (e.g. Customer) and less interested in native data types such as ints and strings. This led to the development of object-binding as an alternative to older raw data-binding.</p>
<p>A typical datagridview application that uses object binding will involve the following steps:</p>
<ol>
<li>Fetching Data (usually using ADO.NET and a DataReader/DataTable/DataSet combination).
<li>Storing the fetched data in a local collection (typically an IList&lt;T&gt; where T represents your custom domain object e.g. IList&lt;Customer&gt;).
<li>Converting the IList&lt;Customer&gt; to a BindingList&lt;Customer&gt;
<li>Binding the BindingList to the datagridview </li>
</ol>
<p>For a detailed walkthrough of custom object binding to a datagridview, see this MSDN magazine <a href="http://cut.ms/bqSx">article</a>.</p>
<h3><em>Bound</em> Display Mode</h3>
<p>For object bound DGVs (datagridviews), the ‘Bound’ mode is the most commonly used display mode. In this mode, the datagridview control is automatically bound to the source of the data – and any changes to the source of the data cause refreshes of the various UI elements of the grid (columns, rows etc.). This offers a degree of convenience that is appealing, at least for small volumes of data. This <em>Bound </em>mode kicks into effect whenever you set the <em>Datasource </em>property on the&nbsp; datagridview as shown in the snippet below.</p>
<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:407f6465-9b22-4129-b6a3-5dbbaf9d8ae1" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px">Code Snippet</div>
<div style="background: #ddd; max-height: 300px; overflow: auto">
<ol style="padding-bottom: 0px; margin: 0px 0px 0px 2.5em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px">
<li><span style="color: #008000">// Define your BindingList</span>
<li style="background: #f3f3f3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">BindingList</span>&lt;<span style="color: #0000ff">object</span>&gt; bindableDataSource = <span style="color: #0000ff">new</span> <span style="color: #2b91af">BindingList</span>&lt;<span style="color: #0000ff">object</span>&gt;();
<li>&nbsp;
<li style="background: #f3f3f3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">// Add some data to the bindingList</span>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">BindingList</span>&lt;<span style="color: #0000ff">object</span>&gt; list = CreateData();
<li style="background: #f3f3f3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">foreach</span> (<span style="color: #0000ff">object</span> item <span style="color: #0000ff">in</span> list)
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<li style="background: #f3f3f3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bindableDataSource.Add(item);
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<li style="background: #f3f3f3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">// This actually &#8216;binds&#8217; the gridview to the BindingList. Any changes to the BindingList from here on affect the gridview.</span>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">// For e.g. &#8211; The &#8216;bound&#8217; gridview would refresh its layout every time a new item is added to this BindingList</span>
<li style="background: #f3f3f3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataGridView1.DataSource = bindableDataSource; </li>
</ol>
</div>
</div>
</div>
<h3>The Problem with <em>Bound </em>display mode</h3>
<p>The first indications of problems with the <em>bound </em>mode are visible as soon as you start adding additional items to the source list (while the grid is bound to it). Note that it is possible to add additional items without binding the grid – and then performing the binding step at the very end – as shown in the snippet above. However, even with this approach, at some point, you may need to add/delete items from the source list – causing unnecessary refreshes. More serious problems with the DataGridView start manifesting themselves as the size of the bound collection grows. For larger sets of data, this problem grows to unacceptable response times.</p>
<h3>Enter Virtual Mode</h3>
<p>By default, most datagridview developers use a Display mode called <em>Bound. </em>In this display mode, the data in the grid is automatically bound to the data in the datasource. This means that the grid view control handles all aspects of fetching the data as well as displaying the data. While this offers convenience, it is the main reason for slower display performance on the DGV. Fortunately, there is another display mode available to address this problem. This mode is known as the <em>virtual </em>display mode. In this display mode, instead of being bound to the entire datasource, the grid is essentially bound to a small subset (a cached portion) of the datasource. This small subset is the set of data should match the data that is visible on the grid (the exact amount of data is under the programmer’s control). Whenever a user wants to see more data (scrolls the grid), that data is fetched from the datasource, placed into cache – and returned to the grid from the cache. This way, only a small amount of data is ever <em>bound </em>to the grid – and even that only through a memory based cache.&nbsp; This alleviates a lot of issues with the Windows DataGridView – including slow UI refreshes, locked UIs etc.</p>
<h3>Quick Conversion from <em>bound </em>to <em>virtual </em>(full source code at the end of this post)</h3>
<p>In your source code, if you are using the <em>bound </em>display mode (happens by default if you set the ‘datasource property) you will be setting the <em>datasource </em>property on your gridview somewhere – e.g.</p>
<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:09575649-dadd-4b2b-afff-5dc249175e1c" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px">Code Snippet</div>
<div style="background: #ddd; max-height: 300px; overflow: auto">
<ol style="padding-bottom: 0px; margin: 0px 0px 0px 2em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px">
<li><span style="color: #0000ff">this</span>.dataGridView1.DataSource = _customers; </li>
</ol>
</div>
</div>
</div>
<p>Instead of setting this datasource property, what you will need to do is <em>initialize</em> the grid to use <em>virtual </em>mode. This is shown in the snippet below (full source code included at the end of this post).</p>
<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:11b1380f-6c39-4f34-8e10-9eced04a6691" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px">Code Snippet</div>
<div style="background: #ddd; max-height: 300px; overflow: auto">
<ol style="padding-bottom: 0px; margin: 0px 0px 0px 2em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px">
<li><span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span> InitializeGrid()
<li style="background: #f3f3f3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">// Enable virtual mode.</span>
<li style="background: #f3f3f3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">this</span>.dataGridView1.VirtualMode = <span style="color: #0000ff">true</span>;
<li>&nbsp;
<li style="background: #f3f3f3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">// Connect the virtual-mode events to event handlers. </span>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">this</span>.dataGridView1.CellValueNeeded += <span style="color: #0000ff">new</span>
<li style="background: #f3f3f3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">DataGridViewCellValueEventHandler</span>(dataGridView1_CellValueNeeded); </li>
</ol>
</div>
</div>
</div>
<p>The actual <em>dataGridView1_CellValueNeeded </em>event is where the event to request more data is handled.&nbsp; The included source code below provides a quick implementation of the virtual display mode – which should work for simple use cases. For a <a href="http://cut.ms/bqSH">full walkthrough</a> on a virtual mode implementation, see MSDN.</p>
<h3>What if the Virtual Mode is still sluggish?</h3>
<p>If the performance of virtual mode is still sluggish for your data (if you have several thousands of rows of data), chances are you need to look elsewhere. There are several 3rd party grid controls on the market – including Infragistics, Syncfusion and Telerik. One such grid that I have worked with extensively is Syncfusion’s Grid Control. On my project, we were handling several hundred MBs of data in the grid – with refreshes occurring in real-time or near real-time (i.e. no sluggishness).&nbsp; A performance comparison is detailed in an <a href="http://cut.ms/bqSI">earlier post</a>.</p>
<p>In addition to the speed, you also get a host of features that I like to call <em>Grid on Steroids </em>features. These include <em>nested grids </em>(which make it possible to efficiently display hierarchical data), multiple column sorts (which isn’t available out of the box in Windows DataGridView – but can be <a href="http://cut.ms/bqSN">custom built</a>), pivot tables and more.</p>
<h3>Summary</h3>
<p>If you are witnessing slow rendering (sluggish rendering) of your datagridview in your WinForms (or ASP.NET ) application, chances are you are using automatic binding (<em>bound </em>display mode). Chances are that you will experience a significant benefit from trying the <em>virtual </em>display mode built into the gridview. This display mode <em>binds </em>to a smaller, cached subset of the full data, allowing quicker UI refreshes. The sample attached here shows a grid using the <em>bound </em>mode and another grid using <em>virtual </em>mode (both with identical 10000 rows of customer data). Even with this simple sample of a few 100 KBs of data, a noticeable difference can be seen (by visual inspection) when one tries to scroll down the grid to view more rows. The refresh rate of the <em>virtual </em>mode grid clearly wins out.&nbsp; If you find the <em>virtual </em>mode also insufficient for your application’s volume of data, you might need something like <a href="http://cut.ms/bqSI">the syncfusion grid</a>.</p>
<h3>Source Code</h3>
<p>Download Full Solution</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:F60BB8FA-6F02-4999-8F5E-9DD4E92C4DA7:fcb41de7-8b44-425e-8a55-db79b2c500ec" class="wlWriterSmartContent">
<div><a href="http://www.anujvarma.com/wp-content/uploads/VirtualMode_DataGridView.zip" target="_self">VirtualMode_DataGridView.zip</a></div>
</div>
<h3>About the Author</h3>
<p>&nbsp; Anuj Varma is a Microsoft .NET architect specializing in high-performance applications. His specific expertise in the .NET framework architecture as well as 3rd party controls (such as Syncfusion) built around the framework,&nbsp; makes him a sought after performance expert for .NET applications. Most recently, he has worked on an ASP.NET revamp of dell.com as well as a WinForms app used to map Ocean floors (Petrel). Both these applications were built with performance (UI performance as well as Data Access Layer performance) as a key driver. In addition to n-Tier apps, Anuj works hands-on in the WCF and Azure arena to bring performance to existing SOA apps. Anuj’s personal blog can be found here &#8211; <a href="http://anujvarma.com/category/technology">anujvarma.com/blog/technology</a><em>, </em> </p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0ccc8f3a-010a-470f-a4ac-a04265079f6a" class="wlWriterSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Windows+datagridview+performance" rel="tag">Windows datagridview performance</a>,<a href="http://technorati.com/tags/gridview+performance" rel="tag">gridview performance</a>,<a href="http://technorati.com/tags/winforms+performance" rel="tag">winforms performance</a>,<a href="http://technorati.com/tags/unresponsive+UI" rel="tag">unresponsive UI</a>,<a href="http://technorati.com/tags/.NET+UI" rel="tag">.NET UI</a>,<a href="http://technorati.com/tags/3rd+party+UI+controls" rel="tag">3rd party UI controls</a>,<a href="http://technorati.com/tags/3rd+party+UI+libraries" rel="tag">3rd party UI libraries</a>,<a href="http://technorati.com/tags/UI+performance" rel="tag">UI performance</a>,<a href="http://technorati.com/tags/high+performance+user+interface" rel="tag">high performance user interface</a></div></p>
<p>The post <a href="https://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance-2/">Windows DataGridView &ndash; Improving the Data Display (Refresh) Performance</a> appeared first on <a href="https://www.anujvarma.com">Anuj Varma, Hands-On Technology Architect, Clean Air Activist</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance-2/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>WinForms and Advanced UI Programming in .NET, Anuj Varma</title>
		<link>https://www.anujvarma.com/winforms-and-advanced-ui-programming-in-net-anuj-varma/</link>
					<comments>https://www.anujvarma.com/winforms-and-advanced-ui-programming-in-net-anuj-varma/#respond</comments>
		
		<dc:creator><![CDATA[Anuj Varma]]></dc:creator>
		<pubDate>Thu, 01 Dec 2011 21:28:00 +0000</pubDate>
				<category><![CDATA[High Performance Desktop Apps]]></category>
		<category><![CDATA[winforms]]></category>
		<category><![CDATA[.net ui]]></category>
		<category><![CDATA[wpf]]></category>
		<category><![CDATA[.net frameworks]]></category>
		<category><![CDATA[infragistics]]></category>
		<category><![CDATA[syncfusion]]></category>
		<guid isPermaLink="false">http://www.anujvarma.com/?p=1347</guid>

					<description><![CDATA[<p>3rd Party UI Libraries: Advanced UI Controls including 3rd party datagrids, list controls, tabbed layouts etc. may be required to meet the needs of today&#8217;s enterprise data. Syncfusion and Infragistics [&#8230;]</p>
<p>The post <a href="https://www.anujvarma.com/winforms-and-advanced-ui-programming-in-net-anuj-varma/">WinForms and Advanced UI Programming in .NET, Anuj Varma</a> appeared first on <a href="https://www.anujvarma.com">Anuj Varma, Hands-On Technology Architect, Clean Air Activist</a>.</p>
]]></description>
										<content:encoded><![CDATA[<ul>
<li><strong><strong>3rd Party UI Libraries</strong>: Advanced UI Controls including 3rd party datagrids, list controls, tabbed layouts etc. may be required to meet the needs of today&#8217;s enterprise data. Syncfusion and Infragistics are among 3rd party UI controls that I have been able to work with extensively on behalf of my clients.</strong>
<li><strong>Datagrids</strong>: Customized datagrids for handling heirarchical data, grouping and sorting of large volumes of data. Sophisticated datagrid (syncfusion) that accepts a variety of data feeds, supports cell-level updates, advanced grouping options, custom formatting, grid export to various formats, in-grid calculations (excel like) and other advanced grid capabilities. If your application handles large volumes of data and needs to display them efficiently, contact me to see if I can help.
<li><strong>Multiple application UI Support</strong>: Complete decoupling of business model and UI: Most MVC implementations accomplish decoupling upto a certain point &#8211; but still tie the application to a particular type of interface (e.g. web or desktop). A truly decoupled design creates a <em>Model</em> layer which can <em>export</em>to any type of UI &#8211; web, desktop, mobile etc. If your application is in need of multiple UI display types (web, mobile devices, desktop), my UI experience may be valuable.
<li><strong>Unit Testing UI Components</strong>: Typically, writing unit tests for UI components has been a challenging task. With advances in tools such as NUnitForms and Cassini (simple http server), it is possible to automate unit testing of UI components. Contact me to see how I can help write an automated test suite for your application.
<li><strong>Overall Framework design</strong>: For those applications looking for a standardized approach to all their applications (standardized logging, exception handling, UI controls data-binding etc.), a well designed application framework can go a long way. With the help of advanced patterns usage coupled with enterprise components (such as Enterprise Application Blocks, SmartClient Software Factory SCSF), some of my experience with frameworks can help you build a corporate-wide application framework.
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fa885c36-b3e4-463b-9124-84be519398c1">Technorati Tags: <a href="http://technorati.com/tags/WPF+programming" rel="tag">WPF programming</a>,<a href="http://technorati.com/tags/UI+framework" rel="tag">UI framework</a>,<a href="http://technorati.com/tags/winforms" rel="tag">winforms</a>,<a href="http://technorati.com/tags/.NET+UI" rel="tag">.NET UI</a>,<a href="http://technorati.com/tags/.NET+framework" rel="tag">.NET framework</a></div>
</li>
</ul>
<p>The post <a href="https://www.anujvarma.com/winforms-and-advanced-ui-programming-in-net-anuj-varma/">WinForms and Advanced UI Programming in .NET, Anuj Varma</a> appeared first on <a href="https://www.anujvarma.com">Anuj Varma, Hands-On Technology Architect, Clean Air Activist</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.anujvarma.com/winforms-and-advanced-ui-programming-in-net-anuj-varma/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Superfast display (loading) of data into your UI (WinForms, MVC or ASP.NET)</title>
		<link>https://www.anujvarma.com/superfast-rendering-of-ui-data-in-winforms-world-2-2/</link>
					<comments>https://www.anujvarma.com/superfast-rendering-of-ui-data-in-winforms-world-2-2/#respond</comments>
		
		<dc:creator><![CDATA[Anuj Varma]]></dc:creator>
		<pubDate>Sat, 19 Nov 2011 10:12:54 +0000</pubDate>
				<category><![CDATA[High Performance Desktop Apps]]></category>
		<category><![CDATA[syncfusion grid performance]]></category>
		<category><![CDATA[displaying large quantities of data]]></category>
		<category><![CDATA[syncfusion grouping grid]]></category>
		<category><![CDATA[displaying large volumes of data]]></category>
		<guid isPermaLink="false">http://www.anujvarma.com/superfast-rendering-of-ui-data-in-winforms-world-2-2/</guid>

					<description><![CDATA[<p>While this post compares the WinForms datagridview with a 3rd party (syncfusion) Grid Control for windows, the same comparison also applies to grid controls in the MVC and ASP.NET webforms [&#8230;]</p>
<p>The post <a href="https://www.anujvarma.com/superfast-rendering-of-ui-data-in-winforms-world-2-2/">Superfast display (loading) of data into your UI (WinForms, MVC or ASP.NET)</a> appeared first on <a href="https://www.anujvarma.com">Anuj Varma, Hands-On Technology Architect, Clean Air Activist</a>.</p>
]]></description>
										<content:encoded><![CDATA[<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<link rel="dataStoreItem" href="Load%20Handling%20Baseline_files/item0001.xml" target="Load%20Handling%20Baseline_files/props002.xml"><link rel="themeData" href="Load%20Handling%20Baseline_files/themedata.thmx"><link rel="colorSchemeMapping" href="Load%20Handling%20Baseline_files/colorschememapping.xml"><link rel="plchdr" href="Load%20Handling%20Baseline_files/plchdr.htm">
<style>
<!--
 /* Font Definitions */
 @font-face
	{font-family:calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-536870145 1073786111 1 0 415 0;}
@font-face
	{font-family:tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-520081665 -1073717157 41 0 66047 0;}
@font-face
	{font-family:"Wingdings 2";
	panose-1:5 2 1 2 1 5 7 7 7 7;
	mso-font-charset:2;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
	{font-family:"MS PMincho";
	panose-1:2 2 6 0 4 2 5 8 3 4;
	mso-font-charset:128;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-536870145 1791491579 18 0 131231 0;}
@font-face
	{font-family:"Century Schoolbook";
	panose-1:2 4 6 4 5 5 5 2 3 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:647 0 0 0 159 0;}
@font-face
	{font-family:"\@MS PMincho";
	panose-1:2 2 6 0 4 2 5 8 3 4;
	mso-font-charset:128;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-536870145 1791491579 18 0 131231 0;}
 /* Style Definitions */
 p.msonormal, li.msonormal, div.msonormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
h1
	{mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 1 Char";
	mso-style-next:normal;
	margin-top:.25in;
	margin-right:0in;
	margin-bottom:2.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	mso-outline-level:1;
	font-size:16.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:major-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	font-variant:small-caps;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	letter-spacing:.25pt;
	mso-font-kerning:0pt;
	mso-fareast-language:ja;
	font-weight:normal;}
h2
	{mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 2 Char";
	mso-style-next:normal;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:115%;
	mso-pagination:widow-orphan;
	mso-outline-level:2;
	font-size:14.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:major-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:normal;}
h3
	{mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 3 Char";
	mso-style-next:normal;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:115%;
	mso-pagination:widow-orphan;
	mso-outline-level:3;
	font-size:12.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:major-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	letter-spacing:.25pt;
	mso-fareast-language:ja;
	font-weight:normal;}
h4
	{mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 4 Char";
	mso-style-next:normal;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:115%;
	mso-pagination:widow-orphan;
	mso-outline-level:4;
	font-size:11.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:major-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:normal;}
h5
	{mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 5 Char";
	mso-style-next:normal;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:115%;
	mso-pagination:widow-orphan;
	mso-outline-level:5;
	font-size:11.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
h6
	{mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 6 Char";
	mso-style-next:normal;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:115%;
	mso-pagination:widow-orphan;
	mso-outline-level:6;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;
	mso-bidi-font-weight:normal;}
p.msoheading7, li.msoheading7, div.msoheading7
	{mso-style-noshow:yes;
	mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 7 Char";
	mso-style-next:normal;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:115%;
	mso-pagination:widow-orphan;
	mso-outline-level:7;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.msoheading8, li.msoheading8, div.msoheading8
	{mso-style-noshow:yes;
	mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 8 Char";
	mso-style-next:normal;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:115%;
	mso-pagination:widow-orphan;
	mso-outline-level:8;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#3667c3;
	mso-themecolor:accent2;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:bold;
	mso-bidi-font-weight:normal;}
p.msoheading9, li.msoheading9, div.msoheading9
	{mso-style-noshow:yes;
	mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 9 Char";
	mso-style-next:normal;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:115%;
	mso-pagination:widow-orphan;
	mso-outline-level:9;
	font-size:9.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#3667c3;
	mso-themecolor:accent2;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.msonormalindent, li.msonormalindent, div.msonormalindent
	{mso-style-priority:99;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.5in;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
p.msonormalindentcxspfirst, li.msonormalindentcxspfirst, div.msonormalindentcxspfirst
	{mso-style-priority:99;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
p.msonormalindentcxspmiddle, li.msonormalindentcxspmiddle, div.msonormalindentcxspmiddle
	{mso-style-priority:99;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
p.msonormalindentcxsplast, li.msonormalindentcxsplast, div.msonormalindentcxsplast
	{mso-style-priority:99;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.5in;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
p.msoheader, li.msoheader, div.msoheader
	{mso-style-priority:99;
	mso-style-link:"Header Char";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	tab-stops:center 3.25in right 6.5in;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
p.msofooter, li.msofooter, div.msofooter
	{mso-style-priority:99;
	mso-style-link:"Footer Char";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	tab-stops:center 3.25in right 6.5in;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
p.msocaption, li.msocaption, div.msocaption
	{mso-style-priority:99;
	mso-style-next:normal;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	text-align:right;
	mso-pagination:widow-orphan;
	font-size:8.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:bold;}
p.msotitle, li.msotitle, div.msotitle
	{mso-style-priority:10;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Title Char";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:24.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:major-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	font-variant:small-caps;
	color:#fe8637;
	mso-themecolor:accent1;
	letter-spacing:.5pt;
	mso-fareast-language:ja;}
p.msosubtitle, li.msosubtitle, div.msosubtitle
	{mso-style-priority:11;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Subtitle Char";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#575f6d;
	mso-themecolor:text2;
	letter-spacing:.25pt;
	mso-fareast-language:ja;
	font-style:italic;
	mso-bidi-font-style:normal;}
a:link, span.msohyperlink
	{mso-style-priority:99;
	color:#d2611c;
	mso-themecolor:hyperlink;
	text-decoration:underline;
	text-underline:single;}
a:visited, span.msohyperlinkfollowed
	{mso-style-noshow:yes;
	mso-style-priority:99;
	color:#3b435b;
	mso-themecolor:followedhyperlink;
	text-decoration:underline;
	text-underline:single;}
em
	{mso-style-priority:20;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-ansi-font-size:9.0pt;
	mso-bidi-font-size:9.0pt;
	color:#2b2f36;
	mso-themecolor:text2;
	mso-themeshade:128;
	letter-spacing:.5pt;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	mso-bidi-font-style:normal;}
p.msoacetate, li.msoacetate, div.msoacetate
	{mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-link:"Balloon Text Char";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:8.0pt;
	font-family:"Tahoma","sans-serif";
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
span.msoplaceholdertext
	{mso-style-priority:99;
	color:gray;}
p.msolistparagraph, li.msolistparagraph, div.msolistparagraph
	{mso-style-priority:36;
	mso-style-qformat:yes;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.5in;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
p.msolistparagraphcxspfirst, li.msolistparagraphcxspfirst, div.msolistparagraphcxspfirst
	{mso-style-priority:36;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
p.msolistparagraphcxspmiddle, li.msolistparagraphcxspmiddle, div.msolistparagraphcxspmiddle
	{mso-style-priority:36;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
p.msolistparagraphcxsplast, li.msolistparagraphcxsplast, div.msolistparagraphcxsplast
	{mso-style-priority:36;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.5in;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
p.msoquote, li.msoquote, div.msoquote
	{mso-style-priority:29;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Quote Char";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.msointensequote, li.msointensequote, div.msointensequote
	{mso-style-priority:30;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:quote;
	mso-style-link:"Intense Quote Char";
	margin-top:0in;
	margin-right:.65in;
	margin-bottom:10.0pt;
	margin-left:.65in;
	line-height:125%;
	mso-pagination:widow-orphan;
	border:none;
	mso-border-bottom-alt:double #fe8637 1.5pt;
	mso-border-bottom-themecolor:accent1;
	padding:0in;
	mso-padding-alt:0in 0in 4.0pt 0in;
	font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;}
span.msosubtleemphasis
	{mso-style-priority:19;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.msointenseemphasis
	{mso-style-priority:21;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-ansi-font-size:9.0pt;
	mso-bidi-font-size:9.0pt;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	text-transform:uppercase;
	letter-spacing:.5pt;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.msosubtlereference
	{mso-style-priority:31;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	font-family:"Times New Roman","serif";
	mso-bidi-font-family:"Times New Roman";
	color:#3667c3;
	mso-themecolor:accent2;
	mso-themeshade:191;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.msointensereference
	{mso-style-priority:32;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-ansi-font-size:9.0pt;
	mso-bidi-font-size:9.0pt;
	font-family:"Times New Roman","serif";
	mso-bidi-font-family:"Times New Roman";
	color:#3667c3;
	mso-themecolor:accent2;
	mso-themeshade:191;
	text-transform:uppercase;
	letter-spacing:.25pt;
	font-weight:bold;
	mso-bidi-font-weight:normal;}
span.msobooktitle
	{mso-style-priority:33;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	font-family:"Times New Roman","serif";
	mso-bidi-font-family:"Times New Roman";
	font-variant:small-caps;
	color:black;
	letter-spacing:.5pt;}
span.heading1char
	{mso-style-name:"Heading 1 Char";
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 1";
	mso-ansi-font-size:16.0pt;
	mso-bidi-font-size:16.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:major-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	font-variant:small-caps;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	letter-spacing:.25pt;
	mso-fareast-language:ja;}
span.heading2char
	{mso-style-name:"Heading 2 Char";
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 2";
	mso-ansi-font-size:14.0pt;
	mso-bidi-font-size:14.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:major-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
span.titlechar
	{mso-style-name:"Title Char";
	mso-style-priority:10;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:title;
	mso-ansi-font-size:24.0pt;
	mso-bidi-font-size:24.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:major-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	font-variant:small-caps;
	color:#fe8637;
	mso-themecolor:accent1;
	letter-spacing:.5pt;
	mso-fareast-language:ja;}
span.subtitlechar
	{mso-style-name:"Subtitle Char";
	mso-style-priority:11;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:subtitle;
	mso-ansi-font-size:12.0pt;
	mso-bidi-font-size:12.0pt;
	font-family:"Century Schoolbook","serif";
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#575f6d;
	mso-themecolor:text2;
	letter-spacing:.25pt;
	mso-fareast-language:ja;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.balloontextchar
	{mso-style-name:"Balloon Text Char";
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Balloon Text";
	mso-ansi-font-size:8.0pt;
	mso-bidi-font-size:8.0pt;
	font-family:"Tahoma","sans-serif";
	mso-ascii-font-family:tahoma;
	mso-hansi-font-family:tahoma;
	mso-bidi-font-family:tahoma;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
span.footerchar
	{mso-style-name:"Footer Char";
	mso-style-priority:99;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:footer;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
span.headerchar
	{mso-style-name:"Header Char";
	mso-style-priority:99;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:header;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;}
span.heading3char
	{mso-style-name:"Heading 3 Char";
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 3";
	mso-ansi-font-size:12.0pt;
	mso-bidi-font-size:12.0pt;
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:major-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	letter-spacing:.25pt;
	mso-fareast-language:ja;}
span.heading4char
	{mso-style-name:"Heading 4 Char";
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 4";
	font-family:"Century Schoolbook","serif";
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:major-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;}
span.heading5char
	{mso-style-name:"Heading 5 Char";
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 5";
	font-family:"Century Schoolbook","serif";
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.heading6char
	{mso-style-name:"Heading 6 Char";
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 6";
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:bold;
	mso-bidi-font-weight:normal;}
span.heading7char
	{mso-style-name:"Heading 7 Char";
	mso-style-noshow:yes;
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 7";
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.heading8char
	{mso-style-name:"Heading 8 Char";
	mso-style-noshow:yes;
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 8";
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#3667c3;
	mso-themecolor:accent2;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:bold;
	mso-bidi-font-weight:normal;}
span.heading9char
	{mso-style-name:"Heading 9 Char";
	mso-style-noshow:yes;
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 9";
	mso-ansi-font-size:9.0pt;
	mso-bidi-font-size:9.0pt;
	font-family:"Century Schoolbook","serif";
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#3667c3;
	mso-themecolor:accent2;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.quotechar
	{mso-style-name:"Quote Char";
	mso-style-priority:29;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:quote;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#414751;
	mso-themecolor:text2;
	mso-themeshade:191;
	mso-fareast-language:ja;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.intensequotechar
	{mso-style-name:"Intense Quote Char";
	mso-style-priority:30;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Intense Quote";
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Century Schoolbook","serif";
	mso-bidi-font-family:"Century Schoolbook";
	mso-bidi-theme-font:minor-latin;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;
	mso-fareast-language:ja;}
.msochpdefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:"Century Schoolbook";
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Century Schoolbook";
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:"Century Schoolbook";
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.msopapdefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
 /* Page Definitions */
 @page
	{mso-footnote-separator:url("Load%20Handling%20Baseline_files/header.htm") fs;
	mso-footnote-continuation-separator:url("Load%20Handling%20Baseline_files/header.htm") fcs;
	mso-endnote-separator:url("Load%20Handling%20Baseline_files/header.htm") es;
	mso-endnote-continuation-separator:url("Load%20Handling%20Baseline_files/header.htm") ecs;}
@page wordsection1
	{size:8.5in 11.0in;
	margin:1.0in 1.25in 1.0in 1.25in;
	mso-header-margin:.5in;
	mso-footer-margin:.3in;
	mso-page-numbers:0;
	mso-title-page:yes;
	mso-header:url("Load%20Handling%20Baseline_files/header.htm") h1;
	mso-footer:url("Load%20Handling%20Baseline_files/header.htm") f1;
	mso-paper-source:0;}
div.wordsection1
	{page:wordsection1;}
 /* List Definitions */
 @list l0
	{mso-list-id:205457901;
	mso-list-template-ids:-851394662;
	mso-list-style-priority:99;
	mso-list-style-name:"Bulleted List";}
@list l0:level1
	{mso-level-number-format:bullet;
	mso-level-text:\f09a;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:12.25pt;
	text-indent:-12.25pt;
	mso-ansi-font-size:8.0pt;
	font-family:"Wingdings 2";
	color:#fe8637;
	mso-themecolor:accent1;}
@list l0:level2
	{mso-level-number-format:bullet;
	mso-level-text:\f0b7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:24.5pt;
	text-indent:-12.25pt;
	mso-ansi-font-size:9.0pt;
	font-family:symbol;
	color:#fe8637;
	mso-themecolor:accent1;}
@list l0:level3
	{mso-level-number-format:bullet;
	mso-level-text:\f0b7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:36.75pt;
	text-indent:-12.25pt;
	mso-ansi-font-size:9.0pt;
	font-family:symbol;
	color:#fe8637;
	mso-themecolor:accent1;}
@list l0:level4
	{mso-level-number-format:bullet;
	mso-level-text:\f0b7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:49.0pt;
	text-indent:-12.25pt;
	mso-ansi-font-size:6.0pt;
	font-family:symbol;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;}
@list l0:level5
	{mso-level-number-format:bullet;
	mso-level-text:\f0b7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:61.25pt;
	text-indent:-12.25pt;
	mso-ansi-font-size:6.0pt;
	font-family:symbol;
	color:#e65b01;
	mso-themecolor:accent1;
	mso-themeshade:191;}
@list l0:level6
	{mso-level-number-format:bullet;
	mso-level-text:\f0b7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:73.5pt;
	text-indent:-12.25pt;
	mso-ansi-font-size:6.0pt;
	font-family:symbol;
	color:#777c84;
	mso-themecolor:accent6;}
@list l0:level7
	{mso-level-number-format:bullet;
	mso-level-text:\f0b7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:85.75pt;
	text-indent:-12.25pt;
	mso-ansi-font-size:6.0pt;
	font-family:symbol;
	color:#777c84;
	mso-themecolor:accent6;}
@list l0:level8
	{mso-level-number-format:bullet;
	mso-level-text:\f0b7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:98.0pt;
	text-indent:-12.25pt;
	mso-ansi-font-size:6.0pt;
	font-family:symbol;
	color:#777c84;
	mso-themecolor:accent6;}
@list l0:level9
	{mso-level-number-format:bullet;
	mso-level-text:\f0b7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:110.25pt;
	text-indent:-12.25pt;
	mso-ansi-font-size:6.0pt;
	font-family:symbol;
	color:#777c84;
	mso-themecolor:accent6;}
@list l1
	{mso-list-id:427701401;
	mso-list-template-ids:-2050980810;
	mso-list-style-priority:99;
	mso-list-style-name:"Numbered List";}
@list l1:level1
	{mso-level-text:"%1\)";
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:.2in;
	text-indent:-.2in;}
@list l1:level2
	{mso-level-number-format:alpha-lower;
	mso-level-text:"%2\)";
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:.4in;
	text-indent:-.2in;
	color:#575f6d;
	mso-themecolor:text2;}
@list l1:level3
	{mso-level-number-format:roman-lower;
	mso-level-text:"%3\)";
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:.6in;
	text-indent:-.2in;
	color:#575f6d;
	mso-themecolor:text2;}
@list l1:level4
	{mso-level-text:"\(%4\)";
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:.8in;
	text-indent:-.2in;
	color:#575f6d;
	mso-themecolor:text2;}
@list l1:level5
	{mso-level-number-format:alpha-lower;
	mso-level-text:"\(%5\)";
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:1.0in;
	text-indent:-.2in;
	color:#575f6d;
	mso-themecolor:text2;}
@list l1:level6
	{mso-level-number-format:roman-lower;
	mso-level-text:"\(%6\)";
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:1.2in;
	text-indent:-.2in;
	color:#575f6d;
	mso-themecolor:text2;}
@list l1:level7
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:1.4in;
	text-indent:-.2in;
	color:#575f6d;
	mso-themecolor:text2;}
@list l1:level8
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:1.6in;
	text-indent:-.2in;
	color:#575f6d;
	mso-themecolor:text2;}
@list l1:level9
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:1.8in;
	text-indent:-.2in;
	color:#575f6d;
	mso-themecolor:text2;}
@list l2
	{mso-list-id:1496147107;
	mso-list-type:hybrid;
	mso-list-template-ids:51041712 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l2:level1
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l2:level2
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l2:level3
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
@list l2:level4
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l2:level5
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l2:level6
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
@list l2:level7
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l2:level8
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l2:level9
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
-->
</style>
<p>While this post compares the WinForms datagridview with a 3rd party (syncfusion) Grid Control for windows, the same comparison also applies to grid controls in the MVC and ASP.NET webforms world. The same set of 3rd party controls (discussed in this post) are available in each of those environments. </p>
<p><a href="http://www.anujvarma.com/wp-content/uploads/aspdotnet_grid.png"><img fetchpriority="high" decoding="async" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="aspdotnet_grid" border="0" alt="aspdotnet_grid" src="http://www.anujvarma.com/wp-content/uploads/aspdotnet_grid_thumb.png" width="596" height="428"></a>&nbsp;</p>
<h3>Business Data and Grids</h3>
<p>Business data tends to organize itself into rows and columns (witness the success of Lotus123, Excel and other spreadsheet software).</p>
<h3>Windows DataGridView </h3>
<p>For the .NET UI developer, the Windows <a title="DataGridView Class" href="http://cut.ms/Rok">DataGridView</a> is indispensible in that it provides a quick way to organize business data into rows and columns. Sorting, Paging etc. are usually either built in or fairly straightforward to implement. Going beyond the basic sorting (e.g. <a href="http://www.codeproject.com/KB/grid/multicolumn_sort.aspx">multiple column sort</a>) or basic grouping (e.g. multiple column groups) calls for some serious investment in time. More importantly, as we shall see in this post, going beyond just a few 100 KBs of <em>bound </em>data, leads to serious performance degradation – making the DataGridView unsuitable for enterprise level grid/tabular data applications.</p>
<h3>Object Binding</h3>
<p>Object binding refers to the ability to <em>bind </em>a control to a custom data type (your domain objects). In pre-object binding days, one would bind a control directly to the raw data (e.g. an int <em>CustomerID</em> and a string <em>CustomerName</em> retrieved from the datasource). This was a cumbersome approach since most of the data could logically be grouped into custom data types (e.g. <em>Customer</em>). The User Interface was mainly interested in displaying the domain types (e.g. Customer) and less interested in native data types such as ints and strings. This led to the development of object-binding as an alternative to older raw data-binding.</p>
<p>A typical datagridview application that uses object binding will involve the following steps:</p>
<ol>
<li>Fetching Data (usually using ADO.NET and a DataReader/DataTable/DataSet combination).
<li>Storing the fetched data in a local collection (typically an IList&lt;T&gt; where T represents your custom domain object e.g. IList&lt;Customer&gt;).
<li>Converting the IList&lt;Customer&gt; to a BindingList&lt;Customer&gt;
<li>Binding the BindingList to the datagridview </li>
</ol>
<p>For a detailed walkthrough of custom object binding to a datagridview, see this MSDN magazine <a href="http://cut.ms/bqSx">article</a>.</p>
<h3><em>Bound</em> versus <em>Virtual</em> Display Modes</h3>
<p>By default, most datagridview developers use a Display mode called <em>Bound. </em>In this display mode, the data in the grid is automatically bound to the data in the datasource.</p>
<p>This means that the grid view control handles all aspects of fetching the data as well as displaying the data. While this offers convenience, it is the main reason for slower display performance on the DGV.</p>
<blockquote>
<p>Fortunately, there is another display mode available to address this problem.</p>
</blockquote>
<p>This mode is known as the <em>virtual </em>display mode. In this display mode, instead of being bound to the entire datasource, the grid is essentially bound to a small subset (a cached portion) of the datasource. This small subset is the set of data should match the data that is visible on the grid (the exact amount of data is under the programmer’s control). Whenever a user wants to see more data (scrolls the grid), that data is fetched from the datasource, placed into cache – and returned to the grid from the cache. This way, only a small amount of data is ever <em>bound </em>to the grid – and even that only through a memory based cache.&nbsp; This alleviates a lot of issues with the Windows DataGridView – including slow UI refreshes, locked UIs etc.</p>
<h3>Windows DataGridView’s <em>Virtual</em> Display Mode </h3>
<blockquote>
<p align="left"><font size="2">While the </font><a title="DataGridView Class" href="http://cut.ms/Rok"><font size="2">DataGridView</font></a><font size="2"> control is flexible enough to display any IList as its datasource, it starts running into some performance problems for large volumes of data. </font></p>
</blockquote>
<p><font size="2">The <em>Virtual </em>mode in the Windows DataGridView control was designed for just such a purpose – to handle refreshes of large volumes of data. It does this by postponing the rendering of the entire data all at once – and only renders a fixed number of rows and columns at a time. As one tries to scroll down (or up), new data is rendered at that very instant – using predefined events (CellValueNeeded event in the DataGridView).</font></p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #008000">// Enable virtual mode on windows datagridview</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #0000ff">this</span>.dataGridView1.VirtualMode = <span style="color: #0000ff">true</span>;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">&nbsp;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #008000">// Connect the virtual-mode events (scrolling on the datagridview) to event handlers. </span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #0000ff">this</span>.dataGridView1.CellValueNeeded += <span style="color: #0000ff">new</span> DataGridViewCellValueEventHandler(dataGridView1_CellValueNeeded);</pre>
<p><!--CRLF--></div>
</div>
<h3>For even larger volumes of data..</h3>
<p>&nbsp; <font size="2">While the <em>virtual </em>display mode in the DataGridView offers an option to display lots of data without slowing down refresh rates, even this powerful mode starts showing sluggishness for larger amounts of data (several hundred MBs of data).</font></p>
<p><font size="2">What is one to do if one needs to continue displaying data in a grid – and the underlying datasource consists of several hundred(s) MBs of data?</font></p>
<h3>Enter Syncfusion </h3>
<p><font size="2">&nbsp; Syncfusion is a 3rd Party UI library – which contains several advanced controls in its toolbox. It offers a </font><a href="http://cut.ms/Rol"><font size="2">GridControl</font></a><font size="2"> with all the basic grid display capabilities. </font></p>
<p><font size="2">In addition to the basic gridcontrol,&nbsp; it offers something called a </font><a href="http://cut.ms/Rom"><font size="2">GridGroupingControl</font></a><font size="2"> – which is a GridControl on steroids. </font></p>
<p><font size="2">(NOTE: The difference between the GridGroupingControl and the GridControl in Syncfusion is basically in the set of features – the GridGroupingControl has a richer set of features. Performance-wise, they are both comparable). </font></p>
<p><font size="2">The rest of this post summarizes some of my initial experiences as a Syncfusion developer – both in terms of performance as well as built-in capabilities.</font></p>
<h3>Syncfusion Grid Grouping Control Features:&nbsp; Grouping by Multiple Columns, Nested Grids (Hierarchical data)</h3>
<p><a href="http://www.anujvarma.com/wp-content/uploads/NestedTableHierarchy_larger1.png"><img decoding="async" 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="NestedTableHierarchy_larger" border="0" alt="NestedTableHierarchy_larger" src="http://www.anujvarma.com/wp-content/uploads/NestedTableHierarchy_larger_thumb1.png" width="689" height="382"></a></p>
<ol>
<li><font size="3"><br />
<h4>Grouping by multiple columns</h4>
<p></font><font size="2">If one is interested in grouping by not one – but multiple columns, the grouping grid does it with just a couple of lines of code. </font></p>
<li><font size="3"><br />
<h4>Nested grids</h4>
<p></font><font size="2">(to display hierarchical data for example), Syncfusion’s GridGroupingControl provides that out of the box as well (see screenshot above). Note that one can build the same nested table functionality in the Windows DataGridView (using the example shown </font><a href="http://cut.ms/bqSw"><font size="2">here</font></a><font size="2">). </font></p>
<li><font size="3"><br />
<h4>Sorting by more than one column</h4>
<p></font><font size="2">Syncfusion GridGroupingControl provides this type of sorting out of the box as well (whereas one needs to custom build this in the Windows DataGridView as shown in </font><a href="http://cut.ms/bqSN"><font size="2">this article</font></a><font size="2">).</font></li>
</ol>
<h3>&nbsp;</h3>
<h3>Syncfusion Grid Control (and Grid Grouping Control)&nbsp; – Virtual mode and Performance</h3>
<p><font size="2">&nbsp; However, the main reason our team chose Syncfusion was simple – <em>performance</em>. Syncfusion provides a </font><a href="http://cut.ms/Rol"><font size="2">GridControl</font></a><font size="2"> class which also has a <em>virtual mode</em> built in.&nbsp; The virtual mode in Syncfusion’s GridControl works in a similar fashion to Windows DataGridView – by rendering more rows and columns as the user tries to scroll up or down on the grid. The actual events that Syncfusion uses are <em>QueryCellInfo</em> and <em>QueryRowCount</em> (full source code available at the of this post). The snippet below shows the main events that the gridControl needs to have handled.</font></p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #008000">// Enable virtual mode.</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #0000ff">this</span>.dataGridView1.VirtualMode = <span style="color: #0000ff">true</span>;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #008000">// the two relevant events for handling the scroll event on the grid control  </span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #0000ff">this</span>.gridControl1.QueryCellInfo += <span style="color: #0000ff">new</span> Syncfusion.Windows.Forms.Grid.GridQueryCellInfoEventHandler(<span style="color: #0000ff">this</span>.gridControl1_QueryCellInfo);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #0000ff">this</span>.gridControl1.QueryRowCount += <span style="color: #0000ff">new</span> Syncfusion.Windows.Forms.Grid.GridRowColCountEventHandler(<span style="color: #0000ff">this</span>.gridControl1_QueryRowCount);</pre>
<p><!--CRLF--></div>
</div>
<h3>&nbsp;</h3>
<h3>Sample Experiment – Comparing Display Speeds – DataGridView versus Syncfusion Grid </h3>
<p>&nbsp; The source code (included below) uses a simple ArrayList (of Customer objects) – and lets you experiment with the performance of the DataGridView as the number of objects grows. In the sample code, the list of Customers is set to a size of 10,000. At this size, the performance difference between the Windows DatagridView and Syncfusion’s GridControl are already visible. If you try a larger size list, the differences will be even more evident.</p>
<h3>Fetch Time versus Load Time </h3>
<p>The real test of how fast data is displayed on the grid – is the load<em> </em>time (the time taken to display a set of data). We are less concerned here with the data retrieval (fetch) time (for e.g. – retrieving data from an ADO.NET source) – than with the time it takes to display thousands of rows of data.&nbsp; When one runs the two grids (WinForms dgv and Syncfusion’s gridcontrol) side by side, for the same set of data (see the sample solution below), one can see by just plain visual inspection, the Windows DataGridView loads (displays) a lot slower than Syncfusion’s GridControl.</p>
<p>By only loading a small subset of data at a time, the virtual mode eliminates the need to bind to large datasets, thereby providing speedier displays. One doesn’t lose out on the large set of data – since scrolling will fetch as much data as needed – on demand.</p>
<h3>Summary</h3>
<p><font size="2">This article (based on my experience as a Syncfusion developer) shows a side by side performance experiment of the WinForms DataGridView and Syncfusion’s GridControl. Using each of these grids to display the exact same data (10,000 unique customer data records), one can see the different data loading (displaying) speeds. WinForms’ DataGridView starts deteriorating in performance at just a few hundred KBs of display data – in spite of using its own fastest display mode – the <em>virtual </em>display mode.</font></p>
<p><font size="2">&nbsp;</font><a href="http://cut.ms/Ron"><font size="2">Syncfusion’s</font></a><font size="3"><font size="2"> <em>GridControl</em> offers a faster (superfast) alternative to the WinForms <em>DataGridView</em>. In addition to speed, the grid control offers sophisticated UI manipulation features such as nested grids (nested tables), pivot tables, multiple column sorts etc. Other vendors (Infragistics, Telerik etc.) offer similar grid controls, however, in our initial performance centric comparisons, syncfusion’s grid control seemed to be a clear winner.</font> </font></p>
<p><font size="3">&nbsp;&nbsp; </font><font size="2">If your business data is in the tens of hundreds of MBs (as ours was) and needs to be bound to UI controls, chances are you will outgrow the built-in WinForms (and asp.net) controls very quickly. You will need to start looking at 3rd party vendors like Syncfusion and Infragistics to provide you with the UI performance that your application needs.</font></p>
<h3>Source Code </h3>
<p><font size="2">Download Source Code (Need to </font><a href="http://cut.ms/bqSO"><font size="2">download</font></a><font size="2"> and install Syncfusion Essential Studio </font><a href="http://cut.ms/bqSP"><font size="2">Windows Forms Edition 7.3.X</font></a><font size="3"><font size="2"> or above)</font>&nbsp; </font></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:F60BB8FA-6F02-4999-8F5E-9DD4E92C4DA7:50dd070e-8573-4523-a579-86c4a97ed00c" class="wlWriterSmartContent">
<div><a href="http://www.anujvarma.com/wp-content/uploads/SyncfusionGridPerformance.zip" target="_self"><font size="2">SyncfusionGridPerformance.zip</font></a></div>
</div>
<h3>About the Author</h3>
<p>&nbsp; Anuj Varma is a Microsoft .NET architect specializing in high-performance applications. His specific expertise in the .NET framework architecture as well as 3rd party controls (Syncfusion development) built around the framework,&nbsp; makes him a sought after performance expert for .NET applications.&nbsp; Anuj’s experience as a Syncfusion developer makes him a sought after Syncfusion and UI expert. He continues to specialize in Syncfusion’s Essential Suite for building sophisticated web and desktop applications. Most recently, he has worked on an ASP.NET revamp of dell.com and several UPSTREAM applications in the oil and gas industry. All these applications were built with performance (UI performance as well as Data Access Layer performance) as a key driver.</p>
<p>The post <a href="https://www.anujvarma.com/superfast-rendering-of-ui-data-in-winforms-world-2-2/">Superfast display (loading) of data into your UI (WinForms, MVC or ASP.NET)</a> appeared first on <a href="https://www.anujvarma.com">Anuj Varma, Hands-On Technology Architect, Clean Air Activist</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.anujvarma.com/superfast-rendering-of-ui-data-in-winforms-world-2-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Windows DataGridView &#8211; Improving the Data Display (Refresh) Performance</title>
		<link>https://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance/</link>
					<comments>https://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance/#comments</comments>
		
		<dc:creator><![CDATA[Anuj Varma]]></dc:creator>
		<pubDate>Sun, 13 Nov 2011 11:47:49 +0000</pubDate>
				<category><![CDATA[High Performance Desktop Apps]]></category>
		<category><![CDATA[datagridview performance]]></category>
		<category><![CDATA[refresh rate datagridview]]></category>
		<category><![CDATA[data grid view windows]]></category>
		<category><![CDATA[.net datagrid]]></category>
		<category><![CDATA[data grid performance]]></category>
		<category><![CDATA[slow refresh rate datagridview]]></category>
		<category><![CDATA[dgv .net]]></category>
		<category><![CDATA[.net winforms grid]]></category>
		<guid isPermaLink="false">http://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance/</guid>

					<description><![CDATA[<p>&#160; The DataGridView is used everywhere – both in ASP.net apps as well as WinForms apps. A quick google search will reveal the scale of users affected by the slow [&#8230;]</p>
<p>The post <a href="https://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance/">Windows DataGridView &ndash; Improving the Data Display (Refresh) Performance</a> appeared first on <a href="https://www.anujvarma.com">Anuj Varma, Hands-On Technology Architect, Clean Air Activist</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>&nbsp; The DataGridView is used everywhere – both in ASP.net apps as well as WinForms apps. A quick google search will reveal the scale of users affected by the slow refresh rate on the DataGridView control.&nbsp; How the data is displayed is dictated by a property called the <em>Display Mode. </em>The <em>Display Mode </em>that most datagridview users opt for is the <em>Bound mode.</em></p>
<h3>An object-bound datagridview</h3>
<p>Object binding refers to the ability to <em>bind </em>a control to a custom data type (your domain objects). In pre-object binding days, one would bind a control directly to the raw data (e.g. an int <em>CustomerID</em> and a string <em>CustomerName</em> retrieved from the datasource). This was a cumbersome approach since most of the data could logically be grouped into custom data types (e.g. <em>Customer</em>). The User Interface was mainly interested in displaying the domain types (e.g. Customer) and less interested in native data types such as ints and strings. This led to the development of object-binding as an alternative to older raw data-binding.</p>
<p>A typical datagridview application that uses object binding will involve the following steps: </p>
<ol>
<li>Fetching Data (usually using ADO.NET and a DataReader/DataTable/DataSet combination).</li>
<li>Storing the fetched data in a local collection (typically an IList&lt;T&gt; where T represents your custom domain object e.g. IList&lt;Customer&gt;).</li>
<li>Converting the IList&lt;Customer&gt; to a BindingList&lt;Customer&gt; </li>
<li>Binding the BindingList to the datagridview</li>
</ol>
<p>For a detailed walkthrough of custom object binding to a datagridview, see this MSDN magazine <a href="http://cut.ms/bqSx">article</a>.</p>
<h3><em>Bound</em> Display Mode</h3>
<p>For object bound DGVs (datagridviews), the ‘Bound’ mode is the most commonly used display mode. In this mode, the datagridview control is automatically bound to the source of the data – and any changes to the source of the data cause refreshes of the various UI elements of the grid (columns, rows etc.). This offers a degree of convenience that is appealing, at least for small volumes of data. This <em>Bound </em>mode kicks into effect whenever you set the <em>Datasource </em>property on the&nbsp; datagridview as shown in the snippet below. </p>
<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:407f6465-9b22-4129-b6a3-5dbbaf9d8ae1" class="wlWriterSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div>
<div style="background: #ddd; max-height: 300px; overflow: auto">
<ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;">
<li><span style="color:#008000">// Define your BindingList</span></li>
<li style="background: #f3f3f3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#2b91af">BindingList</span>&lt;<span style="color:#0000ff">object</span>&gt; bindableDataSource = <span style="color:#0000ff">new</span> <span style="color:#2b91af">BindingList</span>&lt;<span style="color:#0000ff">object</span>&gt;();</li>
<li>&nbsp;</li>
<li style="background: #f3f3f3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#008000">// Add some data to the bindingList</span></li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#2b91af">BindingList</span>&lt;<span style="color:#0000ff">object</span>&gt; list = CreateData();</li>
<li style="background: #f3f3f3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#0000ff">foreach</span> (<span style="color:#0000ff">object</span> item <span style="color:#0000ff">in</span> list)</li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{</li>
<li style="background: #f3f3f3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;bindableDataSource.Add(item);</li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</li>
<li style="background: #f3f3f3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#008000">// This actually &#39;binds&#39; the gridview to the BindingList. Any changes to the BindingList from here on affect the gridview.</span></li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#008000">// For e.g. &#8211; The &#39;bound&#39; gridview would refresh its layout every time a new item is added to this BindingList</span></li>
<li style="background: #f3f3f3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dataGridView1.DataSource = bindableDataSource;</li>
</ol></div>
</p></div>
</p></div>
<h3>The Problem with <em>Bound </em>display mode</h3>
<p>The first indications of problems with the <em>bound </em>mode are visible as soon as you start adding additional items to the source list (while the grid is bound to it). Note that it is possible to add additional items without binding the grid – and then performing the binding step at the very end – as shown in the snippet above. However, even with this approach, at some point, you may need to add/delete items from the source list – causing unnecessary refreshes. More serious problems with the DataGridView start manifesting themselves as the size of the bound collection grows. For larger sets of data, this problem grows to unacceptable response times.</p>
<h3>Enter Virtual Mode</h3>
<p>By default, most datagridview developers use a Display mode called <em>Bound. </em>In this display mode, the data in the grid is automatically bound to the data in the datasource. This means that the grid view control handles all aspects of fetching the data as well as displaying the data. While this offers convenience, it is the main reason for slower display performance on the DGV. Fortunately, there is another display mode available to address this problem. This mode is known as the <em>virtual </em>display mode. In this display mode, instead of being bound to the entire datasource, the grid is essentially bound to a small subset (a cached portion) of the datasource. This small subset is the set of data should match the data that is visible on the grid (the exact amount of data is under the programmer’s control). Whenever a user wants to see more data (scrolls the grid), that data is fetched from the datasource, placed into cache – and returned to the grid from the cache. This way, only a small amount of data is ever <em>bound </em>to the grid – and even that only through a memory based cache.&nbsp; This alleviates a lot of issues with the Windows DataGridView – including slow UI refreshes, locked UIs etc.</p>
<h3>Quick Conversion from <em>bound </em>to <em>virtual </em>(full source code at the end of this post)</h3>
<p>In your source code, if you are using the <em>bound </em>display mode (happens by default if you set the ‘datasource property) you will be setting the <em>datasource </em>property on your gridview somewhere – e.g. </p>
<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:09575649-dadd-4b2b-afff-5dc249175e1c" class="wlWriterSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div>
<div style="background: #ddd; max-height: 300px; overflow: auto">
<ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;">
<li><span style="color:#0000ff">this</span>.dataGridView1.DataSource = _customers;</li>
</ol></div>
</p></div>
</p></div>
<p>Instead of setting this datasource property, what you will need to do is <em>initialize</em> the grid to use <em>virtual </em>mode. This is shown in the snippet below (full source code included at the end of this post).</p>
<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:11b1380f-6c39-4f34-8e10-9eced04a6691" class="wlWriterSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div>
<div style="background: #ddd; max-height: 300px; overflow: auto">
<ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;">
<li><span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> InitializeGrid()</li>
<li style="background: #f3f3f3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{</li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#008000">// Enable virtual mode.</span></li>
<li style="background: #f3f3f3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#0000ff">this</span>.dataGridView1.VirtualMode = <span style="color:#0000ff">true</span>;</li>
<li>&nbsp;</li>
<li style="background: #f3f3f3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#008000">// Connect the virtual-mode events to event handlers. </span></li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#0000ff">this</span>.dataGridView1.CellValueNeeded += <span style="color:#0000ff">new</span></li>
<li style="background: #f3f3f3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#2b91af">DataGridViewCellValueEventHandler</span>(dataGridView1_CellValueNeeded);</li>
</ol></div>
</p></div>
</p></div>
<p>The actual <em>dataGridView1_CellValueNeeded </em>event is where the event to request more data is handled.&nbsp; The included source code below provides a quick implementation of the virtual display mode – which should work for simple use cases. For a <a href="http://cut.ms/bqSH">full walkthrough</a> on a virtual mode implementation, see MSDN.</p>
<h3>What if the Virtual Mode is still sluggish?</h3>
<p>If the performance of virtual mode is still sluggish for your data (if you have several thousands of rows of data), chances are you need to look elsewhere. There are several 3rd party grid controls on the market – including Infragistics, Syncfusion and Telerik. One such grid that I have worked with extensively is Syncfusion’s Grid Control. On my project, we were handling several hundred MBs of data in the grid – with refreshes occurring in real-time or near real-time (i.e. no sluggishness).&nbsp; A performance comparison is detailed in an <a href="http://cut.ms/bqSI">earlier post</a>.</p>
<p>In addition to the speed, you also get a host of features that I like to call <em>Grid on Steroids </em>features. These include <em>nested grids </em>(which make it possible to efficiently display hierarchical data), multiple column sorts (which isn’t available out of the box in Windows DataGridView – but can be <a href="http://cut.ms/bqSN">custom built</a>), pivot tables and more.</p>
</p>
<h3>Summary</h3>
<p>If you are witnessing slow rendering (sluggish rendering) of your datagridview in your WinForms (or ASP.NET ) application, chances are you are using automatic binding (<em>bound </em>display mode). Chances are that you will experience a significant benefit from trying the <em>virtual </em>display mode built into the gridview. This display mode <em>binds </em>to a smaller, cached subset of the full data, allowing quicker UI refreshes. The sample attached here shows a grid using the <em>bound </em>mode and another grid using <em>virtual </em>mode (both with identical 10000 rows of customer data). Even with this simple sample of a few 100 KBs of data, a noticeable difference can be seen (by visual inspection) when one tries to scroll down the grid to view more rows. The refresh rate of the <em>virtual </em>mode grid clearly wins out.&nbsp; If you find the <em>virtual </em>mode also insufficient for your application’s volume of data, you might need something like <a href="http://cut.ms/bqSI">the syncfusion grid</a>. </p>
<h3>Source Code</h3>
<p>Download Full Solution  </p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:F60BB8FA-6F02-4999-8F5E-9DD4E92C4DA7:fcb41de7-8b44-425e-8a55-db79b2c500ec" class="wlWriterSmartContent">
<div><a href="http://www.anujvarma.com/wp-content/uploads/VirtualMode_DataGridView.zip" target="_self">VirtualMode_DataGridView.zip</a></div>
</div>
<h3>About the Author</h3>
<p>&nbsp; Anuj Varma is a Microsoft .NET architect specializing in high-performance applications. His specific expertise in the .NET framework architecture as well as 3rd party controls (such as Syncfusion) built around the framework,&nbsp; makes him a sought after performance expert for .NET applications. Most recently, he has worked on an ASP.NET revamp of dell.com as well as a WinForms app used to map Ocean floors (Petrel). Both these applications were built with performance (UI performance as well as Data Access Layer performance) as a key driver. In addition to WinForms and ASP.NET apps, Anuj works hands-on in the WCF and Azure arena to bring performance to existing SOA apps. Some of Anuj’s personal websites include <em><a href="http://cut.ms/bqSQ">anujvarma.com</a>, </em>&nbsp;<a href="http://cut.ms/bqSR"><em>AspDotnetArchitect.com</em></a><em> and </em><a href="http://cut.ms/blI1"><em>RecruitersToAvoid.com</em></a><em>.</em></p>
<p>The post <a href="https://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance/">Windows DataGridView &ndash; Improving the Data Display (Refresh) Performance</a> appeared first on <a href="https://www.anujvarma.com">Anuj Varma, Hands-On Technology Architect, Clean Air Activist</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.anujvarma.com/windows-datagridview-improving-the-data-display-refresh-performance/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Content Delivery Network via N/A
Minified using Disk

Served from: www.anujvarma.com @ 2026-10-25 23:25:49 by W3 Total Cache
-->