<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>MyViewState.NET</title>
    <description>Adventures in .NET Development</description>
    <link>http://www.myviewstate.net/blog/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.7</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://www.myviewstate.net/blog/opml.axd</blogChannel:blogRoll>
    <dc:creator>Kevin Babcock</dc:creator>
    <dc:title>MyViewState.NET</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/kevinbabcock" /><feedburner:info uri="kevinbabcock" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Using a Different Domain to Login to SQL Server Management Studio</title>
      <description>&lt;p&gt;To simplify the management of user access to SQL Server my company recently implemented a policy limiting the number of local login accounts. Software developers are now required to use their domain accounts to access and work within SQL Server. This new policy works great, except for those of us who work remotely. Since &lt;a href="http://en.wikipedia.org/wiki/SQL_Server_Management_Studio" target="_blank"&gt;SQL Server Management Studio&lt;/a&gt; (SSMS) doesn't let you specify a different domain when logging in using Windows Authentication, a little extra effort is required to get connected. &lt;/p&gt;  &lt;p&gt;The best solution I have found for connecting to SQL Server Management Studio with a user account from a different domain is to use the&lt;strong&gt; &lt;/strong&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb490994.aspx" target="_blank"&gt;&lt;strong&gt;runas&lt;/strong&gt;&lt;/a&gt; command, which allows users to run a program with different permissions than those granted to the current logon. &lt;/p&gt;  &lt;p&gt;To launch SSMS with a different user account than the one with which you logged in to the local machine execute the following command from a command prompt: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;runas /netonly /user:{domain}\{account name} &amp;quot;{path to SSMS}&amp;quot; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;For example, if you work for Microsoft and your username is 'Bob' you would use the following command to launch SSMS: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;runas /netonly /user:microsoft\bob &amp;quot;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe&amp;quot; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Obviously you will need to modify the path so that it points to the location of SSMS on your machine. When you run this command, you will be asked to provide your domain password before SSMS launches. If you entered the correct login information your domain credentials will be used when selecting Windows Authentication to log in to SSMS.&lt;/p&gt;  &lt;p&gt;If you're like me, typing this into a command prompt every time you want to launch SSMS gets old fast. A quicker alternative is to change the target path assigned to an SSMS shortcut. Simply right-click the shortcut or taskbar item and select &lt;strong&gt;Properties&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=1_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SSMS taskbar item" border="0" alt="SSMS taskbar item" src="http://www.myviewstate.net/blog/image.axd?picture=1_thumb_2.png" width="400" height="132" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Enter the command into the &lt;strong&gt;Target&lt;/strong&gt; textbox in the &lt;strong&gt;Properties&lt;/strong&gt; dialog.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=2_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SSMS taskbar properties" border="0" alt="SSMS taskbar properties" src="http://www.myviewstate.net/blog/image.axd?picture=2_thumb_2.png" width="400" height="565" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You'll still be required to enter a password, but at least this eliminates the need to retype the command every time you launch SSMS. If your shortcut doesn't work properly, try running the shortcut target value in a command prompt. This will let allow you to see any error messages that may result if the command is not entered properly.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kevinbabcock/~4/RCytJXX5YTQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/kevinbabcock/~3/RCytJXX5YTQ/post.aspx</link>
      <author>Kevin Babcock</author>
      <comments>http://www.myviewstate.net/blog/post/2010/05/21/Using-a-Different-Domain-to-Login-to-SQL-Server-Management-Studio.aspx#comment</comments>
      <guid isPermaLink="false">http://www.myviewstate.net/blog/post.aspx?id=200f1598-3920-4a1d-810a-dbc6bee8ea80</guid>
      <pubDate>Fri, 21 May 2010 01:05:29 -0500</pubDate>
      <dc:publisher>Kevin Babcock</dc:publisher>
      <pingback:server>http://www.myviewstate.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.myviewstate.net/blog/post.aspx?id=200f1598-3920-4a1d-810a-dbc6bee8ea80</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.myviewstate.net/blog/trackback.axd?id=200f1598-3920-4a1d-810a-dbc6bee8ea80</trackback:ping>
      <wfw:comment>http://www.myviewstate.net/blog/post/2010/05/21/Using-a-Different-Domain-to-Login-to-SQL-Server-Management-Studio.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.myviewstate.net/blog/syndication.axd?post=200f1598-3920-4a1d-810a-dbc6bee8ea80</wfw:commentRss>
    <feedburner:origLink>http://www.myviewstate.net/blog/post.aspx?id=200f1598-3920-4a1d-810a-dbc6bee8ea80</feedburner:origLink></item>
    <item>
      <title>Free this weekend? Come help at the Southern Maryland Give Camp</title>
      <description>&lt;div&gt;
&lt;p&gt;&lt;img style="vertical-align: middle;" src="http://www.myviewstate.net/blog/image.axd?picture=2010%2f3%2fgive-camp.png" alt="southern maryland give camp" width="700" height="170" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;I'm excited to be taking part in my first Give Camp this weekend. Over 80 developers are getting together to donate a weekend of coding to 19 charities and non-profits who need our help. But we could still use a few more folks to help out, so if you're free this weekend please consider joining the effort. There will be food and gaming, and even some prizes given out at the end. Oh yeah, and Microsoft DE &lt;a href="http://blogs.msdn.com/gduthie/archive/2010/03/13/southern-maryland-givecamp-is-one-week-away-help-still-needed.aspx" target="_blank"&gt;G. Andrew Duthie&lt;/a&gt; has promised to shave his head into a mohawk if we reach 100 volunteers - should be entertaining.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Here's a press release that hit my inbox this morning. If you're interested, head over to the web site and sign up. I hope to see you there!&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;strong&gt;Local  Software Specialists Needed to Assist Area Non-Profits March 19-21&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;GiveCamp  is coming to the Baltimore/Washington area for the first time ever.&amp;nbsp;  To be held at St. Mary's College of Maryland (SMCM), the Southern  Maryland  GiveCamp is a three-day event that partners software developers,  designers, and  database administrators with non-profit organizations who need technical  help,  such as the creation of a web site or a tracking system for members.&amp;nbsp;  The camp  runs from March 19-21.&amp;nbsp; Some of the Southern Maryland sponsors include  SMCM,  Microsoft, Telerik, Asp.net Web Hosting, Charles County Technology  Council,  Elite Beatz Entertainment, LL Photography, Computer Management  Incorporated,  Papa John's Pizza, and Lockheed Martin. For more information on how to  volunteer, visit &lt;a href="http://www.somdgc.org/" target="_blank"&gt;www.somdgc.org&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;"The impact on the community is heavy," said Southern Maryland  GiveCamp  chapter founder Jim Pendravis.&amp;nbsp; "We have about 19 non-profits or  charities that  are going to receive a year's worth of IT work in the course of a  weekend,  free.&amp;nbsp; This will allow them to save their resources to do other  meaningful works  within the community.&amp;nbsp; Currently, there are 82 volunteers, saving these  non-profits roughly $393,000 in service work.&amp;nbsp; If we get 100 volunteers  to  volunteer, I'll shave my head on the last day, and we'll stream it live  and put  it on YouTube.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;"Volunteers can choose to stay overnight, or return  the next day," continued  Pendravis.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;St. Mary's College of Maryland, designated the Maryland state  honors college  in 1992, is ranked one of the best liberal arts schools in the nation by  U.S.  News &amp;amp; World Report, Kiplinger's, and The Princeton Review. Founded  in 1840  as Maryland's "monument school" commemorating the state's first capital,  SMCM is  the state's only public honors college.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;More than 2,000 students attend the college, which has the highest  graduation  rate for all Maryland public colleges and universities. The school's  waterfront  campus along the St. Mary's River in Southern Maryland is home to the  2009  National Intercollegiate Sailing Association Co-ed champions.&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kevinbabcock/~4/v3wfspw6IFs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/kevinbabcock/~3/v3wfspw6IFs/post.aspx</link>
      <author>Kevin Babcock</author>
      <comments>http://www.myviewstate.net/blog/post/2010/03/16/Free-this-weekend-Come-help-out-at-the-Southern-Maryland-Give-Camp.aspx#comment</comments>
      <guid isPermaLink="false">http://www.myviewstate.net/blog/post.aspx?id=4d734eec-6281-4048-9ec7-f2b304dd328c</guid>
      <pubDate>Tue, 16 Mar 2010 09:45:00 -0500</pubDate>
      <dc:publisher>Kevin Babcock</dc:publisher>
      <pingback:server>http://www.myviewstate.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.myviewstate.net/blog/post.aspx?id=4d734eec-6281-4048-9ec7-f2b304dd328c</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.myviewstate.net/blog/trackback.axd?id=4d734eec-6281-4048-9ec7-f2b304dd328c</trackback:ping>
      <wfw:comment>http://www.myviewstate.net/blog/post/2010/03/16/Free-this-weekend-Come-help-out-at-the-Southern-Maryland-Give-Camp.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.myviewstate.net/blog/syndication.axd?post=4d734eec-6281-4048-9ec7-f2b304dd328c</wfw:commentRss>
    <feedburner:origLink>http://www.myviewstate.net/blog/post.aspx?id=4d734eec-6281-4048-9ec7-f2b304dd328c</feedburner:origLink></item>
    <item>
      <title>What’s New in RadControls for ASP.NET AJAX: Source Code</title>
      <description>&lt;p&gt;Many thanks again to Telerik for inviting me to take part in the kick-off webinar for their Q1 2010 release. I had a lot of fun and was pleased to get to show off some of my favorite features in the new release. If you missed the webinar, it’s already up on Telerik TV so be sure to &lt;a href="http://tv.telerik.com/whats-new/webinar/whats-new-radcontrols-aspnet-ajax-and-telerik-extensions-mvc-q1-2010"&gt;check it out&lt;/a&gt;. For those of you interested in the source code from my demos, feel free to download it below.&lt;/p&gt;  &lt;p&gt;Q1 2010 is definitely another huge milestone for Telerik, so congratulations to the Telerik team for another great release and once again delivering more than expected!&lt;/p&gt;  &lt;p&gt;[&lt;a href="http://www.box.net/shared/frk6h7h560"&gt;Source Code&lt;/a&gt;]&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kevinbabcock/~4/GMZ1X7y9DjQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/kevinbabcock/~3/GMZ1X7y9DjQ/post.aspx</link>
      <author>Kevin Babcock</author>
      <comments>http://www.myviewstate.net/blog/post/2010/03/09/Whate28099s-New-in-RadControls-for-ASPNET-AJAX-Source-Code.aspx#comment</comments>
      <guid isPermaLink="false">http://www.myviewstate.net/blog/post.aspx?id=4b9a4a5c-b044-4134-9758-9439a16acb77</guid>
      <pubDate>Tue, 09 Mar 2010 20:57:24 -0500</pubDate>
      <dc:publisher>Kevin Babcock</dc:publisher>
      <pingback:server>http://www.myviewstate.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.myviewstate.net/blog/post.aspx?id=4b9a4a5c-b044-4134-9758-9439a16acb77</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.myviewstate.net/blog/trackback.axd?id=4b9a4a5c-b044-4134-9758-9439a16acb77</trackback:ping>
      <wfw:comment>http://www.myviewstate.net/blog/post/2010/03/09/Whate28099s-New-in-RadControls-for-ASPNET-AJAX-Source-Code.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.myviewstate.net/blog/syndication.axd?post=4b9a4a5c-b044-4134-9758-9439a16acb77</wfw:commentRss>
    <feedburner:origLink>http://www.myviewstate.net/blog/post.aspx?id=4b9a4a5c-b044-4134-9758-9439a16acb77</feedburner:origLink></item>
    <item>
      <title>Join me tomorrow for the Telerik Q1 2010 release-week kickoff webinar</title>
      <description>&lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=q1.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="telerik q1 2010 release" border="0" alt="telerik q1 2010 release" src="http://www.myviewstate.net/blog/image.axd?picture=q1_thumb.png" width="700" height="196" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;That’s right, &lt;a href="http://www.telerik.com/"&gt;Telerik&lt;/a&gt; was kind enough to extend an invite to me (and other fellow &lt;a href="http://www.telerik.com/community/mvp-program/awardees.aspx"&gt;Telerik MVPs&lt;/a&gt;) to help co-host a webinar this week. I have the good fortune of sharing the virtual stage with &lt;a href="http://telerikwatch.com/"&gt;Todd Anglin&lt;/a&gt;, Telerik’s Chief Evangelist (and my old boss!), to kick off another exciting &lt;a href="http://www.telerik.com/community/events/q1-2010-release-webinar-week.aspx"&gt;release week&lt;/a&gt; with a &lt;em&gt;&lt;a href="https://www1.gotomeeting.com/register/540221625"&gt;What’s New in Q1 2010 Overview&lt;/a&gt;&lt;/em&gt; webinar.&lt;/p&gt;  &lt;p&gt;For my part in all this I’ll be giving a brief (10-15 min) demo of some of my favorite new features in the &lt;a href="http://demos.telerik.com/aspnet-ajax/controls/examples/default/defaultcs.aspx"&gt;RadControls for ASP.NET AJAX&lt;/a&gt; suite. If you haven’t already heard what’s coming in the suite, here are a few features I’ll be covering:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;New control: RadAsyncUpload &lt;/li&gt;    &lt;li&gt;New feature: the RadGrid is getting a GridRatingColumn &lt;/li&gt;    &lt;li&gt;New feature: the RadGrid is also getting some filtering goodness in the HeaderContextMenu &lt;/li&gt;    &lt;li&gt;New feature: the RadListView now has drag-and-drop functionality built-in &lt;/li&gt;    &lt;li&gt;New feature: JavaScript intellisense!!! (need I say more?) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There is way more content than could ever be included in a single webinar, so head over to the &lt;a href="http://demos.telerik.com/aspnet-ajax/controls/examples/default/defaultcs.aspx"&gt;demos&lt;/a&gt; after the official release and check out all the new features. If you don’t already have a license to the ASP.NET suite, Telerik is &lt;a href="http://telerikwatch.com/2010/03/twitter-contest-for-q1-2010-release.html"&gt;giving away&lt;/a&gt; several throughout the week to webinar attendees and Twitter fans so there will be plenty of opportunities to win.&lt;/p&gt;  &lt;p&gt;Don’t forget to &lt;a href="https://www1.gotomeeting.com/register/540221625"&gt;sign up&lt;/a&gt; to watch the webinar live tomorrow. If you can’t make it, you can always watch it on-demand over on &lt;a href="http://tv.telerik.com/home"&gt;Telerik TV&lt;/a&gt;. As always, I’ll make the code from my demos available here later in the week.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kevinbabcock/~4/YaJa6N672jw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/kevinbabcock/~3/YaJa6N672jw/post.aspx</link>
      <author>Kevin Babcock</author>
      <comments>http://www.myviewstate.net/blog/post/2010/03/08/Join-me-tomorrow-for-on-the-Telerik-Q1-2010-release-week-kickoff-webinar.aspx#comment</comments>
      <guid isPermaLink="false">http://www.myviewstate.net/blog/post.aspx?id=23e5f176-1da6-46a3-bdd6-2a2abf52cec3</guid>
      <pubDate>Mon, 08 Mar 2010 21:09:40 -0500</pubDate>
      <dc:publisher>Kevin Babcock</dc:publisher>
      <pingback:server>http://www.myviewstate.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.myviewstate.net/blog/post.aspx?id=23e5f176-1da6-46a3-bdd6-2a2abf52cec3</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.myviewstate.net/blog/trackback.axd?id=23e5f176-1da6-46a3-bdd6-2a2abf52cec3</trackback:ping>
      <wfw:comment>http://www.myviewstate.net/blog/post/2010/03/08/Join-me-tomorrow-for-on-the-Telerik-Q1-2010-release-week-kickoff-webinar.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.myviewstate.net/blog/syndication.axd?post=23e5f176-1da6-46a3-bdd6-2a2abf52cec3</wfw:commentRss>
    <feedburner:origLink>http://www.myviewstate.net/blog/post.aspx?id=23e5f176-1da6-46a3-bdd6-2a2abf52cec3</feedburner:origLink></item>
    <item>
      <title>How to remove a SQL Server 2008 Instance</title>
      <description>&lt;p&gt;I do a lot of database development, so I have several SQL Server and Oracle instances running on my system at any given time. Tonight I wanted to remove an instance of SQL Server that I installed a few weeks ago, but didn’t want to remove SQL Server in its entirety because I have other instances running that I want to keep. It turns out to be pretty easy to remove an instance, but not in an obvious way. I searched through the configuration tools and even launched the setup program to try and figure out how to do this. Finally, I turned to &lt;a href="http://www.bing.com/search?q=remove+sql+server+instance+2008&amp;amp;go=&amp;amp;form=QBLH"&gt;Bing&lt;/a&gt; and figured out &lt;a href="http://support.microsoft.com/kb/955499"&gt;the answer&lt;/a&gt; real quick.&lt;/p&gt;  &lt;p&gt;Here for you, dear reader, is the &lt;em&gt;Dummies &lt;/em&gt;guide to removing a SQL Server 2008 instance from your machine:&lt;/p&gt;  &lt;p&gt;1. Navigate to &lt;strong&gt;Start | Control Panel | Programs and Features&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;2. Select &lt;strong&gt;Microsoft SQL Server 2008&lt;/strong&gt; – or &lt;strong&gt;Microsoft SQL Server 2008 (64-bit)&lt;/strong&gt; if applicable – and click &lt;strong&gt;Uninstall&lt;/strong&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;This is why I had a problem figuring out how to remove a SQL Server instance. I never thought of using Uninstall from Programs and Features because intuition told me that that would remove SQL Server from my machine entirely.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=1_1.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="windows programs and features" border="0" alt="windows programs and features" src="http://www.myviewstate.net/blog/image.axd?picture=1_thumb_1.png" width="600" height="350" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;3. A dialog window will appear. Choose &lt;strong&gt;Remove&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=2_1.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="remove sql server" border="0" alt="remove sql server" src="http://www.myviewstate.net/blog/image.axd?picture=2_thumb_1.png" width="240" height="203" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;4. The SQL Server Setup Wizard will launch. Click &lt;strong&gt;OK&lt;/strong&gt; if all the setup support rules passed.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sql server setup" border="0" alt="sql server setup" src="http://www.myviewstate.net/blog/image.axd?picture=3_thumb.png" width="600" height="450" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;5. The next screen provides a list of all instances installed on the machine. Select the instance you want to remove from the &lt;strong&gt;Instance to remove features from&lt;/strong&gt; drop down list and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sql server setup" border="0" alt="sql server setup" src="http://www.myviewstate.net/blog/image.axd?picture=4_thumb.png" width="600" height="432" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;6. In the &lt;strong&gt;Features&lt;/strong&gt; section, select those features that you want removed. Since I am keeping another instance running on the machine I left all &lt;strong&gt;Shared Features &lt;/strong&gt;installed and only removed the &lt;strong&gt;Database Engine Services&lt;/strong&gt; associated with the instance being removed.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=5.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sql server setup" border="0" alt="sql server setup" src="http://www.myviewstate.net/blog/image.axd?picture=5_thumb.png" width="600" height="432" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;7. The next few screens should be pretty self-explanatory. Click through them as you are prompted to do so.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sql server setup" border="0" alt="sql server setup" src="http://www.myviewstate.net/blog/image.axd?picture=6_thumb.png" width="600" height="432" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=7.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sql server setup" border="0" alt="sql server setup" src="http://www.myviewstate.net/blog/image.axd?picture=7_thumb.png" width="600" height="432" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sql server setup" border="0" alt="sql server setup" src="http://www.myviewstate.net/blog/image.axd?picture=8_thumb.png" width="600" height="432" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=9.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sql server setup" border="0" alt="sql server setup" src="http://www.myviewstate.net/blog/image.axd?picture=9_thumb.png" width="600" height="432" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sql server setup" border="0" alt="sql server setup" src="http://www.myviewstate.net/blog/image.axd?picture=10_thumb.png" width="600" height="432" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And voila! You have successfully removed a SQL Server instance from your machine. Not too difficult, was it?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kevinbabcock/~4/x6FNd1PEJW0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/kevinbabcock/~3/x6FNd1PEJW0/post.aspx</link>
      <author>Kevin Babcock</author>
      <comments>http://www.myviewstate.net/blog/post/2010/03/08/How-to-Remove-a-SQL-Server-2008-Instance.aspx#comment</comments>
      <guid isPermaLink="false">http://www.myviewstate.net/blog/post.aspx?id=b65c1037-3d4e-4498-a1c7-0eeb466191bd</guid>
      <pubDate>Mon, 08 Mar 2010 20:42:28 -0500</pubDate>
      <dc:publisher>Kevin Babcock</dc:publisher>
      <pingback:server>http://www.myviewstate.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.myviewstate.net/blog/post.aspx?id=b65c1037-3d4e-4498-a1c7-0eeb466191bd</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.myviewstate.net/blog/trackback.axd?id=b65c1037-3d4e-4498-a1c7-0eeb466191bd</trackback:ping>
      <wfw:comment>http://www.myviewstate.net/blog/post/2010/03/08/How-to-Remove-a-SQL-Server-2008-Instance.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.myviewstate.net/blog/syndication.axd?post=b65c1037-3d4e-4498-a1c7-0eeb466191bd</wfw:commentRss>
    <feedburner:origLink>http://www.myviewstate.net/blog/post.aspx?id=b65c1037-3d4e-4498-a1c7-0eeb466191bd</feedburner:origLink></item>
    <item>
      <title>Use jQuery’s $.map() utility to easily transform arrays</title>
      <description>&lt;p&gt;I&amp;rsquo;m often confronted with the need to take a collection of values and transform them into a different set of values. For example, I want to use Twitter&amp;rsquo;s &lt;a href="http://apiwiki.twitter.com/Twitter-Search-API-Method:-search"&gt;search API&lt;/a&gt; to get a list of tweets on a certain topic. However, I am only interested in retrieving the URLs to the home pages of each Twitter user returned in the result set. I might use jQuery&amp;rsquo;s &lt;a href="http://www.myviewstate.net/blog/post/2010/02/26/Make-cross-domain-Ajax-requests-with-jQuery.aspx"&gt;JSONP implementation&lt;/a&gt; to call the web service and parse the results with the following JavaScript:&lt;/p&gt;
&lt;pre class="brush: js;"&gt;$.ajax({
    url: 'http://search.twitter.com/search.json?q=telerik',
    dataType: 'jsonp',
    success: function(data) {
        var userUrls = [];
        var count = data.results.length;
        for (var i = 0; i &amp;lt; count; i++) {
            var url = 'http://twitter.com/' + data.results[i].from_user;
            userUrls.push(url);
        }
        // ...
    }
});&lt;/pre&gt;
&lt;p&gt;Using jQuery&amp;rsquo;s &lt;em&gt;$.map()&lt;/em&gt; utility, transforming the results on the client becomes even more trivial.&lt;/p&gt;
&lt;pre class="brush: js;"&gt;$.ajax({
    url: 'http://search.twitter.com/search.json?q=telerik',
    dataType: 'jsonp',
    success: function(data) {
        $.map(data.results, function(result) {
            return 'http://twitter.com/' + result.from_user;
        });
        // ...
    }
});&lt;/pre&gt;
&lt;p&gt;Both approaches have the same result, an array containing URLs to Twitter user account home pages, but the second is more elegant and a bit more terse.&lt;/p&gt;
&lt;p&gt;If I really wanted to tighten things up, I could do it all in a single line of code.&lt;/p&gt;
&lt;pre class="brush: js;"&gt;$.map(data.results, function(result) { return 'http://twitter.com/' + result.from_user; });&lt;/pre&gt;
&lt;p&gt;The &lt;em&gt;$.map()&lt;/em&gt; function takes two arguments: an array of values and the function used to map each element in the array to a new value in the resulting array. The function provided to &lt;em&gt;$.map()&lt;/em&gt; is passed two parameters, the array element being transformed and its index value in the array. I didn&amp;rsquo;t use the index value in the previous example, but it&amp;rsquo;s there if you need it. Check out jQuery&amp;rsquo;s &lt;a href="http://api.jquery.com/jQuery.map/"&gt;official documentation&lt;/a&gt; of the function for more details.&lt;/p&gt;
&lt;h2&gt;A real-world example&lt;/h2&gt;
&lt;p&gt;One great example of where this utility might come in handy is with Telerik&amp;rsquo;s &lt;a href="http://demos.telerik.com/aspnet-ajax/grid/examples/overview/defaultcs.aspx"&gt;RadGrid for ASP.NET AJAX&lt;/a&gt;. The other day I was working on a project that utilizes the RadGrid&amp;rsquo;s &lt;a href="http://demos.telerik.com/aspnet-ajax/grid/examples/client/databinding/defaultcs.aspx"&gt;client-side data binding capabilities&lt;/a&gt; and wanted to be able to quickly retrieve an array containing the values of every selected item&amp;rsquo;s ID whenever the grid&amp;rsquo;s client-side &lt;a href="http://www.telerik.com/help/aspnet-ajax/grid_onrowselected.html"&gt;RowSelected&lt;/a&gt; event is fired. I pass the IDs to a &lt;a href="http://demos.telerik.com/silverlight/#Chart/FirstLook"&gt;Silverlight chart&lt;/a&gt;, which uses them to call a web service and retrieve contextual data to display about the selected items.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve done this sort of thing many times before, and my initial instinct was to take the same approach I always have:&lt;/p&gt;
&lt;pre class="brush: js;"&gt;var rowSelected = function(sender, args) {
    var tableView = args.get_tableView();
    var items = tableView.get_selectedItems();

    var ids = [];
    var count = items.length;
    for (var i = 0; i &amp;lt; count; i++) {
        var dataItem = items[i].get_dataItem();
        ids.push(dataItem.ID);
    }

    // pass IDs to Silverlight chart
}&lt;/pre&gt;
&lt;p&gt;But when I remembered the jQuery &lt;em&gt;$.map()&lt;/em&gt; function I was able to replace the previous implementation with the following, which I find to be easier to implement, ready, and use.&lt;/p&gt;
&lt;pre class="brush: js;"&gt;var rowSelected = function(sender, args) {
    var tableView = args.get_tableView();
    var items = tableView.get_selectedItems();
    var ids = $.map(items, function(item) {
        return item.get_dataItem().ID;
    });
}&lt;/pre&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s really not much else to say. The &lt;em&gt;$.map()&lt;/em&gt; function is straight-forward and easy to use, and it&amp;rsquo;s just another reason I love to use the jQuery library.&lt;/p&gt;
&lt;p&gt;I created a simple demo using the RadGrid and Northwind data to demonstrate how to extract selected items on the client using this function.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://www.box.net/shared/xihae0rhsd"&gt;Source: C#&lt;/a&gt;]&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kevinbabcock/~4/-fv1zdG1cUU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/kevinbabcock/~3/-fv1zdG1cUU/post.aspx</link>
      <author>Kevin Babcock</author>
      <comments>http://www.myviewstate.net/blog/post/2010/03/04/Use-jQuery-map-utility-to-easily-transform-arrays.aspx#comment</comments>
      <guid isPermaLink="false">http://www.myviewstate.net/blog/post.aspx?id=d9ecbd74-01dd-4334-b29c-aadde4d9c0d7</guid>
      <pubDate>Thu, 04 Mar 2010 00:00:00 -0500</pubDate>
      <dc:publisher>Kevin Babcock</dc:publisher>
      <pingback:server>http://www.myviewstate.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.myviewstate.net/blog/post.aspx?id=d9ecbd74-01dd-4334-b29c-aadde4d9c0d7</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.myviewstate.net/blog/trackback.axd?id=d9ecbd74-01dd-4334-b29c-aadde4d9c0d7</trackback:ping>
      <wfw:comment>http://www.myviewstate.net/blog/post/2010/03/04/Use-jQuery-map-utility-to-easily-transform-arrays.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.myviewstate.net/blog/syndication.axd?post=d9ecbd74-01dd-4334-b29c-aadde4d9c0d7</wfw:commentRss>
    <feedburner:origLink>http://www.myviewstate.net/blog/post.aspx?id=d9ecbd74-01dd-4334-b29c-aadde4d9c0d7</feedburner:origLink></item>
    <item>
      <title>A jQuery footer menu plugin for the RadGrid for ASP.NET AJAX</title>
      <description>&lt;p&gt;Recently I had the need to add some custom processing to the contents of a &lt;a href="http://demos.telerik.com/aspnet-ajax/grid/examples/overview/defaultcs.aspx"&gt;RadGrid&lt;/a&gt;. I decided that the most desirable solution would be to add a menu of options in the footer of the grid, but unfortunately the RadGrid does not support footer templates. I don’t know if this is because there are other built-in features that are hosted in the grid footer (e.g. paging, command items, etc.), or simply because there hasn’t been any demand for this feature. Either way, I needed to add the functionality. &lt;/p&gt;  &lt;p&gt;This seemed like a great opportunity for a &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; plugin, so I decided to whip one up.&lt;/p&gt;  &lt;h2&gt;Examining the structure of a RadGrid&lt;/h2&gt;  &lt;p&gt;Before I can programmatically add a footer to the RadGrid I need to understand its structure. The HTML generated by the RadGrid differs based upon the features being employed in a specific instance, so let’s take a look at a couple of scenarios.&lt;/p&gt;  &lt;p&gt;First, here’s how the RadGrid renders on the client in the most basic of implementations:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=radgrid_1.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="basic radgrid" border="0" alt="basic radgrid" src="http://www.myviewstate.net/blog/image.axd?picture=radgrid_thumb_1.png" width="700" height="152" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;pre class="brush: xml;"&gt;&amp;lt;div id=&amp;quot;rgCustomers&amp;quot;&amp;gt;
    &amp;lt;table&amp;gt;
        &amp;lt;colgroup&amp;gt;
            &amp;lt;!-- column group definitions --&amp;gt;
        &amp;lt;/colgroup&amp;gt;
        &amp;lt;thead&amp;gt;
            &amp;lt;!-- header contents --&amp;gt;
        &amp;lt;/thead&amp;gt;
        &amp;lt;tbody&amp;gt;
            &amp;lt;!-- body contents --&amp;gt;
        &amp;lt;/tbody&amp;gt;
    &amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;

&lt;p&gt;And since I care most about content that is rendered in the footer, let’s look at the RadGrid structure when paging and the command item toolbar are enabled:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=radgrid-paging_1.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="radgrid with paging" border="0" alt="radgrid with paging" src="http://www.myviewstate.net/blog/image.axd?picture=radgrid-paging_thumb_1.png" width="700" height="312" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;div id=&amp;quot;rgCustomers&amp;quot;&amp;gt;
    &amp;lt;table&amp;gt;
        &amp;lt;colgroup&amp;gt;
            &amp;lt;!-- column group definitions --&amp;gt;
        &amp;lt;/colgroup&amp;gt;
        &amp;lt;thead&amp;gt;
            &amp;lt;!-- header contents --&amp;gt;
        &amp;lt;/thead&amp;gt;
        &amp;lt;tbody&amp;gt;
            &amp;lt;!-- body contents --&amp;gt;
        &amp;lt;/tbody&amp;gt;
        &amp;lt;tfoot&amp;gt;
            &amp;lt;tr class=&amp;quot;rgCommandRow&amp;quot;&amp;gt;
                &amp;lt;!-- command row elements --&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr class=&amp;quot;rgPager&amp;quot;&amp;gt;
                &amp;lt;!-- pager elements --&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/tfoot&amp;gt;
    &amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;

&lt;p&gt;As you can see, the grid is rendered as a &lt;em&gt;&amp;lt;table&amp;gt;&lt;/em&gt; wrapped in a &lt;em&gt;&amp;lt;div&amp;gt; &lt;/em&gt;element. The &lt;em&gt;&amp;lt;table&amp;gt;&lt;/em&gt; defines &lt;em&gt;&amp;lt;colgroup&amp;gt;&lt;/em&gt;, &lt;em&gt;&amp;lt;thead&amp;gt;&lt;/em&gt;, and &lt;em&gt;&amp;lt;tbody&amp;gt;&lt;/em&gt; sections. The contents of these sections is not important as I am only concerned with adding a footer to the &lt;em&gt;&amp;lt;table&amp;gt;&lt;/em&gt;. Unless certain features are enabled, no footer element (&lt;em&gt;&amp;lt;tfoot&amp;gt;&lt;/em&gt;) is rendered. In that case I’ll need to create and attach a new one. However, if a feature is enable that causes a footer to be rendered I need to ensure that the new menu content is added after any existing footer row elements.&lt;/p&gt;

&lt;h2&gt;Creating a custom jQuery plugin&lt;/h2&gt;

&lt;p&gt;Armed with a general understanding of the structure of a RadGrid, I can design the markup I will use to create the menu. &lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;tr class=&amp;quot;footer-menu&amp;quot;&amp;gt;
    &amp;lt;td colspan=&amp;quot;4&amp;quot;&amp;gt;
        &amp;lt;ul&amp;gt;
            &amp;lt;li class=&amp;quot;menu-item export&amp;quot;&amp;gt;Export Data&amp;lt;/li&amp;gt;
            &amp;lt;li class=&amp;quot;menu-item search&amp;quot;&amp;gt;Search&amp;lt;/li&amp;gt;
            &amp;lt;li class=&amp;quot;menu-item audit&amp;quot;&amp;gt;Audit&amp;lt;/li&amp;gt;
            &amp;lt;li class=&amp;quot;menu-item email&amp;quot;&amp;gt;Email&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;&lt;/pre&gt;

&lt;p&gt;The implementation is simple. I will add a new footer row with a single cell that spans the width of the table (in this case 4 columns). The cell will contain an unordered list of menu items; class names and text values will be configurable.&lt;/p&gt;

&lt;p&gt;Next I’ll write a simple jQuery plugin to inject this markup into a RadGrid element.&lt;/p&gt;

&lt;pre class="brush: js;"&gt;(function($) {
    $.fn.footerMenu = function(items, settings) {

        /* Default settings for footer menu class name  */
        var config = { 'className': 'footer-menu' };
        $.extend(config, settings);

        this.each(function() {
            /* Grab the table element */
            var table = $(this).children('table');

            /* Verify that exactly one table element exists */
            if (table.size() === 1) {

                /* Grab the table's footer element */
                var footer = table.children('tfoot');

                /* If not footer element exists, create one and append it to the table */
                if (footer.size() === 0) {
                    footer = $('&amp;lt;tfoot&amp;gt;').appendTo(table);
                }

                /* Grab the last row element that is not the pager or command row  */
                var row = footer.children('tr:last:not(.rgPager):not(.rgCommandRow)');

                /* If a row does not exist, create one and append it to the footer */
                if (row.size() === 0) {
                    row = $('&amp;lt;tr&amp;gt;').appendTo(footer);
                }

                /* Set the row class name to the value specified in the config object  */
                row.attr('class', config.className);

                /* Grab the row's cell element */
                var cell = row.children('td');

                /* If no cell element exists, create one and append it to the row */
                if (cell.size() === 0) {
                    /* Give the cell a column span equal to the number of columns in the table */
                    var colspan = table.find('colgroup col').size();
                    cell = $('&amp;lt;td&amp;gt;').attr('colSpan', colspan).appendTo(row);
                }

                /* Grab the cell's unordered list element  */
                var list = cell.children('ul');

                /* If no list exists, create one and append it to the cell */
                if (list.size() === 0) {
                    list = $('&amp;lt;ul&amp;gt;').appendTo(cell);
                }

                /* Iterate through the menu items */
                for (i = 0; i &amp;lt; items.length; i++) {
                    var item = items[i];

                    /* Create a new list item and append it to the unordered list */
                    var listItem = $('&amp;lt;li&amp;gt;').attr('class', item.className).appendTo(list);

                    /* If the item was given a text value, set it */
                    if (item.text) listItem.append(item.text);

                    /* If the item should be hidden, hide it */
                    if (item.hidden) listItem.hide();

                    /* Add the items click handler to the listItem element */
                    listItem.click(item.click);
                }
            }
        });
        return this;
    };
})($telerik.$);&lt;/pre&gt;

&lt;p&gt;Notice that I pass a reference to &lt;em&gt;$telerik.$&lt;/em&gt; to the self-calling function surrounding the plugin, instead of &lt;em&gt;$&lt;/em&gt; or &lt;em&gt;jQuery&lt;/em&gt;. This is because Telerik aliases the &lt;em&gt;jQuery&lt;/em&gt; object with &lt;em&gt;$telerik.$&lt;/em&gt; in the scripts included in their assembly.&lt;/p&gt;

&lt;h2&gt;Using the new RadGrid footer menu plugin&lt;/h2&gt;

&lt;p&gt;With the plugin created and working properly, I need to write a bit of CSS to style the new menu (and its items) to give it a look that is consistent with the RadGrid theme I’m using. &lt;/p&gt;

&lt;pre class="brush: css;"&gt;.footer-menu td
{
    background-color: #434343;
    padding: 5px;
}

.footer-menu ul
{
    list-style: none;
    padding: 0;
    margin: 0;
}

.footer-menu li
{   
    color: #ccc;
    float: left;
    padding: 5px 5px 5px 25px;
    margin-right: 5px;
    cursor: pointer;
}

.footer-menu li:hover
{           
    background-color: #ccc;
    color: #434343;
}

.footer-menu .export
{
    background: url(/Content/export.png) no-repeat 5px center;
    float: right;
}

.footer-menu .search
{
    background: url(/Content/search.png) no-repeat 5px center;            
}

.footer-menu .audit
{
    background: url(/Content/audit.png) no-repeat 5px center;            
}

.footer-menu .email
{
    background: url(/Content/email.png) no-repeat 5px center;            
}&lt;/pre&gt;

&lt;p&gt;Next, I simply add a reference to the new script in my RadScriptManager. Remember that Telerik includes jQuery with their controls, so you don’t need to have another copy referenced on your page. Check out &lt;a href="http://blogs.telerik.com/atanaskorchev/posts/08-11-06/asp_net_ajax_controls_and_jquery.aspx"&gt;this post&lt;/a&gt; by Atanas Korchev for more details.&lt;/p&gt;

&lt;pre class="brush: js;"&gt;&amp;lt;telerik:RadScriptManager ID=&amp;quot;RadScriptManager1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;
    &amp;lt;Scripts&amp;gt;
        &amp;lt;asp:ScriptReference Assembly=&amp;quot;Telerik.Web.UI&amp;quot; Name=&amp;quot;Telerik.Web.UI.Common.Core.js&amp;quot; /&amp;gt;
        &amp;lt;asp:ScriptReference Assembly=&amp;quot;Telerik.Web.UI&amp;quot; Name=&amp;quot;Telerik.Web.UI.Common.jQuery.js&amp;quot; /&amp;gt;
        &amp;lt;asp:ScriptReference Path=&amp;quot;~/Content/jquery.footer-menu.js&amp;quot; /&amp;gt;
    &amp;lt;/Scripts&amp;gt;
&amp;lt;/telerik:RadScriptManager&amp;gt;&lt;/pre&gt;

&lt;p&gt;Finally, I can create the menu and attach it to the RadGrid instance on my page.&lt;/p&gt;

&lt;pre class="brush: js;"&gt;Sys.Application.add_load(function() {
    var exportData = function() {
        var tableView = $find('&amp;lt;%= rgCustomers.ClientID %&amp;gt;').get_masterTableView();
        tableView.exportToCsv();
    };

    var search = function() {
        // add search functionality
    };

    var audit = function() {
        // add audit functionality
    };

    var email = function() {
        // add email functionality
    };

    var items = [
        { 'text': 'Export Data', 'className': 'export', 'click': exportData },
        { 'text': 'Search', 'className': 'search', 'click': search },
        { 'text': 'Audit', 'className': 'audit', 'click': audit },
        { 'text': 'Email', 'className': 'email', 'click': email }
    ];

    $telerik.$('#&amp;lt;%= rgCustomers.ClientID %&amp;gt;').footerMenu(items);
});&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://www.myviewstate.net/blog/image.axd?picture=radgrid-footer_1.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="radgrid with custom jquery footer" border="0" alt="radgrid with custom jquery footer" src="http://www.myviewstate.net/blog/image.axd?picture=radgrid-footer_thumb_1.png" width="700" height="298" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Final Thoughts&lt;/h2&gt;

&lt;p&gt;Creating jQuery plugins is pretty easy. With jQuery already bundled with the RadControls, using it to customize and enhance their functionality is a no-brainer. For more details on writing your own jQuery plugins, check out &lt;a href="http://docs.jquery.com/Plugins/Authoring"&gt;this tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;[&lt;a href="http://www.box.net/shared/jeno14op2p"&gt;Source: C#&lt;/a&gt;]&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kevinbabcock/~4/E0Rg_WBlZ3o" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/kevinbabcock/~3/E0Rg_WBlZ3o/post.aspx</link>
      <author>Kevin Babcock</author>
      <comments>http://www.myviewstate.net/blog/post/2010/02/28/A-jQuery-footer-menu-plugin-for-the-RadGrid-for-ASPNET-AJAX.aspx#comment</comments>
      <guid isPermaLink="false">http://www.myviewstate.net/blog/post.aspx?id=80fcaa2d-87f2-4b89-8561-e042e7ad93e4</guid>
      <pubDate>Sun, 28 Feb 2010 22:46:30 -0500</pubDate>
      <dc:publisher>Kevin Babcock</dc:publisher>
      <pingback:server>http://www.myviewstate.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.myviewstate.net/blog/post.aspx?id=80fcaa2d-87f2-4b89-8561-e042e7ad93e4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.myviewstate.net/blog/trackback.axd?id=80fcaa2d-87f2-4b89-8561-e042e7ad93e4</trackback:ping>
      <wfw:comment>http://www.myviewstate.net/blog/post/2010/02/28/A-jQuery-footer-menu-plugin-for-the-RadGrid-for-ASPNET-AJAX.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.myviewstate.net/blog/syndication.axd?post=80fcaa2d-87f2-4b89-8561-e042e7ad93e4</wfw:commentRss>
    <feedburner:origLink>http://www.myviewstate.net/blog/post.aspx?id=80fcaa2d-87f2-4b89-8561-e042e7ad93e4</feedburner:origLink></item>
    <item>
      <title>Make cross-domain Ajax requests with jQuery</title>
      <description>&lt;p&gt;Most web developers are keenly aware of the browser&amp;rsquo;s &lt;a href="http://en.wikipedia.org/wiki/Same_origin_policy" target="_blank"&gt;same-origin policy&lt;/a&gt; which prevents document elements (including scripts) from accessing elements of a document from a different origin. A document is considered to be of the same origin if it shares the same protocol, port, and host. For example, &lt;em&gt;&lt;strong&gt;http://www.myviewstate.net&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;http://www.myviewstate.net/blog&lt;/strong&gt;&lt;/em&gt; have the same origin; on the other hand, they do not share the same origin with URLs such as &lt;em&gt;&lt;strong&gt;https://www.myviewstate.net&lt;/strong&gt;&lt;/em&gt; (different protocol) or &lt;em&gt;&lt;strong&gt;http://myviewstate.net&lt;/strong&gt;&lt;/em&gt; (different host). This is generally a good security measure as it helps prevent access to the document by sites that you did not visit. Granted, there are still &lt;a href="http://en.wikipedia.org/wiki/Cross-site_scripting" target="_blank"&gt;security vulnerabilities&lt;/a&gt; that can be used to work around this policy, but that&amp;rsquo;s a topic for another day.&lt;/p&gt;
&lt;p&gt;One drawback to this security feature is that is requires web developers to go through an intermediary server on the same domain to load content from other sites into a local page. For example, a page wanting to load data from Twitter&amp;rsquo;s search API might create a server-side proxy to negotiate communication between the client and the remote server. This is a good practice for most sites. However, it is still possible to make such a request directly from client script using the &lt;em&gt;JSON with padding&lt;/em&gt; (&lt;a href="http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/" target="_blank"&gt;JSONP&lt;/a&gt;) pattern. With JSONP a script tag pointing to the remote server is injected into the page, forcing the browser to download the remote content since script tags are not subject to the cross-domain policy restriction. The server on the other end &amp;ldquo;pads&amp;rdquo; the response with a callback function that is injected into the page and executed. In the following example the browser provides the name of the callback by way of a query string parameter in the URL.&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;script type='text/javascript' 
        src='http://search.twitter.com/search.json?callback=parseData&amp;amp;q=jquery'&amp;gt;
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;If the service on the other end supports JSONP it will pad the returned JSON data with the provided function name.&lt;/p&gt;
&lt;pre class="brush: js;"&gt;parseData({"results":[{"profile_image_url":"&amp;hellip;&amp;rdquo;}&amp;hellip;]})&lt;/pre&gt;
&lt;p&gt;When the script is injected into the page, &lt;em&gt;parseData&lt;/em&gt; is executed and you immediately have access to the JSON data returned from the remote server.&lt;/p&gt;
&lt;h3&gt;JSONP &amp;amp; jQuery&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://jquery.com/" target="_blank"&gt;jQuery&lt;/a&gt; provides built-in support for this functionality through use of the &lt;em&gt;&lt;a href="http://docs.jquery.com/Ajax/jQuery.ajax" target="_blank"&gt;jQuery.ajax&lt;/a&gt;&lt;/em&gt; member. I&amp;rsquo;ve discussed some of its features in &lt;a href="http://www.myviewstate.net/blog/post/2009/05/06/Disabling-Browser-Cache-when-Making-Ajax-Calls-with-jQuery.aspx" target="_blank"&gt;previous posts&lt;/a&gt;, but in summary this function can be used to make just about every kind of Ajax request. To make a JSONP call and process the response you must provide a minimum of the following settings to the function:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;$.ajax({
    url: 'http://search.twitter.com/search.json?q=jquery',
    dataType: 'jsonp',
    success: function(data) {
        // process result data
    }
});&lt;/pre&gt;
&lt;p&gt;jQuery automatically generates a callback function, which it attaches to the &lt;em&gt;window&lt;/em&gt; property of the DOM, and adds a unique &lt;em&gt;callback&lt;/em&gt; query string parameter to the request. The requested URL looks something like this: &lt;strong&gt;http://search.twitter.com/search.json?q=jquery&amp;amp;callback=jsonp1267158972337&lt;/strong&gt;. By letting jQuery auto generate the callback function, you can access the results via the function assigned to the &lt;em&gt;success&lt;/em&gt; setting that you pass into&lt;em&gt; jQuery.ajax&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you want to define your own callback handler, you can specify it using the &lt;em&gt;jsonpCallback&lt;/em&gt; setting passed to &lt;em&gt;jQuery.ajax&lt;/em&gt;.&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;$.ajax({
    url: 'http://search.twitter.com/search.json?q=jquery',
    dataType: 'jsonp',
    jsonpCallback: 'myCallback'
});

function myCallback(data) {
    // process result data
}&lt;/pre&gt;
&lt;p&gt;The requested URL for this request would look like this: &lt;strong&gt;http://search.twitter.com/search.json?q=jquery&amp;amp;callback=myCallback&lt;/strong&gt;. When you provide your own callback handler the handler generated by jQuery is not called, so providing a function for the &lt;em&gt;success&lt;/em&gt; setting is pointless in this case.&lt;/p&gt;
&lt;p&gt;If you need to provide the name of the query string parameter uses to define the callback function, you can do so with the &lt;em&gt;jsonp&lt;/em&gt; setting. This is useful for Ajax calls to a server that expects a different parameter than the default (&lt;em&gt;callback&lt;/em&gt;). A good example of this is the Bing API, which expects a query string parameter called &lt;em&gt;JsonCallback&lt;/em&gt; to contain the name of the callback function.&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;$.ajax({
    url: 'http://api.search.live.net/json.aspx?Appid=&amp;lt;id&amp;gt;&amp;amp;JsonType=callback&amp;amp;sources=web&amp;amp;query=jQuery',
    dataType: 'jsonp',
    jsonp: 'JsonCallback',
    jsonpCallback: 'searchResults'
});

function searchResults(data) {
    // process search results
}&lt;/pre&gt;
&lt;p&gt;The requested URL for this request would look like this: &lt;strong&gt;http://api.search.live.net/json.aspx?Appid=&amp;lt;id&amp;gt;&amp;amp;JsonType=callback&amp;amp;sources=web&amp;amp;query=jQuery&amp;amp;JsonCallback=searchResults&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;One final option for making a cross-domain request using the jQuery library is to use the higher-level function &lt;em&gt;jQuery.getJSON&lt;/em&gt;. This function merely abstracts the settings typically passed to &lt;em&gt;jQuery.ajax&lt;/em&gt;, replacing them with default values. This means you get a function that is easier to use, but less flexible.&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;$.getJSON('http://search.twitter.com/search.json?q=jquery&amp;amp;callback=?', 
    function(data) {
        // process result data
    }
);&lt;/pre&gt;
&lt;h3&gt;Final Thoughts&lt;/h3&gt;
&lt;p&gt;Having the ability to make cross-domain requests can be quite useful, but only when used wisely. Remember that with this method you are injecting a remote script into your page; it is best to use this functionality only when you absolutely trust that the content returned from the remote server is not malicious.&lt;/p&gt;
&lt;p&gt;Thoughts?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kevinbabcock/~4/UYhxqnmtGCc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/kevinbabcock/~3/UYhxqnmtGCc/post.aspx</link>
      <author>Kevin Babcock</author>
      <comments>http://www.myviewstate.net/blog/post/2010/02/26/Make-cross-domain-Ajax-requests-with-jQuery.aspx#comment</comments>
      <guid isPermaLink="false">http://www.myviewstate.net/blog/post.aspx?id=42927465-2229-49d7-bc6d-ea975aa1df86</guid>
      <pubDate>Fri, 26 Feb 2010 00:55:00 -0500</pubDate>
      <dc:publisher>Kevin Babcock</dc:publisher>
      <pingback:server>http://www.myviewstate.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.myviewstate.net/blog/post.aspx?id=42927465-2229-49d7-bc6d-ea975aa1df86</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.myviewstate.net/blog/trackback.axd?id=42927465-2229-49d7-bc6d-ea975aa1df86</trackback:ping>
      <wfw:comment>http://www.myviewstate.net/blog/post/2010/02/26/Make-cross-domain-Ajax-requests-with-jQuery.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.myviewstate.net/blog/syndication.axd?post=42927465-2229-49d7-bc6d-ea975aa1df86</wfw:commentRss>
    <feedburner:origLink>http://www.myviewstate.net/blog/post.aspx?id=42927465-2229-49d7-bc6d-ea975aa1df86</feedburner:origLink></item>
    <item>
      <title>Conditional Client-side Row Selection with the RadGrid for ASP.NET AJAX</title>
      <description>&lt;p align="justify"&gt;A few weeks ago &lt;a href="http://stackoverflow.com/questions/1869038/can-an-individual-radgrid-row-be-selectable-based-upon-a-condition" target="_blank"&gt;a StackOverflow user asked&lt;/a&gt; whether or not a RadGrid row could be selectable based upon some condition. I've run into scenarios in the past where this feature would have come in handy, but unfortunately the functionality is not provided in the &lt;a href="http://demos.telerik.com/aspnet-ajax/grid/examples/overview/defaultcs.aspx" target="_blank"&gt;RadGrid&lt;/a&gt; out of the box. However, as is common with &lt;a href="http://www.telerik.com/" target="_blank"&gt;Telerik&lt;/a&gt; components, it is possible to implement this functionality with a little extra effort. &lt;/p&gt;  &lt;p align="justify"&gt;First, let's start with a basic RadGrid and some data. For this example, we'll rely on our trusty friend &lt;a href="http://msdn.microsoft.com/en-us/library/aa276825%28SQL.80%29.aspx" target="_blank"&gt;Northwind&lt;/a&gt; and use &lt;a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx" target="_blank"&gt;LINQ to SQL&lt;/a&gt; and the &lt;a href="http://msdn.microsoft.com/en-us/library/bb547113.aspx" target="_blank"&gt;LinqDataSource control&lt;/a&gt; to wire some customer data up to the grid. &lt;/p&gt;  &lt;div align="justify"&gt;   &lt;pre class="brush: xml;"&gt;&amp;lt;telerik:RadScriptManager ID=&amp;quot;RadScriptManager1&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt; 
&amp;lt;telerik:RadGrid ID=&amp;quot;rgCustomers&amp;quot; runat=&amp;quot;server&amp;quot; 
    AllowMultiRowSelection=&amp;quot;true&amp;quot; 
    DataSourceID=&amp;quot;ldsCustomers&amp;quot;&amp;gt; 
    &amp;lt;ClientSettings 
        EnableRowHoverStyle=&amp;quot;true&amp;quot;&amp;gt; 
        &amp;lt;Selecting AllowRowSelect=&amp;quot;true&amp;quot; /&amp;gt; 
    &amp;lt;/ClientSettings&amp;gt; 
    &amp;lt;MasterTableView&amp;gt; 
        &amp;lt;Columns&amp;gt; 
            &amp;lt;telerik:GridClientSelectColumn UniqueName=&amp;quot;SelectColumn&amp;quot; /&amp;gt; 
        &amp;lt;/Columns&amp;gt; 
    &amp;lt;/MasterTableView&amp;gt; 
&amp;lt;/telerik:RadGrid&amp;gt; 
&amp;lt;asp:LinqDataSource ID=&amp;quot;ldsCustomers&amp;quot; runat=&amp;quot;server&amp;quot; 
    ContextTypeName=&amp;quot;RadGridConditionalClientSideRowSelection.Data.NorthwindDataContext&amp;quot; 
    TableName=&amp;quot;Customers&amp;quot;&amp;gt; 
&amp;lt;/asp:LinqDataSource&amp;gt; &lt;/pre&gt;
&lt;/div&gt;

&lt;p align="justify"&gt;I've allowed the grid to automatically generate its columns based on the data to which it is bound, and added an additional &lt;a href="http://www.telerik.com/help/aspnet-ajax/grdcolumntypes.html" target="_blank"&gt;GridClientSelectColumn&lt;/a&gt; for selecting rows. Notice that I've also set the properties required to turn on client-side single- and multi-row selection. With those necessary first steps out of the way we can now implement the conditional selection functionality... &lt;/p&gt;

&lt;p align="justify"&gt;First, we need to add a property to the &lt;strong&gt;Customer&lt;/strong&gt; entity that specifies whether or not a specific customer is selectable. Since we’re using LINQ to SQL, we can simply create a partial &lt;strong&gt;Customer&lt;/strong&gt; class and add the new property as well 

  &lt;br /&gt;as the business rule used to determine the 'selectability' of the customer. For this example, let’s make all customers selectable except those from North America. &lt;/p&gt;

&lt;div align="justify"&gt;
  &lt;pre class="brush: csharp;"&gt;public partial class Customer 
{ 
    public bool IsSelectable 
    { 
        get { return this.Country != &amp;quot;USA&amp;quot; &amp;amp;&amp;amp; this.Country != &amp;quot;Canada&amp;quot;; } 
    } 
} &lt;/pre&gt;
&lt;/div&gt;

&lt;p align="justify"&gt;It shouldn't be too difficult to translate this to your own data model, regardless of whether you're using &lt;a href="http://demos.telerik.com/orm" target="_blank"&gt;OpenAccess&lt;/a&gt; or &lt;a href="http://msdn.microsoft.com/en-us/library/bb399572.aspx" target="_blank"&gt;some other ORM&lt;/a&gt;, or just good old fashion &lt;a href="http://msdn.microsoft.com/en-us/library/h43ks021.aspx" target="_blank"&gt;ADO.NET&lt;/a&gt; (e.g. if you're binding to a &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx" target="_blank"&gt;DataTable&lt;/a&gt; then just add the extra column and iterate through each row, setting each value based on your business rules). Once this extra value is added to our data model, we can easily track it with the RadGrid by adding it to the MasterTableView's &lt;a href="http://www.telerik.com/help/aspnet-ajax/grdextractkeyvaluesclientside.html" target="_blank"&gt;ClientDataKeyNames&lt;/a&gt; collection. And since tracking it is only useful if we can access it when we need it - and we need it when a user attempts to select a record – we’ll add an event handler for the &lt;a href="http://www.telerik.com/help/aspnet-ajax/grid_onrowselecting.html" target="_blank"&gt;OnRowSelecting&lt;/a&gt; client-side event. &lt;/p&gt;

&lt;div align="justify"&gt;
  &lt;pre class="brush: xml;"&gt;&amp;lt;telerik:RadGrid ID=&amp;quot;rgCustomers&amp;quot; runat=&amp;quot;server&amp;quot; 
    AllowMultiRowSelection=&amp;quot;true&amp;quot; 
    DataSourceID=&amp;quot;ldsCustomers&amp;quot;&amp;gt; 
    &amp;lt;ClientSettings 
        EnableRowHoverStyle=&amp;quot;true&amp;quot;&amp;gt; 
        &amp;lt;ClientEvents OnRowSelecting=&amp;quot;rowSelecting&amp;quot; /&amp;gt; 
        &amp;lt;Selecting AllowRowSelect=&amp;quot;true&amp;quot; /&amp;gt; 
    &amp;lt;/ClientSettings&amp;gt; 
    &amp;lt;MasterTableView 
        ClientDataKeyNames=&amp;quot;IsSelectable&amp;quot;&amp;gt; 
        &amp;lt;Columns&amp;gt; 
            &amp;lt;telerik:GridClientSelectColumn UniqueName=&amp;quot;SelectColumn&amp;quot; /&amp;gt; 
        &amp;lt;/Columns&amp;gt; 
    &amp;lt;/MasterTableView&amp;gt; 
&amp;lt;/telerik:RadGrid&amp;gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;div align="justify"&gt;
  &lt;pre class="brush: js;"&gt;function rowSelecting(sender, args) { 
    var isSelectable = args.getDataKeyValue('IsSelectable') === 'True'; 
    args.set_cancel(!isSelectable); 
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p align="justify"&gt;Since we’re automatically generating the columns displayed in the RadGrid, we'll need to hide the &lt;strong&gt;IsSelectable&lt;/strong&gt; column. This can be avoided by setting the &lt;strong&gt;AutoGenerateColumns&lt;/strong&gt; property of the RadGrid to false and defining each column in the grid manually. Or we can simply hide the column during the RadGrid's &lt;a href="http://www.telerik.com/help/aspnet-ajax/grid_oncolumncreated.html" target="_blank"&gt;OnColumnCreated&lt;/a&gt; event. &lt;/p&gt;

&lt;div align="justify"&gt;
  &lt;pre class="brush: csharp;"&gt;protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    rgCustomers.ColumnCreated += new GridColumnCreatedEventHandler(rgCustomers_ColumnCreated); 
} 

protected void rgCustomers_ColumnCreated(object sender, GridColumnCreatedEventArgs e) 
{ 
    if (e.Column.UniqueName == &amp;quot;IsSelectable&amp;quot;) 
    { 
        e.Column.Visible = false; 
    } 
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p align="justify"&gt;Now whenever a record is selected, we can retrieve the value of its &lt;strong&gt;IsSelectable&lt;/strong&gt; property and either cancel the selection, or allow it to continue. &lt;/p&gt;

&lt;p align="justify"&gt;Okay, so these few easy tweaks get us 90% of the way there. However, this workaround will break the multi-select functionality and therefore we must also add a workaround to make it functional again. As you can see from the image below, the &lt;em&gt;select all&lt;/em&gt; checkbox in the header remains unchecked after it is selected. This happens because our &lt;strong&gt;rowSelected&lt;/strong&gt; event handler cancels the row selection for those rows which are not selectable, and internally this prevents the &lt;em&gt;select all&lt;/em&gt; checkbox from being toggled. Therefore, you cannot uncheck the &lt;em&gt;select all &lt;/em&gt;checkbox to deselect all rows again. &lt;/p&gt;
&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="broken-client-select" border="0" alt="broken-client-select" src="http://www.myviewstate.net/blog/image.axd?picture=broken-client-select_3.jpg" width="500" height="231" /&gt; 

&lt;p align="justify"&gt;The workaround for this is fairly straightforward, but required a little digging into the RadGrid's client-side API and borrowing of its private functions in order to achieve the desired functionality. First, let's take a look at the code and then I'll discuss what it's doing. &lt;/p&gt;

&lt;div align="justify"&gt;
  &lt;pre class="brush: js;"&gt;function pageLoad() { 
    var tableView = $find('&amp;lt;%= rgCustomers.ClientID %&amp;gt;').get_masterTableView(); 
    var headerRow = Telerik.Web.UI.Grid.getTableHeaderRow(tableView.get_element()); 
    var checkBox = getSelectCheckBox(headerRow); 
    if (checkBox) checkBox.onclick = function(e) { 
        var event = e || window.event; 
        selectAllRows(checkBox.checked, event); 
    }; 
} 

function selectAllRows(checkHeaderSelectCheckBox, event) { 
    var gridSelection = new Telerik.Web.UI.GridSelection(); 
    var grid = $find('&amp;lt;%= rgCustomers.ClientID %&amp;gt;'); 
    var tableView = grid.get_masterTableView(); 
    var headerRow = Telerik.Web.UI.Grid.getTableHeaderRow(tableView.get_element()); 
    grid._selectAllRows(tableView.get_id(), null, event); 
    gridSelection._checkClientSelectColumn(headerRow, checkHeaderSelectCheckBox); 
} 

function getSelectCheckBox(el) { 
    var inputs = el.getElementsByTagName('input'); 
    for (var i = 0; i &amp;lt; inputs.length; i++) { 
        var input = inputs[i]; 
        if (input.type.toLowerCase() !== 'checkbox') 
            continue; 
        if (input.id &amp;amp;&amp;amp; input.id.indexOf('SelectCheckBox') != -1) 
            return input; 
    } 
} &lt;/pre&gt;
&lt;/div&gt;

&lt;p align="justify"&gt;In the &lt;strong&gt;pageLoad&lt;/strong&gt; function, I'm getting an instance of the MasterTableView's client-side object and retrieving it's header row element. Inside that element is the &lt;em&gt;select all&lt;/em&gt; checkbox, which I retrieve using a bit of DOM traversal in the &lt;strong&gt;getSelectCheckBox&lt;/strong&gt; function. I attach an &lt;a href="http://msdn.microsoft.com/en-us/library/ms536913%28VS.85%29.aspx" target="_blank"&gt;onclick&lt;/a&gt; event handler, which calls the &lt;strong&gt;selectAllRows&lt;/strong&gt; function, to the checkbox. This function mimics exactly what is happening behind the scenes in the RadGrid's client-side API, but changes the order in which things happen. You see, &lt;strong&gt;_selectAllRows&lt;/strong&gt; must be fired before &lt;strong&gt;_checkClientSelectColumn&lt;/strong&gt;; otherwise, when the &lt;strong&gt;rowSelecting&lt;/strong&gt; event handler we defined cancels the row selection, the checkbox in the header will be left unchecked and break the multi-select/deselect functionality.&lt;/p&gt;

&lt;p align="justify"&gt;Now with the new workaround in place, the conditional row selection works like a charm (without breaking other functionality). &lt;/p&gt;

&lt;p align="justify"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="client-select" border="0" alt="client-select" src="http://www.myviewstate.net/blog/image.axd?picture=client-select_2.jpg" width="500" height="233" /&gt; &lt;/p&gt;

&lt;p align="justify"&gt;Hopefully my explanation of the code above is clear. If not, I highly recommend you dig into the RadGrid's client-side source code yourself and investigate how the row selection functionality works (specifically, take a look at the following RadGrid source files: GridCommon.js, GridSelection.js, and RadGrid.js). Remember, if you own a &lt;a href="http://www.telerik.com/purchase.aspx" target="_blank"&gt;Telerik subscription license&lt;/a&gt; you have access to the source code as well. Reading and understanding how the controls are implemented provides quite a bit of clarity and is an immense amount of help to me when I find the need to implement workarounds such as this. &lt;/p&gt;

&lt;p align="justify"&gt;I think it would be nice to see Telerik implement conditional row selection in future versions of the RadGrid. But until then, they've provided a flexible enough client-side framework to allow us to implement such features with a minimal amount of effort. That's why I continue to use them in my own projects and recommend them to others. &lt;/p&gt;

&lt;p&gt;[&lt;a href="http://www.box.net/shared/89movijsb4" target="_blank"&gt;Source Code&lt;/a&gt;]&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.myviewstate.net%2fblog%2fpost%2f2010%2f01%2f07%2fConditional-Client-side-Row-Selection-with-the-RadGrid-for-ASPNET-AJAX.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.myviewstate.net%2fblog%2fpost%2f2010%2f01%2f07%2fConditional-Client-side-Row-Selection-with-the-RadGrid-for-ASPNET-AJAX.aspx" /&gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/kevinbabcock/~4/6Y8LEvW9rsc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/kevinbabcock/~3/6Y8LEvW9rsc/post.aspx</link>
      <author>Kevin Babcock</author>
      <comments>http://www.myviewstate.net/blog/post/2010/01/07/Conditional-Client-side-Row-Selection-with-the-RadGrid-for-ASPNET-AJAX.aspx#comment</comments>
      <guid isPermaLink="false">http://www.myviewstate.net/blog/post.aspx?id=23eaabf6-5148-4500-b016-e979a7973d33</guid>
      <pubDate>Thu, 07 Jan 2010 22:02:00 -0500</pubDate>
      <dc:publisher>Kevin Babcock</dc:publisher>
      <pingback:server>http://www.myviewstate.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.myviewstate.net/blog/post.aspx?id=23eaabf6-5148-4500-b016-e979a7973d33</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.myviewstate.net/blog/trackback.axd?id=23eaabf6-5148-4500-b016-e979a7973d33</trackback:ping>
      <wfw:comment>http://www.myviewstate.net/blog/post/2010/01/07/Conditional-Client-side-Row-Selection-with-the-RadGrid-for-ASPNET-AJAX.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.myviewstate.net/blog/syndication.axd?post=23eaabf6-5148-4500-b016-e979a7973d33</wfw:commentRss>
    <feedburner:origLink>http://www.myviewstate.net/blog/post.aspx?id=23eaabf6-5148-4500-b016-e979a7973d33</feedburner:origLink></item>
    <item>
      <title>Please stay tuned...</title>
      <description>&lt;p&gt;I've been pretty quiet for the last few months...life just seems to get in the way of my blogging time I guess. But with a new year (and decade!) started, it's time to pay this blog a bit more attention. However, before I dust the cobwebs off I need to migrate this blog to my new Windows Server 2008 VPS, a task I've been putting off for months.&lt;/p&gt;
&lt;p&gt;So please stay tuned for new posts, and bear with me over the next few days as I transition this blog to its new home.&lt;/p&gt;
&lt;p&gt;--Kevin&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kevinbabcock/~4/3vKAphwl1wY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/kevinbabcock/~3/3vKAphwl1wY/post.aspx</link>
      <author>Kevin Babcock</author>
      <comments>http://www.myviewstate.net/blog/post/2010/01/06/Please-stay-tuned.aspx#comment</comments>
      <guid isPermaLink="false">http://www.myviewstate.net/blog/post.aspx?id=24226d2b-96c5-415d-bfb5-29e29ebdc599</guid>
      <pubDate>Wed, 06 Jan 2010 21:25:00 -0500</pubDate>
      <dc:publisher>Kevin Babcock</dc:publisher>
      <pingback:server>http://www.myviewstate.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.myviewstate.net/blog/post.aspx?id=24226d2b-96c5-415d-bfb5-29e29ebdc599</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.myviewstate.net/blog/trackback.axd?id=24226d2b-96c5-415d-bfb5-29e29ebdc599</trackback:ping>
      <wfw:comment>http://www.myviewstate.net/blog/post/2010/01/06/Please-stay-tuned.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.myviewstate.net/blog/syndication.axd?post=24226d2b-96c5-415d-bfb5-29e29ebdc599</wfw:commentRss>
    <feedburner:origLink>http://www.myviewstate.net/blog/post.aspx?id=24226d2b-96c5-415d-bfb5-29e29ebdc599</feedburner:origLink></item>
  </channel>
</rss>

