<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-212466922876102678</atom:id><lastBuildDate>Wed, 18 Mar 2026 07:27:40 +0000</lastBuildDate><category>GridView</category><category>ASP.NET</category><category>CoolGridView</category><category>IdeaSparks</category><category>UpdatePanel</category><category>AJAX Control Toolkit</category><category>CodePlex</category><category>CoolControls</category><category>AJAX</category><category>ASP.NET 2.0</category><category>Fix Headers</category><category>Fixed footer</category><category>Fixed header</category><category>Footer</category><category>Pager</category><category>Scrollable</category><category>Scrolling</category><category>AJAX Control</category><category>AjaxControlToolkit</category><category>Android</category><category>Battery Saver</category><category>Buffer</category><category>Buffering</category><category>C#</category><category>COL</category><category>COLGROUP</category><category>Cache</category><category>Callbacks</category><category>Columns</category><category>Control Toolkit</category><category>Data Binding</category><category>DefaultColumnWidth</category><category>Footer Pager</category><category>Header</category><category>IDataReader</category><category>IE 6</category><category>IQueryable</category><category>IdeaSparx</category><category>Internet Explorer 6</category><category>JavaScript</category><category>LinqDataSource</category><category>Paging</category><category>Power Saver</category><category>Resizable</category><category>Resizable columns</category><category>Resize</category><category>Resize column</category><category>Resizeable</category><category>Scroll Position</category><category>SqlDataReader</category><category>Streaming</category><category>Theme</category><category>UpdatePane</category><category>Visual Web Express 2008</category><category>apply context</category><category>asynchronous</category><category>background</category><category>battery</category><category>cross-browser</category><category>data-pages</category><category>event handler</category><category>fixed column header</category><category>free android application</category><category>free battery saver</category><category>l CoolGridView</category><category>power</category><category>productivity</category><category>scrollable content</category><category>threading</category><category>tool</category><title>IdeaSparx</title><description>“Imagination is more important than knowledge. For while knowledge defines all we currently know and understand, imagination points to all we might yet discover and create.” - Albert Einstein</description><link>http://johnsobrepena.blogspot.com/</link><managingEditor>noreply@blogger.com (John Eric Sobrepena)</managingEditor><generator>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-6351484594893093604</guid><pubDate>Sun, 01 Jul 2012 03:39:00 +0000</pubDate><atom:updated>2012-06-30T21:07:10.279-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">battery</category><category domain="http://www.blogger.com/atom/ns#">Battery Saver</category><category domain="http://www.blogger.com/atom/ns#">free android application</category><category domain="http://www.blogger.com/atom/ns#">free battery saver</category><category domain="http://www.blogger.com/atom/ns#">power</category><category domain="http://www.blogger.com/atom/ns#">Power Saver</category><category domain="http://www.blogger.com/atom/ns#">productivity</category><category domain="http://www.blogger.com/atom/ns#">tool</category><title>PowerGuard - Free Android Power Management Application</title><description>Hello everyone. It has been so long since I made a post. I would like to thank all the subscribers, viewers and developers out there that provided feedback, encouragement and contribution to the ASP.NET CoolGrodView open-source project.&lt;br /&gt;
&lt;br /&gt;
I have made a shift to Android development and therefore I am not doing any active development or update on IdeaSparx CoolGridView at this point in time. Having said that, I would like to announce one of my&lt;a href=&quot;https://play.google.com/store/apps/details?id=jes.ideasparx.com&quot; target=&quot;_blank&quot;&gt; free Android application called PowerGuard&lt;/a&gt;.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://play.google.com/store/apps/details?id=jes.ideasparx.com&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFkthiHq7XQq5r3QIGm4hs2hvCqEHCWJQBIojIZVAoV_WulGSc2pJdEU4xcK0y3DpsCG_pE7b-uYsGcBtWZDyKxtOgINBi1h_3IknaChVZo0GLLID9pF8aPhVC5Ek6GyLRcuX_F_Q_0ec/s1600/icon.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;PowerGuard&lt;/b&gt; defends the battery power of an Android device from power hungry WiFi and 2G/3G data connections. It regulates these WiFi and/or 2G/3G connections based on the need and configuration of a user. It extends battery life to lasts almost twice the amount of time than without it - given the same usage behavior.&amp;nbsp;PowerGuard will always try to connect through WiFi and 2G/3G first. If it is unable to make a connection through WiFi, after some delay it will disable WiFi to conserve more battery power.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Screenshot&lt;/b&gt;&lt;br /&gt;
&lt;table style=&quot;margin-left: -1em;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;     &lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_P-EeZxNukVe8pFDwpcFrEQi5bIbGyf_VzwLRkNFdV3doOqncj4bMzn6y8jhAA06dhmBShq58tER0icMKkHy4MZyHB6MbQDDYwNBlRX5ZuoKRWWJ1-F7Hh_bVMWPWBpg85vosyqrttkQ/s1600/01.jpg&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_P-EeZxNukVe8pFDwpcFrEQi5bIbGyf_VzwLRkNFdV3doOqncj4bMzn6y8jhAA06dhmBShq58tER0icMKkHy4MZyHB6MbQDDYwNBlRX5ZuoKRWWJ1-F7Hh_bVMWPWBpg85vosyqrttkQ/s200/01.jpg&quot; width=&quot;119&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo4vkrIvAMo8VxhbVccg_-VuLxpbb2NylRg8tMLNWrQKm6RKuPwvtIY6FC3IjCopvvniNhNrUetcVGXMC_cdGLrjCZdrBbqt_jrobQ39dQRlTFTxRydwUErqpTAJhBJpd96tMbshGzghQ/s1600/06.jpg&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo4vkrIvAMo8VxhbVccg_-VuLxpbb2NylRg8tMLNWrQKm6RKuPwvtIY6FC3IjCopvvniNhNrUetcVGXMC_cdGLrjCZdrBbqt_jrobQ39dQRlTFTxRydwUErqpTAJhBJpd96tMbshGzghQ/s200/06.jpg&quot; width=&quot;119&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQm4ivU1xTkIP20aCAJT2pogGfxswDCjaEEVktUE3agREpPSDOQuT3B0o_6ehxqG0bZl2sZ7d8aBG4jVS9tP7Hpco4NKAK1n6ZXyW5hZ419azT3VS7J7w1Bx6R4s_TCmg5CN9Ir_fV_Kc/s1600/07.jpg&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQm4ivU1xTkIP20aCAJT2pogGfxswDCjaEEVktUE3agREpPSDOQuT3B0o_6ehxqG0bZl2sZ7d8aBG4jVS9tP7Hpco4NKAK1n6ZXyW5hZ419azT3VS7J7w1Bx6R4s_TCmg5CN9Ir_fV_Kc/s200/07.jpg&quot; width=&quot;119&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTvYov-W9dlbAhyBTtcZzTM7Nm9d-p1sLAvp4iq9xE0-3TcbveRrlnWa3BoEvU8mOc6Twa-R2IbdSTKlap3524lzboQuantzhfpHwDOk94UdpDRUUUOQYrF285mpPPzYwpaVgCq9qnVmU/s1600/02.jpg&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTvYov-W9dlbAhyBTtcZzTM7Nm9d-p1sLAvp4iq9xE0-3TcbveRrlnWa3BoEvU8mOc6Twa-R2IbdSTKlap3524lzboQuantzhfpHwDOk94UdpDRUUUOQYrF285mpPPzYwpaVgCq9qnVmU/s200/02.jpg&quot; width=&quot;119&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;Features&lt;/b&gt;&lt;br /&gt;
★ Choose connection method whether to use WiFi only, 2G/3G only or both.&lt;br /&gt;
★ Turn on Wi-Fi/3G only when specific application is opened.&lt;br /&gt;
★ Option to ask subtly (using notification bar) if you need internet when an application is opened.&lt;br /&gt;
★ Turn on Wi-Fi/3G when device is unlocked. This only works if application monitoring is off.&lt;br /&gt;
★ Turn off Wi-Fi/3G when display goes off.&lt;br /&gt;
★ Schedule when Wi-Fi/3G should turn on or off every day.&lt;br /&gt;
★ Make periodic Wi-Fi/3G connection at specific duration when device&#39;s display is off giving the device more time to enter into sleep mode but still give a chance for your emails to synchronize.&lt;br /&gt;
★ Hit Emergency Connect in notification to enable Wi-Fi/3G connection for 30mins (configurable) then turns off automatically.&lt;br /&gt;
★ Disable Power Guard when certain battery power level is reached.&lt;br /&gt;
★ Shows battery level and temperature in notification area.*&lt;br /&gt;
★ Shows WiFi and 2G/3G connectivity status in notification area.*&lt;br /&gt;
★ Widget to enable or disable Service*&lt;br /&gt;
★ Widget to enable or disable Emergency connection to internet.*&lt;br /&gt;
★ Widget that displays battery level and temperature.*&lt;br /&gt;
&lt;br /&gt;
*Note: Available in Pro version only&lt;br /&gt;
&lt;br /&gt;
Try it out at &lt;a href=&quot;https://play.google.com/store/apps/details?id=jes.ideasparx.com&quot; target=&quot;_blank&quot;&gt;Google Playstore&lt;/a&gt;. Thank you everyone for your support.&lt;br /&gt;
&lt;br /&gt;</description><link>http://johnsobrepena.blogspot.com/2012/06/hello-everyone.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFkthiHq7XQq5r3QIGm4hs2hvCqEHCWJQBIojIZVAoV_WulGSc2pJdEU4xcK0y3DpsCG_pE7b-uYsGcBtWZDyKxtOgINBi1h_3IknaChVZo0GLLID9pF8aPhVC5Ek6GyLRcuX_F_Q_0ec/s72-c/icon.png" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-1702732942122732920</guid><pubDate>Mon, 08 Feb 2010 04:32:00 +0000</pubDate><atom:updated>2010-02-08T15:42:14.921-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET 2.0</category><category domain="http://www.blogger.com/atom/ns#">CoolControls</category><category domain="http://www.blogger.com/atom/ns#">CoolGridView</category><category domain="http://www.blogger.com/atom/ns#">GridView</category><title>Build 20100207 fixes alignment of header&#39;s and table cell&#39;s width of CoolGridView</title><description>A new build release (Build 20100207) of CoolControls is now available at &lt;a href=&quot;http://ideasparks.codeplex.com/&quot;&gt;codeplex&lt;/a&gt;. Build 20100207 contains the following changes:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;COLGROUP and COL&lt;/b&gt; is back! These are generated for the header, table content and footer. This feature can align the header and table cell&#39;s width of CoolGridView.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AllowResizeColumn&lt;/b&gt;&amp;nbsp;property is added&amp;nbsp;to CoolGridView. Set this property to &lt;b&gt;true&lt;/b&gt;&amp;nbsp;to enable user to&amp;nbsp;resize &amp;nbsp;the columnns manually, set it to &lt;b&gt;false&lt;/b&gt;&amp;nbsp;to disable. The default value of this property if &lt;b&gt;true&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><link>http://johnsobrepena.blogspot.com/2010/02/build-20100207-fixes-alignment-of.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><thr:total>41</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-3337027845912342839</guid><pubDate>Mon, 01 Feb 2010 15:05:00 +0000</pubDate><atom:updated>2010-02-01T07:08:43.191-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">COL</category><category domain="http://www.blogger.com/atom/ns#">COLGROUP</category><category domain="http://www.blogger.com/atom/ns#">CoolControls</category><category domain="http://www.blogger.com/atom/ns#">CoolGridView</category><category domain="http://www.blogger.com/atom/ns#">DefaultColumnWidth</category><category domain="http://www.blogger.com/atom/ns#">GridView</category><category domain="http://www.blogger.com/atom/ns#">IdeaSparks</category><category domain="http://www.blogger.com/atom/ns#">IdeaSparx</category><category domain="http://www.blogger.com/atom/ns#">Theme</category><title>CoolGridView February 2010 Release</title><description>&lt;a href=&quot;http://www.blogger.com/&quot;&gt;&lt;/a&gt;&lt;span id=&quot;goog_1265030397472&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_1265030397473&quot;&gt;&lt;/span&gt;The newest release of CoolGridView is available for &lt;a href=&quot;http://ideasparks.codeplex.com/&quot;&gt;download&lt;/a&gt;. There are a handful enhancements, optimizations and bug fixes in this release. Here are the ones worth mentioning.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;DefaultColumnWidth Property&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You can now define the default column width of CoolGridView columns through the &lt;b&gt;DefaultColumnWidth&lt;/b&gt; property. The value for this property can not be of type &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.unittype.aspx&quot;&gt;UnitType.Percentage&lt;/a&gt;. On older releases of CoolControls, if a HeaderStyle-Width is not defined for a data column, it defaults to 100px. This value is&amp;nbsp;hard coded inside the control. Now you can specify your own default column width. I got a lot of requests to allow column and table widths to be specified in percentage. Allowing column or table widths to be in percentage and at the same time making sure that&amp;nbsp;the column widths can still be resized by the properly is a great challenge. However, rest assured that I am not dropping this request and that the development of this functionality is still being considered.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;SPAN inside Table Cell&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
There was a bug in CoolGridView when displayed in IE 6 and 7. It was reported by developers that it seems that the style &quot;white-space:nowrap&quot; does not behave properly when applied to TD and TH element when the &quot;width&quot; is also defined in the style. Consider the following code:&lt;br /&gt;
&lt;pre class=&quot;brush : html&quot;&gt;&amp;lt;table style=&quot;table-layout:fixed;width:90px&quot; border=&quot;1&quot;&amp;gt;
 &amp;lt;tr&amp;gt;
  &amp;lt;td style=&quot;white-space:nowrap; width:30px; overflow:hidden;&quot;&amp;gt;Test inside the cell.&amp;lt;/td&amp;gt;
  &amp;lt;td style=&quot;white-space:nowrap; width:30px; overflow:hidden;&quot;&amp;gt;Test inside the cell.&amp;lt;/td&amp;gt;
  &amp;lt;td style=&quot;white-space:nowrap; width:30px; overflow:hidden;&quot;&amp;gt;Test inside the cell.&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/pre&gt;
If you view the code above in IE 6 or 7, you will see that the text inside the cell wraps and breaks on white spaces even though the style was set not to wrap on white spaces.&amp;nbsp;The fix for this is to put a SPAN that encloses the text inside the cell and put the style &quot;white-space:nowrap&quot; on the SPAN instead of the TD. The code below now works properly in IE 6 or 7. CoolGridView uses something similar to this but uses CSS instead.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&amp;lt;table style=&quot;table-layout:fixed;width:90px&quot; border=&quot;1&quot;&amp;gt;
 &amp;lt;tr&amp;gt;
  &amp;lt;td style=&quot;width:30px; overflow:hidden;&quot;&amp;gt;&amp;lt;span style=&quot;white-space:nowrap;&quot;&amp;gt;Test inside the cell.&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;
  &amp;lt;td style=&quot;width:30px; overflow:hidden;&quot;&amp;gt;&amp;lt;span style=&quot;white-space:nowrap;&quot;&amp;gt;Test inside the cell.&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;
  &amp;lt;td style=&quot;width:30px; overflow:hidden;&quot;&amp;gt;&amp;lt;span style=&quot;white-space:nowrap;&quot;&amp;gt;Test inside the cell.&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;&quot;Gradient&quot; Theme&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
There is a theme included in the sample project in this release that gives a 3D look on the table headers. In this theme, the white spaces inside the cell is not set to wrapped. When user resizes the column width and if text does not fit inside the cell, ellipsis will appear at the end of the text to indicate that there are portion of the text that is hidden.&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitrE6ift0NFmKsMMxH5PPRYFoqC23IwzozUArVdjwhbABtSoIEiOqeXPv1P5oJQxjUo8_9ldeeEpAVX3S-lIRaL6LOBmY5ggLZq8NUOkk2qWAH16fcKtfhoTU55X8am_dmlkHIySpvsb8/s1600-h/screenshot2.jpg&quot; style=&quot;margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitrE6ift0NFmKsMMxH5PPRYFoqC23IwzozUArVdjwhbABtSoIEiOqeXPv1P5oJQxjUo8_9ldeeEpAVX3S-lIRaL6LOBmY5ggLZq8NUOkk2qWAH16fcKtfhoTU55X8am_dmlkHIySpvsb8/s400/screenshot2.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To use this theme, you have to copy the &quot;Gradient&quot; folder into your &quot;App_Themes&quot; directory and copy the headerbg.gif file into your website in the location &quot;\images\&quot;. Set EnableTheming to &quot;True&quot; for your ASPX page and set the Theme property to &quot;Gradient&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhltZW7aNNc6w6Rx3g80I-ucTIhCGD73o7y93rhIJPEGxYdILAIXc_da_cKPymkackTl6h8jfLpO7ZqC42pWRh5-KPf4-BdM-dJ5NHMDwhS2gdRBqWL662oWcxbMmhyphenhyphenK4b3TN5NXzbp4cQ/s1600-h/screen3.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhltZW7aNNc6w6Rx3g80I-ucTIhCGD73o7y93rhIJPEGxYdILAIXc_da_cKPymkackTl6h8jfLpO7ZqC42pWRh5-KPf4-BdM-dJ5NHMDwhS2gdRBqWL662oWcxbMmhyphenhyphenK4b3TN5NXzbp4cQ/s320/screen3.JPG&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;COLGROUP and COL Elements Removed&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Older releases of CoolGridView generates COLGROUP and COL html tags to control the column widths. However, the control does not render properly in the browser if the entire cells for a column is hidden using the style &quot;display: none&quot;. Therefore, COLGROUP and COL were removed.&lt;br /&gt;
&lt;br /&gt;
For more information of what are the other changes, you can read the release notes included in the &lt;a href=&quot;http://ideasparks.codeplex.com/&quot;&gt;latest build&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Have a great week everyone!</description><link>http://johnsobrepena.blogspot.com/2010/02/coolgridview-february-2010-release.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitrE6ift0NFmKsMMxH5PPRYFoqC23IwzozUArVdjwhbABtSoIEiOqeXPv1P5oJQxjUo8_9ldeeEpAVX3S-lIRaL6LOBmY5ggLZq8NUOkk2qWAH16fcKtfhoTU55X8am_dmlkHIySpvsb8/s72-c/screenshot2.jpg" height="72" width="72"/><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-3694691739304538062</guid><pubDate>Mon, 25 Jan 2010 15:37:00 +0000</pubDate><atom:updated>2010-01-27T05:39:34.607-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AJAX Control</category><category domain="http://www.blogger.com/atom/ns#">AjaxControlToolkit</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET 2.0</category><category domain="http://www.blogger.com/atom/ns#">CodePlex</category><category domain="http://www.blogger.com/atom/ns#">CoolGridView</category><category domain="http://www.blogger.com/atom/ns#">Fix Headers</category><category domain="http://www.blogger.com/atom/ns#">Footer</category><category domain="http://www.blogger.com/atom/ns#">GridView</category><category domain="http://www.blogger.com/atom/ns#">IdeaSparks</category><category domain="http://www.blogger.com/atom/ns#">Pager</category><category domain="http://www.blogger.com/atom/ns#">Resizable columns</category><category domain="http://www.blogger.com/atom/ns#">Resize column</category><category domain="http://www.blogger.com/atom/ns#">Scroll Position</category><category domain="http://www.blogger.com/atom/ns#">UpdatePanel</category><title>CoolGridView New Release : Resizable Column Widths and Keeping Scroll Position</title><description>I am pleased to announce that CoolGridView control for ASP.NET 2.0 now allows &lt;b&gt;user-resizable columns&lt;/b&gt; and &lt;b&gt;it remembers the current scroll position and column widths&lt;/b&gt; after a postback or callback. &lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5MA11yHx_yb9e4qcsKj-9HAyF2l_UQ-xNKboAyoWVo4zDL4ndAusbTnvTnYBtOcO-RmboXe3tJumHqYspLBSVnnCInq-Oi1GBM2cRlgrzyNXxCsUR97AfiNfc2dELlcqYYI5zy6IsMUA/s1600-h/screen-resizable.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5MA11yHx_yb9e4qcsKj-9HAyF2l_UQ-xNKboAyoWVo4zDL4ndAusbTnvTnYBtOcO-RmboXe3tJumHqYspLBSVnnCInq-Oi1GBM2cRlgrzyNXxCsUR97AfiNfc2dELlcqYYI5zy6IsMUA/s320/screen-resizable.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
You can download the latest release at&amp;nbsp;&lt;a href=&quot;http://ideasparks.codeplex.com/&quot;&gt;Codeplex.com&lt;/a&gt;. Here are the following changes in this release (Build 20100124). Please take note that item #1 and #2 and breaking changes. If you are going to replace your CoolGridView from old releases with this new one, please modify your code according to the instructions provided.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;CoolCore.js and CoolCore.cs were added to IdeaSparx.CoolControls.Web project.&lt;/li&gt;
&lt;li&gt;If you are using CoolGridView inside an UpdatePanel, the add-on script is not needed anymore. You should remove the JavaScript code (as shown here) from your ASPX page. This functionality is now fully integrated in the CoolGridView control. &lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;//Remove this JavaScript from your ASPX
function AjaxEndRequestHandler(sender, args) {
    var p = sender._updatePanelClientIDs;
    if (p != null)
    for (var j = 0; j &amp;lt; p.length; j++) {
        var scripts = $get(p[j]).getElementsByTagName(&quot;script&quot;);
        // .text is necessary for IE.
        for (var i = 0; i &amp;lt; scripts.length; i++) {
            try {
                eval(scripts[i].innerHTML || scripts[i].text);
            } catch (e2) { }
        }
    }
}

try {Sys.WebForms.PageRequestManager.getInstance() .add_endRequest(AjaxEndRequestHandler);
}catch (e) { }
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;User can resize column headers&#39; width.&lt;/li&gt;
&lt;li&gt;Column header and scroll position&amp;nbsp;are preserved after a postback or callback.&lt;/li&gt;
&lt;/ol&gt;
What a great way to start the week!&lt;br /&gt;
&lt;br /&gt;
Have a great Monday everyone.&lt;br /&gt;
&lt;br /&gt;</description><link>http://johnsobrepena.blogspot.com/2010/01/coolgridview-new-release-resizable.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5MA11yHx_yb9e4qcsKj-9HAyF2l_UQ-xNKboAyoWVo4zDL4ndAusbTnvTnYBtOcO-RmboXe3tJumHqYspLBSVnnCInq-Oi1GBM2cRlgrzyNXxCsUR97AfiNfc2dELlcqYYI5zy6IsMUA/s72-c/screen-resizable.JPG" height="72" width="72"/><thr:total>21</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-7314490004841790970</guid><pubDate>Fri, 22 Jan 2010 07:47:00 +0000</pubDate><atom:updated>2010-01-21T23:54:01.987-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">CoolGridView</category><category domain="http://www.blogger.com/atom/ns#">Data Binding</category><category domain="http://www.blogger.com/atom/ns#">GridView</category><category domain="http://www.blogger.com/atom/ns#">IQueryable</category><category domain="http://www.blogger.com/atom/ns#">LinqDataSource</category><title>Data Bind CoolGridView to IQueryable&lt;&gt;</title><description>I recently received a question about how to data bind CoolGridView to an object of type IQueryable&amp;lt;&amp;gt; with automatic sorting and paging. CoolGridView extends&amp;nbsp;ASP.NET GridView control. GridView does not directly support DataSource of type IQueryable&amp;lt;&amp;gt;, and the same is true for CoolGridView. We can use LinqDataSource control to bridge the gap. Quickly bind CoolGridView control to IQueryable&amp;lt;&amp;gt; with automatic sorting and paging capability by following these easy steps. &lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Drop a CoolGridView and a LinqDataSource control into your ASPX page. &lt;/li&gt;
&lt;li&gt;In the &quot;Properties&quot; toolbox, set the DataSourceID of CoolGridView to point to your LinqDataSource control. Set the properties of CoolGridView control to the following: &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;AllowPaging : True &lt;/li&gt;
&lt;li&gt;AllowSorting : True &lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Handle the &quot;Selecting&quot; event of LinqDataSource&lt;/li&gt;
&lt;li&gt;In the &quot;Selecting&quot; event handler, call your method that returns an IQueryable&amp;lt;&amp;gt; object and assign it to the event argument&#39;s property &quot;e.Result&quot;. &lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
There you have it!&lt;br /&gt;
&lt;br /&gt;
Have a great weekend everyone.&lt;br /&gt;</description><link>http://johnsobrepena.blogspot.com/2010/01/data-bind-coolgridview-to-iqueryable.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-8664877325163706857</guid><pubDate>Mon, 18 Jan 2010 11:41:00 +0000</pubDate><atom:updated>2010-01-21T23:57:47.573-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AJAX Control Toolkit</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">CoolGridView</category><category domain="http://www.blogger.com/atom/ns#">Fixed footer</category><category domain="http://www.blogger.com/atom/ns#">Fixed header</category><category domain="http://www.blogger.com/atom/ns#">GridView</category><category domain="http://www.blogger.com/atom/ns#">Internet Explorer 6</category><category domain="http://www.blogger.com/atom/ns#">Scrollable</category><category domain="http://www.blogger.com/atom/ns#">Scrolling</category><category domain="http://www.blogger.com/atom/ns#">UpdatePanel</category><title>Down Memory Lane - How this idea sparked</title><description>&lt;br /&gt;
Four months back I started this blog and my open-source project - &lt;a href=&quot;http://ideasparks.codeplex.com/&quot;&gt;IdeaSparx CoolControls&lt;/a&gt;. I am a fan of ASP.NET 2.0 GridView. In my opinion it is simple yet flexible, plain yet lightweight, unsophisticated yet powerful. GridView control is well designed that it is easy to customize and extend. Not only that, it is also possible to extend GridView so that it can nearly match any popular and commercially available third-party controls out there. The only thing, of course, is that it requires a lot of work. But the huge amount of &quot;sweat&quot; i put into this is all worth it. I have this monumental dream which I planned out in my head that someday, somewhere, somehow (haha, now i am being a bit melodramatic..) &amp;nbsp;the ASP.NET community will have an open-source alternative over the commercially available grid controls. Therefore, I named this dream project - IdeaSparx CoolControls.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;All About IdeaSparx CoolControls&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
One of its controls is CoolGridView which extends ASP.NET 2.0 GridView. At the end of 2009, CoolGridView was able to render GridView with fixed header, footer or pager and scrollable content. Now think about these features - resizable columns, rearrange columns, present hierarchical data, selective area reloading through AJAX, feature-rich Visual Studio designer support, sorting using multiple columns, data grouping, data binding tools for complex data structures, enhanced data editing and delivery of data-pages through streaming. I think these features are very much possible! Don&#39;t you think its cool? (hence, the name CoolGridView, by the way :) &amp;nbsp;my next installment - having a CoolGridView with resizable columns is already on the way.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Thinking Ahead : To Infinity and beyond..&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This year I have decided to jump a little higher and put a little more &quot;sweat&quot; into the project. And surely I will be blogging more about it. But I cannot run the next mile alone.. I need your help. Your inputs are very valuable (not to mention, it boosts my confidence from zero to maybe, 10). Whenever I log on and see a few comments which meant somebody out there finds this dream of mine workable, doable.. possible, I literally dash to my work desk and start pounding on my keyboard and try to do my best to keep you all in the loop of things.&lt;br /&gt;
&lt;br /&gt;
I am glad to tell everyone that because of the recent string of feedback I received in the past couple of months, we were able to make CoolGridView more stable . We were able to make sure that the features worked perfectly on different browsers - &lt;b&gt;Internet Explorer 8/7/6, Firefox 3.5/3.0, Safari and Chrome.&lt;/b&gt; This was made possible because you have all used the control and provided feedback. It&#39;s Teamwork, i guess so I thank you. I am indeed very grateful.&lt;br /&gt;
&lt;br /&gt;
I hope that you would all stand by me in making this distant dream of mine a reality. This year let&#39;s create a CoolGridView control that is easy to use and packed with lots of useful features.&lt;br /&gt;
&lt;br /&gt;
&quot;To infinity and beyond...&quot;&lt;br /&gt;
&lt;br /&gt;</description><link>http://johnsobrepena.blogspot.com/2010/01/down-memory-lane-how-this-idea-sparked.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-3041996826738084081</guid><pubDate>Sun, 10 Jan 2010 05:47:00 +0000</pubDate><atom:updated>2010-01-21T23:58:36.190-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AJAX Control Toolkit</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">CodePlex</category><category domain="http://www.blogger.com/atom/ns#">Columns</category><category domain="http://www.blogger.com/atom/ns#">CoolGridView</category><category domain="http://www.blogger.com/atom/ns#">GridView</category><category domain="http://www.blogger.com/atom/ns#">Header</category><category domain="http://www.blogger.com/atom/ns#">IdeaSparks</category><category domain="http://www.blogger.com/atom/ns#">Resizable</category><category domain="http://www.blogger.com/atom/ns#">Resize</category><category domain="http://www.blogger.com/atom/ns#">Resizeable</category><category domain="http://www.blogger.com/atom/ns#">UpdatePanel</category><title>Render ASP.NET GridView Control with Resizable Column Header</title><description>Make the column headers of ASP.NET GridView control user-resizable with this three easy steps. &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Download the JavaScript file from &lt;a href=&quot;http://www.sigmirror.com/files/51635_acick/ResizeableTable.js&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Include the JavaScript file into your ASPX page.&lt;/li&gt;
&lt;li&gt;Finally, initialize the component for your GridView control by inserting this JavaScript code at the end of your ASPX page. &lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;var _ResizeTableHeaderDecorator = new ResizeTableHeaderDecorator({ GridID: &quot;&amp;lt;%=GridView1.ClientID %&amp;gt;&quot; });&lt;/pre&gt;
Replace &quot;GridView1&quot; by the ID of the GridView control you want to enable column resizing. &lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;
It&#39;s that easy. It is tested to work with IE 8, Firefox 3.5, Safari and Chrome. This feature will soon be integrated with &lt;a href=&quot;http://ideasparks.codeplex.com/&quot;&gt;CoolGridView ASP.NET control&lt;/a&gt;. Here is a live example. &lt;br /&gt;
&lt;div style=&quot;border-bottom: gray 1px solid; border-left: gray 1px solid; border-right: gray 1px solid; border-top: gray 1px solid; height: 300px; overflow: scroll; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; width: 400px;&quot;&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; class=&quot;GridView1TableStyle&quot; id=&quot;GridView1&quot; rules=&quot;all&quot; style=&quot;border-collapse: collapse; width: 700px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope=&quot;col&quot; style=&quot;width: 100px;&quot;&gt;Column 1 &lt;br /&gt;
&lt;/th&gt;&lt;th scope=&quot;col&quot; style=&quot;width: 100px;&quot;&gt;Column 2 &lt;br /&gt;
&lt;/th&gt;&lt;th scope=&quot;col&quot; style=&quot;width: 100px;&quot;&gt;Column 3 &lt;br /&gt;
&lt;/th&gt;&lt;th scope=&quot;col&quot; style=&quot;width: 100px;&quot;&gt;Column 4 &lt;br /&gt;
&lt;/th&gt;&lt;th scope=&quot;col&quot; style=&quot;width: 100px;&quot;&gt;Column 5 &lt;br /&gt;
&lt;/th&gt;&lt;th scope=&quot;col&quot; style=&quot;width: 100px;&quot;&gt;Column 6 &lt;br /&gt;
&lt;/th&gt;&lt;th scope=&quot;col&quot; style=&quot;width: 100px;&quot;&gt;Column 7 &lt;br /&gt;
&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;GridView1TableAlternateRowStyle&quot;&gt;&lt;td&gt;Apple Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive Sample &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Great Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample Orange &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;GridView1TableAlternateRowStyle&quot;&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway Drive &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Gateway &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;GridView1TableAlternateRowStyle&quot;&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Great Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway Sample &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;GridView1TableAlternateRowStyle&quot;&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;GridView1TableAlternateRowStyle&quot;&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Sample &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Great Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;GridView1TableAlternateRowStyle&quot;&gt;&lt;td&gt;Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Great &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Great &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;GridView1TableAlternateRowStyle&quot;&gt;&lt;td&gt;Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway Drive &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Orange Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Orange &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;GridView1TableAlternateRowStyle&quot;&gt;&lt;td&gt;Doorway Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Great &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;GridView1TableAlternateRowStyle&quot;&gt;&lt;td&gt;Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Sample &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sample Great &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway Apple &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Apple Doorway &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;GridView1TableAlternateRowStyle&quot;&gt;&lt;td&gt;Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Drive &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Great Orange &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Sample &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway Gateway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Doorway &lt;br /&gt;
&lt;/td&gt;&lt;td&gt;Orange Apple &lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;</description><link>http://johnsobrepena.blogspot.com/2010/01/render-aspnet-gridview-control-with_09.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-8158708317362188277</guid><pubDate>Tue, 29 Dec 2009 03:55:00 +0000</pubDate><atom:updated>2010-01-22T00:00:23.759-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AJAX Control Toolkit</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">CoolGridView</category><category domain="http://www.blogger.com/atom/ns#">Fixed footer</category><category domain="http://www.blogger.com/atom/ns#">Fixed header</category><category domain="http://www.blogger.com/atom/ns#">GridView</category><category domain="http://www.blogger.com/atom/ns#">IE 6</category><category domain="http://www.blogger.com/atom/ns#">Scrollable</category><category domain="http://www.blogger.com/atom/ns#">Scrolling</category><category domain="http://www.blogger.com/atom/ns#">UpdatePanel</category><title>CoolGridView Quick Fixes Related to IE 6, Scrolling and UpdatePanel</title><description>I recently posted a quick fix for CoolGridView control. Below is a list of fixes.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;It now works correctly in Internet Explorer 6.0 and 7.0.&lt;/li&gt;
&lt;li&gt;Fixed the alignment of the fixed headers and footers when there are other HTML element or server controls before the CoolGridView in a page.&lt;/li&gt;
&lt;li&gt;Control&#39;s scroll bars&amp;nbsp;are properly rendered in the browser or in a modal window after a postback, or after a&amp;nbsp;callback using AJAX control toolkit UpdatePanel.&lt;/li&gt;
&lt;/ol&gt;&lt;a href=&quot;http://ideasparks.codeplex.com/&quot;&gt;Download the&amp;nbsp;updated CoolControls and sample web application project from here&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
For those who are using the CoolGridView control inside AJAX control toolkit&#39;s UpdatePanel control, make sure you have the following javascript code at the bottom portion of your ASPX page. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;//This javascript code is required if you are using a CoolGridView inside an update panel.

function AjaxEndRequestHandler(sender, args) {
   var p = sender._updatePanelClientIDs;
   if (p != null)
   for (var j = 0; j &lt; p.length; j++) {
          var scripts = $get(p[j]).getElementsByTagName(&quot;script&quot;);
          // .text is necessary for IE.
          for (var i = 0; i &lt; scripts.length; i++) {
              try {
                   eval(scripts[i].innerHTML || scripts[i].text);
              } catch (e2) { }
          }
    }
}

try {
Sys.WebForms.PageRequestManager.getInstance() .add_endRequest(AjaxEndRequestHandler);
}
catch (e) { }
&lt;/pre&gt;
&lt;br /&gt;
You can place this code in your master page if you wish. Please look at the sample web application included in the ZIP file.</description><link>http://johnsobrepena.blogspot.com/2009/12/coolgridview-quick-fixes-related-to-ie.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-554734062058335403</guid><pubDate>Tue, 27 Oct 2009 15:25:00 +0000</pubDate><atom:updated>2010-02-01T05:17:40.148-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AJAX</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">CodePlex</category><category domain="http://www.blogger.com/atom/ns#">Control Toolkit</category><category domain="http://www.blogger.com/atom/ns#">Fix Headers</category><category domain="http://www.blogger.com/atom/ns#">Footer Pager</category><category domain="http://www.blogger.com/atom/ns#">GridView</category><category domain="http://www.blogger.com/atom/ns#">IdeaSparks</category><category domain="http://www.blogger.com/atom/ns#">l CoolGridView</category><category domain="http://www.blogger.com/atom/ns#">Pager</category><category domain="http://www.blogger.com/atom/ns#">UpdatePane</category><title>CoolGridView Hot Fix Available for Download</title><description>Fixes to reported issues of using &lt;b&gt;CoolGridView &lt;/b&gt;is now available at &lt;a href=&quot;http://ideasparks.codeplex.com/&quot;&gt;ASP.NET CoolControls&lt;/a&gt; for download. The top issues fixed were related to using CoolGridView control inside ASP.NET AJAX control toolkit&#39;s UpdatePanel. &lt;span id=&quot;ctl00_ctl00_MasterContent_Content_ReleasePanelOrderingContainer_ReleaseDescriptionLiteral&quot;&gt;This alpha release was tested to work properly using Internet Explorer 8.0.6001, Firefox 3.5.3 and Safari 4.0.2.&lt;/span&gt;&lt;br /&gt;
&lt;span id=&quot;ctl00_ctl00_MasterContent_Content_ReleasePanelOrderingContainer_ReleaseDescriptionLiteral&quot;&gt;&lt;br /&gt;
Hierarchical presentation of data either through AJAX callback or postback rendering is in the works. Stay tuned.&lt;/span&gt;</description><link>http://johnsobrepena.blogspot.com/2009/10/coolgridview-hot-fix-available-for.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-1374764838570984914</guid><pubDate>Sun, 27 Sep 2009 17:02:00 +0000</pubDate><atom:updated>2010-02-01T05:18:55.889-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">CoolControls</category><category domain="http://www.blogger.com/atom/ns#">CoolGridView</category><category domain="http://www.blogger.com/atom/ns#">fixed column header</category><category domain="http://www.blogger.com/atom/ns#">Footer</category><category domain="http://www.blogger.com/atom/ns#">GridView</category><category domain="http://www.blogger.com/atom/ns#">IdeaSparks</category><category domain="http://www.blogger.com/atom/ns#">scrollable content</category><title>Extend ASP.NET GridView to Support Fixed Header, Fixed Footer and Scrollable Content</title><description>I have started a project in CodePlex called IdeaSparx.CoolControls. The objective of this project is to extend the already powerful ASP.NET family of web controls. I initially started extending GridView to CoolGridView. CoolGridView, in addition to what GridView control can already provide, delivers the following features.&lt;br /&gt;
&lt;ol&gt;
&lt;li style=&quot;border: medium none;&quot;&gt;Fixed column header, footer and pager&lt;/li&gt;
&lt;li&gt;Scrollable content&amp;nbsp;&lt;/li&gt;
&lt;li&gt;User-resizeable column widths (&lt;span style=&quot;color: red;&quot;&gt;&lt;a href=&quot;http://johnsobrepena.blogspot.com/2010/01/coolgridview-new-release-resizable.html&quot;&gt;new!&lt;/a&gt;&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;Maintains scroll position and column widths after a postback or callback (&lt;span style=&quot;color: red;&quot;&gt;&lt;a href=&quot;http://johnsobrepena.blogspot.com/2010/01/coolgridview-new-release-resizable.html&quot;&gt;new!&lt;/a&gt;&lt;/span&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;separator&quot; style=&quot;border: medium none; clear: both; text-align: center;&quot;&gt;
&lt;img border=&quot;0&quot; iq=&quot;true&quot; src=&quot;http://www.sigmirror.com/files/32796_ndky0/CoolGridView.JPG&quot; style=&quot;border: medium none;&quot; /&gt;&lt;br /&gt;&lt;/div&gt;
This&amp;nbsp;release is&amp;nbsp;tested in Internet Explorer 8.0.6001, Firefox 3.5.3 and Safari 4.0.2.&lt;br /&gt;
The features being developed in the pipeline are as follows. &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Hierarchical presentation of data&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://johnsobrepena.blogspot.com/2009/09/stream-data-pages-in-aspnet-using.html&quot;&gt;Asynchronous streaming of data&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;AJAX sorting and paging &lt;/li&gt;
&lt;li&gt;Enhanced data editing&lt;/li&gt;
&lt;/ol&gt;
If you think there are features that you need and are not in the list, just make your requests or comments.&lt;br /&gt;
&lt;br /&gt;
Download the source code and demo project at &lt;a href=&quot;http://ideasparks.codeplex.com/Wiki/View.aspx?title=Home&quot;&gt;IdeaSparks ASP.NET CoolControls&lt;/a&gt;&lt;br /&gt;</description><link>http://johnsobrepena.blogspot.com/2009/09/extending-aspnet-gridview-for-fixed.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><thr:total>68</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-5951836665087053386</guid><pubDate>Thu, 24 Sep 2009 10:04:00 +0000</pubDate><atom:updated>2010-02-01T05:18:14.489-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apply context</category><category domain="http://www.blogger.com/atom/ns#">cross-browser</category><category domain="http://www.blogger.com/atom/ns#">event handler</category><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><title>Run JavaScript Event-Handler in Another Context</title><description>When a JavaScript function is called by an event such as &quot;onclick&quot; or &quot;onmouseover&quot;, it runs in the context of the calling DOM element. What if&amp;nbsp;you&amp;nbsp;do not want this event-handler to run under the context of the DOM element but instead&amp;nbsp;you would like to run it under a custom object that&amp;nbsp;you have created?&amp;nbsp;Let us have the following example.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Listing 1&lt;/em&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;function MessageHandle(divObject, message) 
{
    this.Message = message;
    this.OnClick = function() 
    {
        alert(this.Message);
    }

    divObject.attachEvent(&#39;onclick&#39;, this.OnClick);
}

var divObject = document.getElementById(&quot;_divMain&quot;);
var _h = new MessageHandle(divObject, &quot;Hello World!&quot;);
&lt;/pre&gt;We are creating a function called MessageHandle that is later on used to instantiate a MessageHandle object at line 13. In the constructor of MessageHandle, we can see that the message (&quot;Hellow World!&quot;) is stored in the property &lt;strong&gt;Message&lt;/strong&gt; (line 3) and &lt;strong&gt;OnClick&lt;/strong&gt; function is attached to the divObject&#39;s onclick event (line 9). The OnClick event handler simply shows an alert box showing the message &quot;Hello World!&quot;.&lt;br /&gt;
&lt;br /&gt;
So far so good. Now if you run this code and the click event of &lt;strong&gt;_divMain&lt;/strong&gt; is triggered&amp;nbsp;then&amp;nbsp;you will get not the message &quot;Hello World&quot; but instead the message &quot;undefined&quot;. What went wrong? Though OnClick is declared as a method of the object MessageHandle, the function will always run in the context of the calling object which is in this case _divMain and not the MessageHandle object. The &quot;this&quot; in line 6 is actually referring to _divMain. So how do we make sure that OnClick will run in the context of MessageHandle? We will create a new function and use the JavaScript&#39;s function &lt;a href=&quot;https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Function/apply&quot;&gt;apply().&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Listing 2&lt;/em&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;function RunHandlerInContextOf(Context, Handler){
    return function() { 
             return Handler.apply(Context); 
         }
}&lt;/pre&gt;The function RunHandlerInContextOf has two parameters Context and Handler. Handler is the event-handler to execute and Context is the object context that Handler will run under. Notice that RunHandlerInContextOf function returns a function that is a wrapper to the event-handler call at line 3. &lt;br /&gt;
&lt;br /&gt;
Now here is our updated JavaScript code.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Listing 3&lt;/em&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;function RunHandlerInContextOf(Context, Handler){
    return function() { 
             return Handler.apply(Context); 
         }
}

function MessageHandle(divObject, message) 
{
    this.Message = message;
    this.OnClick = function() 
    {
        alert(this.Message);
    }

    divObject.attachEvent(&#39;onclick&#39;, RunHandlerInContextOf(this,this.OnClick));
}

var divObject = document.getElementById(&quot;_divMain&quot;);
var _h = new MessageHandle(divObject, &quot;Hello World!&quot;);
&lt;/pre&gt;Here is a JavaScript cross-browser utility I created for attaching event-handlers and gives you an option to run the event-handler in the default context or specify another object as the context.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Listing 4&lt;/em&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;var CoolScriptingUtil = {
    //cross-browser attach event.
    //Element - is the object where eventhandler will be attached to
    //EventString    - is the event name to handle of Element
    //Handler is a function pointing to the event handler
    //Context is what context the Handler will be executed
    attachEvent: function(Element, EventString, Handler, Context) {
        if (typeof (Context) != &#39;undefined&#39; &amp;amp;&amp;amp; Context != null) {
            if (Element.addEventListener) // W3C DOM
                Element.addEventListener(EventString, CoolScriptingUtil.ContextOf(Context, Handler), false);
            else if (Element.attachEvent) // IE DOM
                Element.attachEvent(&#39;on&#39; + EventString, CoolScriptingUtil.ContextOf(Context, Handler));
            else
                alert(&#39;Unable to attach to event &#39; + EventString + &#39; of &#39; + Element.toString());
        } else {
            if (Element.addEventListener) // W3C DOM
                Element.addEventListener(EventString, Handler, false);
            else if (Element.attachEvent) // IE DOM
                Element.attachEvent(&#39;on&#39; + EventString, Handler);
            else
                alert(&#39;Unable to attach to event &#39; + EventString + &#39; of &#39; + Element.toString());
        }
    },

    //Returns a function that executes [Method] in the context of [ThisObj]
    ContextOf: function(ThisObj, Method) {
        return function() { Method.apply(ThisObj); };
    }
}
&lt;/pre&gt;To use this utility we can now replace the command on listing 3 line 15&amp;nbsp;&quot;&lt;em&gt;divObject.attachEvent(&#39;onclick&#39;, RunHandlerInContextOf(this,this.OnClick));&quot;&lt;/em&gt; with the following.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Listing 5&lt;/em&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;CoolScriptingUtil.attachEvent(divObject, &#39;click&#39;, this.OnClick, this);
&lt;/pre&gt;The fourth parameter is optional. When you remove the fourth parameter, the event-handler will run in the default context.</description><link>http://johnsobrepena.blogspot.com/2009/09/run-javascript-event-handler-in-another.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-212466922876102678.post-1189362182040998499</guid><pubDate>Sat, 19 Sep 2009 14:58:00 +0000</pubDate><atom:updated>2010-01-21T23:56:10.453-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AJAX</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">asynchronous</category><category domain="http://www.blogger.com/atom/ns#">background</category><category domain="http://www.blogger.com/atom/ns#">Buffer</category><category domain="http://www.blogger.com/atom/ns#">Buffering</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">Cache</category><category domain="http://www.blogger.com/atom/ns#">Callbacks</category><category domain="http://www.blogger.com/atom/ns#">data-pages</category><category domain="http://www.blogger.com/atom/ns#">GridView</category><category domain="http://www.blogger.com/atom/ns#">IDataReader</category><category domain="http://www.blogger.com/atom/ns#">Paging</category><category domain="http://www.blogger.com/atom/ns#">SqlDataReader</category><category domain="http://www.blogger.com/atom/ns#">Streaming</category><category domain="http://www.blogger.com/atom/ns#">threading</category><category domain="http://www.blogger.com/atom/ns#">Visual Web Express 2008</category><title>Stream Data-Pages in ASP.NET Using GridView and SqlDataReader</title><description>This is my first blog entry. I am starting this blog to document ideas and most of the time -&amp;nbsp;how these ideas were implemented. This will serve as a note and reminder for me and hopefully it will help other people (such as I.T. professionals) like you. This article is the first of two or three parts.&lt;br /&gt;
&lt;br /&gt;
Let us move on directly to the topic I will be discussing. Say we have a time-consuming SQL query with the following characteristics:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;The time of completion of execution is at T60 (e.g. 60 seconds)&lt;/li&gt;
&lt;li&gt;The time-to-first-record* is at T10 (e.g. 10 seconds)&lt;/li&gt;
&lt;li&gt;The SQL query is already fully optimized&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;&lt;i&gt;*Note: for the purpose of this article, time-to-first-record is the point in time when the first row becomes available in the buffer for reading using SqlDataReader’s Read method.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
The objective is to be able to respond to the web request as soon as possible by showing some data to the browser while a background thread continues to pull data from the data store. In other words, as soon as there are enough rows available for the first data-page, we can bind that data to the GridView and render it to the client while more data is retrieved and buffered on the background. This strategy is quite common in windows applications, but how can we achieve this in a web application? Here are four simple strategies we will use to achieve this.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Asynchronously &lt;b&gt;buffer&lt;/b&gt; data from data store&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stream &lt;/b&gt;data-pages to the client&lt;/li&gt;
&lt;li&gt;Cache the buffer in server-side&lt;/li&gt;
&lt;li&gt;Cache the data-pages on the client-side&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;Below are some assumptions before we move on.&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;Paging&lt;/b&gt; of data will be used.&lt;/li&gt;
&lt;li&gt;One data-page contains &lt;b&gt;200 rows&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;The time-consuming SQL query returns &lt;b&gt;5,000 rows&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DataTable&lt;/b&gt; will be used as a buffer.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SqlDataReader&lt;/b&gt; will be used to read rows from data store. This will allow us to read one row at a time while data comes in from the data store.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GridView&lt;/b&gt; will be used to present the data-pages.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ICallbackEventHandler&lt;/b&gt; will be implemented to facilitate AJAX calls.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;The illustration below should give you a better picture of how these strategies are implemented. This shows us the complete HTTP request-response flow in retrieving and presenting the first data-page from the SQL query.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.sigmirror.com/files/32090_eoz3p/20090919diagram1.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; iq=&quot;true&quot; src=&quot;http://www.sigmirror.com/files/32090_eoz3p/20090919diagram1.JPG&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;/div&gt;&lt;ol&gt;&lt;li&gt;An HTTP request to retrieve data is received from the web browser and is processed by the ASPX handler or ASPX page in the web server. At this point, we need to generate a &lt;b&gt;cache ticket&lt;/b&gt; or id that will be unique for this first request.&lt;/li&gt;
&lt;li&gt;Rather than executing the time-consuming query straight away against our data store, a &lt;b&gt;background thread&lt;/b&gt; is created first from the ASPX handler.&lt;/li&gt;
&lt;li&gt;The background thread opens a connection to the data store, executes the time-consuming SQL query and retrieves a &lt;b&gt;SqlDataReader&lt;/b&gt; instance. Using the SqlDataReader, the background thread creates an empty DataTable with the same schema as the data that will be read from the data store. The buffer will be &lt;b&gt;cached in memory&lt;/b&gt; for future reference using the &lt;b&gt;cache ticket&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;The background thread starts reading rows and copies them into the buffer until the end is reached.&lt;/li&gt;
&lt;li&gt;While the background thread is copying rows to the buffer, the ASPX page is actually waiting for either of two things to happen, either a) the buffer has enough rows for one data-page or b) the background thread has completed filling the buffer. In any of these two conditions, the ASPX page will copy 200 or less number of rows and data-bind it to the GridView control.&lt;/li&gt;
&lt;li&gt;ASPX page is rendered with the GridView control displaying the first data-page.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;How do we retrieve the other data-pages now? Simple, we will do the same way as we did for getting the first data-page with some few modifications. This time we will make the request through AJAX, pass the cache ticket and page number, and return the rendered GridView control in response to the AJAX call. Here is how our implementation would look like.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.sigmirror.com/files/32091_trgbt/20090919diagram2.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; iq=&quot;true&quot; src=&quot;http://www.sigmirror.com/files/32091_trgbt/20090919diagram2.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Succeeding request to get the next data-pages is made through AJAX call using the Callback framework of ASP.NET 2.0. The cache ticket and page number of the data-page being requested are transmitted with the AJAX call.&lt;/li&gt;
&lt;li&gt;ASPX page handles the request and inspect the buffer if it has rows for the requested data-page with page number page number. Because the buffer is cached in memory, we are able to obtain a reference to the buffer using the cache ticket. Note that at this point in time, the background thread may still be populating our buffer or it might have already completed (as seen in the diagram above).&lt;/li&gt;
&lt;li&gt;If there are enough rows for the requested data-page, the rows are then data-bind to the GridView control. GridView control is then rendered in memory using the RenderControl method. The resulting HTML is then transmitted to the web browser. The web browser then stores or caches this data-page (now represented in HTML) into a JavaScript array of string.&lt;/li&gt;
&lt;/ol&gt;These steps repeats continuously until there is no data-page left that can be read from the buffer. &lt;br /&gt;
&lt;br /&gt;
Here is the outcome of the process that implements our strategy. First, we were able to respond to the web request as soon as possible instead of waiting for the time-consuming SQL query to finish before showing data on the web browser. Secondly, we now have all the data-pages in the client-side stored in a JavaScript array of string. What this means is we can go from one data-page to another very quickly, seamlessly and it does not require us to make another request to the web server. Finally, we still have the DataTable acting as a buffer which is cached in the server-side. We can use the cached buffer to perform sorting instead of hitting again the data store, or we can use this to search within a search results.&lt;br /&gt;
&lt;br /&gt;
One &lt;b&gt;caveat &lt;/b&gt;- the implementation I just presented has a trade-off. We are actually allocating more memory to have a more responsive web application. This implementation allows web applications to respond to retrieval of data quicker and navigating though data-pages faster and more seamless. Another advantage of using this implementation is that it will work with any data store and we do not need to implement any paging on the database’s side (like using ROW_NUMBER() in SQL 2005). One way I can think of to minimize the impact of allocating more memory is to destroy the data-page in the server-side cache after it is transmitted to the client-side. Another way is to have a distributed caching strategy so that buffering will only be initiated in one server in a web server farm (more about this in my future posts).&lt;br /&gt;
&lt;br /&gt;
In my next post, I will be showing you how this is actually implemented in ASP.NET and C#. I will also share with you one complete example that can be downloaded as a Visual Web Express 2008 solution. We will also explore a distributed caching strategy to efficiently implement this technique in a server farm.&lt;br /&gt;
&lt;br /&gt;
I hope you found this post helpful. If you have questions, please feel free to email me or leave a comment and I will get back to you as soon as I can.</description><link>http://johnsobrepena.blogspot.com/2009/09/stream-data-pages-in-aspnet-using.html</link><author>noreply@blogger.com (John Eric Sobrepena)</author><thr:total>1</thr:total></item></channel></rss>