<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>With Great Power comes Great Response.write("Ability") : Prototype</title><link>http://blogs.msdn.com/phaniraj/archive/tags/Prototype/default.aspx</link><description>Tags: Prototype</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Customizing Serialization of Entities in the ADO.NET Data Services Client Library</title><link>http://blogs.msdn.com/phaniraj/archive/2008/12/11/customizing-serialization-of-entities-in-the-ado-net-data-services-client-library.aspx</link><pubDate>Fri, 12 Dec 2008 02:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9199026</guid><dc:creator>PhaniRajuYN</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/phaniraj/comments/9199026.aspx</comments><wfw:commentRss>http://blogs.msdn.com/phaniraj/commentrss.aspx?PostID=9199026</wfw:commentRss><description>&lt;P&gt;This post is inspired by this forum thread :&lt;A href="http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/b7a9e01d-c5c2-4478-8f01-00f7f6e0f75f" target=_blank mce_href="http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/b7a9e01d-c5c2-4478-8f01-00f7f6e0f75f"&gt;Data services client -- exception on saveChanges&lt;/A&gt;&lt;/P&gt;
&lt;H4&gt;Problem Statement &lt;/H4&gt;&lt;BR&gt;
&lt;P&gt;I have added some custom proeprties to the Entity Types Generated by DataSvcUtil.exe /Add Service Reference / Hand Coded , &lt;BR&gt;these properties do not exist on the server and should not be sent to the server . &lt;BR&gt;When I try to save an object of a Type which has custom client-Side only properties to the Data Service using AddObject and SaveChanges, &lt;BR&gt;I get the following error :&lt;/P&gt;&lt;PRE class=csharpcode&gt;Error processing request stream. The property name &lt;SPAN class=str&gt;'{PropertyName}'&lt;/SPAN&gt; specified &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; type '{TypeName} &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; not valid&lt;/PRE&gt;
&lt;P&gt;This error is basically from the server telling the client library that its sending a payload which does not seem to match the definition &lt;BR&gt;of the Entity Type on the server. &lt;BR&gt;&lt;BR&gt;We can solve this problem by customizing the Payload that the client generates when it sends the entity to the server. &lt;BR&gt;The DataServiceContext exposes an event called &lt;A href="http://msdn.microsoft.com/en-us/library/system.data.services.client.dataservicecontext.writingentity.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/system.data.services.client.dataservicecontext.writingentity.aspx"&gt;WritingEntity&lt;/A&gt; that is fired right before we send the payload over the wire.&lt;/P&gt;
&lt;P&gt;Its argumentlist contains &lt;A href="http://msdn.microsoft.com/en-us/library/system.data.services.client.readingwritingentityeventargs.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/system.data.services.client.readingwritingentityeventargs.aspx"&gt;ReadingWritingEntityEventArgs&lt;/A&gt; which gives you access to the Entity Instance being Serialized ( e.Entity )&amp;nbsp; &lt;BR&gt;and the ATOM Payload (e.Data ) we are about to send to the Server.&lt;/P&gt;
&lt;H5&gt;Removing a property from the ATOM Payload that is being sent to the server.&lt;/H5&gt;&lt;PRE class=darkcsharpcode&gt;&lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; dataContext_WritingEntity(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, ReadingWritingEntityEventArgs e) {

    &lt;SPAN class=rem&gt;// e.Data gives you the XElement for the Serialization of the Entity &lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;//Using XLinq  , you can  add/Remove properties to the element Payload  &lt;/SPAN&gt;
    XName xnEntityProperties = XName.Get(&lt;SPAN class=str&gt;"properties"&lt;/SPAN&gt;, e.Data.GetNamespaceOfPrefix(&lt;SPAN class=str&gt;"m"&lt;/SPAN&gt;).NamespaceName);
    XElement xePayload = e.Data.Descendants().Where&amp;lt;XElement&amp;gt;(xe =&amp;gt; xe.Name == xnEntityProperties).First&amp;lt;XElement&amp;gt;();
   &lt;SPAN class=rem&gt;//The XName of the property we are going to remove from the payload&lt;/SPAN&gt;
    XName xnProperty = XName.Get(“{PropertyName}”, e.Data.GetNamespaceOfPrefix(&lt;SPAN class=str&gt;"d"&lt;/SPAN&gt;).NamespaceName);

    &lt;SPAN class=rem&gt;//Get the Property of the entity  you don't want sent to the server&lt;/SPAN&gt;
    XElement xeRemoveThisProperty = xePayload.Descendants().Where&amp;lt;XElement&amp;gt;(xe =&amp;gt; xe.Name == xnProperty).First&amp;lt;XElement&amp;gt;();
    &lt;SPAN class=rem&gt;//Remove this property from the Payload sent to the server &lt;/SPAN&gt;
     xeRemoveThisProperty.Remove();

     }
}&lt;/PRE&gt;
&lt;P&gt;Generalizing this further , we want to make it easier to customize the serialization of multiple entity types without having to write &lt;BR&gt;multiple copies of the WritingEntity event handler. &lt;BR&gt;We will add an attribute that specfies that a certain CLR property should not be serialized in the ATOM Payload when the client library &lt;BR&gt;sends the entity to the server.&lt;/P&gt;&lt;PRE class=darkcsharpcode&gt;    &lt;SPAN class=rem&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;/// Properties marked with this Attribute are not serialized in the payload when sent to the server&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
    [AttributeUsage(AttributeTargets.Property)]
    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; DoNotSerializeAttribute : Attribute
    {
    }&lt;/PRE&gt;
&lt;P&gt;Now , we change the WritingEntity Event handler to remove any property&amp;nbsp; that has this attribute on it . &lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;PRE class=darkcsharpcode&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; DataServiceContextEx_WritingEntity(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, ReadingWritingEntityEventArgs e)
        {
            &lt;SPAN class=rem&gt;// e.Data gives you the XElement for the Serialization of the Entity &lt;/SPAN&gt;
            &lt;SPAN class=rem&gt;//Using XLinq  , you can  add/Remove properties to the element Payload  &lt;/SPAN&gt;
            XName xnEntityProperties = XName.Get(&lt;SPAN class=str&gt;"properties"&lt;/SPAN&gt;, e.Data.GetNamespaceOfPrefix(&lt;SPAN class=str&gt;"m"&lt;/SPAN&gt;).NamespaceName);
            XElement xePayload = &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;;
            &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (PropertyInfo property &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; e.Entity.GetType().GetProperties())
            {
                &lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt;[] doNotSerializeAttributes = property.GetCustomAttributes(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(DoNotSerializeAttribute), &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;);
                &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (doNotSerializeAttributes.Length &amp;gt; 0)
                {
                    &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (xePayload == &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                    {
                        xePayload = e.Data.Descendants().Where&amp;lt;XElement&amp;gt;(xe =&amp;gt; xe.Name == xnEntityProperties).First&amp;lt;XElement&amp;gt;();
                    }
                    &lt;SPAN class=rem&gt;//The XName of the property we are going to remove from the payload&lt;/SPAN&gt;
                    XName xnProperty = XName.Get(property.Name, e.Data.GetNamespaceOfPrefix(&lt;SPAN class=str&gt;"d"&lt;/SPAN&gt;).NamespaceName);
                    &lt;SPAN class=rem&gt;//Get the Property of the entity  you don't want sent to the server&lt;/SPAN&gt;
                    XElement xeRemoveThisProperty = xePayload.Descendants().Where&amp;lt;XElement&amp;gt;(xe =&amp;gt; xe.Name == xnProperty).First&amp;lt;XElement&amp;gt;();
                    &lt;SPAN class=rem&gt;//Remove this property from the Payload sent to the server &lt;/SPAN&gt;
                    xeRemoveThisProperty.Remove();
                }
            }
        }&lt;/PRE&gt;
&lt;P&gt;We can encapsulate this functionality into its own class and any DataServiceContext type that inherits from this class should be able to &lt;BR&gt;inherit this functionality too . &lt;BR&gt;Complete Source Code :&lt;/P&gt;
&lt;SCRIPT src="http://gist.github.com/113147.js" mce_src="http://gist.github.com/113147.js"&gt;&lt;/SCRIPT&gt;

&lt;H4&gt;Using this in your applications : &lt;/H4&gt;
&lt;P&gt;Create a partial class with the same name as shown above and include it in your application to get this behavior.&lt;/P&gt;
&lt;P&gt;Attribute your types with the DoNotSerializeAttribute&amp;nbsp; attribute so that this property is not serialized. &lt;BR&gt;&lt;/P&gt;&lt;PRE class=darkcsharpcode&gt; &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; TestType
    {
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; ID { get; set; }
        &lt;SPAN class=rem&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN class=rem&gt;/// This Property is client-only , should not be sent to the server&lt;/SPAN&gt;
        &lt;SPAN class=rem&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        [DoNotSerialize]
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; ClientOnlyProperty { get; set; }
    }&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9199026" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Prototype/default.aspx">Prototype</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Astoria/default.aspx">Astoria</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Demo/default.aspx">Demo</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Documentation/default.aspx">Documentation</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/DataServiceContext/default.aspx">DataServiceContext</category></item><item><title>Accessing Cross-Domain ADO.NET Data Services from the Silverlight Client Library</title><link>http://blogs.msdn.com/phaniraj/archive/2008/10/21/accessing-cross-domain-ado-net-data-services-from-the-silverlight-client-library.aspx</link><pubDate>Tue, 21 Oct 2008 05:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9008548</guid><dc:creator>PhaniRajuYN</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/phaniraj/comments/9008548.aspx</comments><wfw:commentRss>http://blogs.msdn.com/phaniraj/commentrss.aspx?PostID=9008548</wfw:commentRss><description>&lt;p&gt;When we built the client library for Silverlight in Silverlight 2.0 , the underlying Network Stack provided by Silverlight core libraries    &lt;br /&gt;was very limited in terms of the Status Codes and Request Verbs that it supported.Our options were :     &lt;br /&gt;a) Use the System.Net libraries provided by the agClr and give a limited subset of the functionality available on the desktop.     &lt;br /&gt;b) Cook up our own Network stack and provide all the functionality provided on the desktop , in Silverlight.&lt;/p&gt;  &lt;p&gt;We went with Option (b) and built a network stack that uses the browser’s underlying XmlHttpRequest object.    &lt;br /&gt;This means that the &lt;a href="http://msdn.microsoft.com/en-us/library/cc197955(VS.95).aspx"&gt;cross domain access available in Silverlight networking stack&lt;/a&gt; is not available in our networking stack.     &lt;br /&gt;    &lt;br /&gt;Forums user Ben Hayat asked a &lt;a href="http://forums.microsoft.com/Forums/ShowPost.aspx?PostID=3995200&amp;amp;SiteID=1"&gt;question&lt;/a&gt; about the guidelines for Cross-Domain access using our Silverlight Client Library .     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Now , this is not supported out of the box . But ,you can use the same solution as you would for an Ajax application ,    &lt;br /&gt;which is building&amp;#160; a server-side proxy that talks to the remote service and is completely transparent to the client library.     &lt;br /&gt;    &lt;br /&gt;Below is a sample Server-Side proxy that would help one talk to Data Services hosted on a different domain than the Silverlight application.     &lt;br /&gt;    &lt;br /&gt;There are a couple of issues that a Server-Side proxy needs to solve for an ADO.NET Data Service ,     &lt;br /&gt;&amp;#160; a) Appear totally transparent     &lt;br /&gt;&amp;#160; b) Resolve Identities of resources to appear as they would from the Proxy service and not the original Data Service.     &lt;br /&gt;    &lt;br /&gt;Issue a) is easy , Issue b) is a little more involved.     &lt;br /&gt;    &lt;br /&gt;When the client library receives a Payload back as part of a query ,we construct the entity’s identity based on the following rules,     &lt;br /&gt;ex: If you browse to &lt;a href="http://ServiceEndpoint/Northwind.svc/"&gt;&lt;strong&gt;http://ServiceEndpoint&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;/Northwind.svc/Customers('ALFKI') ,&lt;/strong&gt;the response looks like this :&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&amp;#160;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;entry&lt;/span&gt; &lt;strong&gt;&lt;font color="#800040"&gt;&lt;span class="attr"&gt;xml:base&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://ServiceEndpointNorthwind.svc/&amp;quot;&lt;/span&gt; 
&lt;/font&gt;&lt;/strong&gt;       &lt;span class="attr"&gt;xmlns:d&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/ado/2007/08/dataservices&amp;quot;&lt;/span&gt; 
       &lt;span class="attr"&gt;xmlns:m&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/ado/2007/08/dataservices/metadata&amp;quot;&lt;/span&gt; 
       &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/2005/Atom&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;strong&gt;&lt;font color="#800000"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;edit&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Customers&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Customers('ALFKI')&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; 
&lt;/font&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;http://ServiceEndpointNorthwind.svc/Customers('ALFKI')&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/strong&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;content&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;application/xml&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;m:properties&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
     &lt;strong&gt;Properties go here &lt;br /&gt;&lt;/strong&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;m:properties&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;content&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;entry&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;When we get the above payload back as a response , we&amp;#160; create&amp;#160; a Customer object and its identity is the value of the &amp;lt;id&amp;gt; field in the payload. 
  &lt;br /&gt;When you make any edits to this Customer object, &lt;u&gt;the edits are sent to the URI specified in the &amp;lt;link rel=”edit”&amp;gt; value of the payload. 
    &lt;br /&gt;&lt;/u&gt;Which means that the proxy server has to modify the payload it recieves from the real Data Service to make sure that all links , Id and Edit 

  &lt;br /&gt;point to the proxy Data Service and not the real Data Service. The easiest way to do this is to do a String.Replace replacing all occurrences of the 

  &lt;br /&gt;the original Service end point with the Proxy Service end point in the payload.&lt;/p&gt;

&lt;p&gt;Without further stalling&amp;#160; , here is the&amp;#160; &lt;a href="http://blogs.msdn.com/phaniraj/attachment/9008548.ashx"&gt;Proxy Handler&lt;/a&gt;. &lt;/p&gt;

&lt;h5&gt;A couple of words of caution so that I can keep my job, &lt;/h5&gt;

&lt;ol&gt;
  &lt;li&gt;This is only a sample implementation of what a proxy &lt;strong&gt;could&lt;/strong&gt;&lt;em&gt;&lt;/em&gt; look like. &lt;/li&gt;

  &lt;li&gt;Do &lt;strong&gt;NOT&lt;/strong&gt; use this in your production applications. &lt;/li&gt;

  &lt;li&gt;This is &lt;strong&gt;NOT&lt;/strong&gt; an official solution provided by the ADO.NET Data Services team , 

    &lt;br /&gt;this is just me illustrating how to write a proxy. &lt;/li&gt;

  &lt;li&gt;If you download this sample , it means that you understand these rules . &lt;/li&gt;

  &lt;li&gt;For any problems with this sample , leave a comment on my blog , 
    &lt;br /&gt;the ADO.NET Data Services Forums is &lt;strong&gt;NOT &lt;/strong&gt;the right place for any issues with this proxy. &lt;/li&gt;
&lt;/ol&gt;

&lt;h5&gt;Running the sample&amp;#160; &lt;/h5&gt;

&lt;ol&gt;
  &lt;li&gt;Download the sources from the link above. &lt;/li&gt;

  &lt;li&gt;Open the solution in Visual Studio 2008 and hit F5. &lt;/li&gt;

  &lt;li&gt;You should see the Silverlight application come up and 
    &lt;br /&gt;get the data from the Data Service hosted in a different application. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Cross Domain Proxy is a generic AShx handler which receives the requests from the Client library and forwards them onto the 
  &lt;br /&gt;original Data Service , gets the response , changes the ID and Edit Links and returns the response to the Silverlight Client . &lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Client Sends request to Proxy Handler &lt;/li&gt;

  &lt;li&gt;Proxy Handler sends the request data to the Original Data Service &lt;/li&gt;

  &lt;li&gt;Data Service responds with response &lt;/li&gt;

  &lt;li&gt;Proxy handler reads response and changes the ID and EDIT links in the payload &lt;/li&gt;

  &lt;li&gt;In case of POST , the Proxy Handler changes the response “Location” Header 
    &lt;br /&gt;so that the identity points to the Proxy Handler and not the Data Service. &lt;/li&gt;

  &lt;li&gt;Proxy handler returns the response data to the client . &lt;/li&gt;
&lt;/ol&gt;

&lt;h5&gt;How do I use this in my application ?&lt;/h5&gt;

&lt;br /&gt;

&lt;p&gt;The source available for download contains “CrossDomainHandlerBase” which is the class that contains the functionality required 
  &lt;br /&gt;for recieving requests from clients and forwarding the requests onto the Data Service. &lt;/p&gt;

&lt;h5&gt;Setting up the Server-Side Proxy &lt;/h5&gt;

&lt;br /&gt;

&lt;ol&gt;
  &lt;li&gt;Add a Generic ASHX Handler to the application that contains the Web page hosting the Silverlight application , 
    &lt;ol&gt;
      &lt;li&gt;Right-Click on Project &lt;/li&gt;

      &lt;li&gt;Add –&amp;gt; New Item –&amp;gt; Generic Handler 
        &lt;br /&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/AccessingCrossDomainDataServicesfromtheS_C375/image_2.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="449" alt="image" src="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/AccessingCrossDomainDataServicesfromtheS_C375/image_thumb.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 2. This will create a Generic Handler which implements IHttpHandler.&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 3. Remove the code stubs for IHttpHandler methods and properties . 
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 4. Replace IHttpHandler with “CrossDomainHandlerBase”.&amp;#160; &lt;br /&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    [WebService(Namespace = &lt;span class="str"&gt;&amp;quot;http://tempuri.org/&amp;quot;&lt;/span&gt;)]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CrossDomainHandler : CrossDomainHandlerBase
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; CrossDomainHandler()
            : &lt;span class="kwrd"&gt;base&lt;/span&gt;()
        {
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataServiceURI = &lt;span class="str"&gt;&amp;quot;URI FOR THE DATA SERVICE&amp;quot;&lt;/span&gt;;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.ProxyServiceURI = &lt;span class="str"&gt;&amp;quot;URI FOR THE PROXY SERVICE&amp;quot;&lt;/span&gt;;
        }
     }&lt;/pre&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 4.From this point on , for all purposes , the Proxy Handler service IS the Data Service&lt;/p&gt;

&lt;h5&gt;Setting up the Silverlight application for Cross-Domain access&lt;/h5&gt;

&lt;ol&gt;
  &lt;li&gt;Right-Click on “References” in the Project &lt;/li&gt;

  &lt;li&gt;Select &amp;quot;Add Service Reference&amp;quot; &lt;/li&gt;

  &lt;li&gt;In the “Address” field , enter the URI for the proxy service , &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/AccessingCrossDomainDataServicesfromtheS_C375/image_6.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="image" src="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/AccessingCrossDomainDataServicesfromtheS_C375/image_thumb_2.png" width="519" border="0" /&gt;&lt;/a&gt; 

    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;In case of the sample solution provided, the Provider is called “DataProvider”, hence 
    &lt;br /&gt;the code-gen produces the code with a type “DataProvider” derived from DataServiceContext. &lt;/li&gt;

  &lt;li&gt;When you instantiate the Context in the Silverlight application , always specify the Base URI 
    &lt;br /&gt;as the Proxy Handler’s URI, 

    &lt;br /&gt;

    &lt;pre class="csharpcode"&gt;DataProvider dataProvider = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataProvider(
                &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;&amp;quot;RELATIVE URI FOR THE PROXY SERVICE&amp;quot;&lt;/span&gt;, 
                            UriKind.RelativeOrAbsolute)
                  );&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;This is the most important step of all &lt;strong&gt;, Party on !!&lt;/strong&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To do in the near future :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Convert the Handler to be an IHttpAsyncHandler so that we dont block on waiting for the response from the Data Service &lt;/li&gt;

  &lt;li&gt;Provide better mechanisms for Identity Resolution other than String.Replace . &lt;/li&gt;

  &lt;li&gt;Write a better demo app than something which binds all the parts of my name to a Grid. &lt;/li&gt;

  &lt;li&gt;Your suggestion goes here . &lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9008548" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/phaniraj/attachment/9008548.ashx" length="2976444" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Prototype/default.aspx">Prototype</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Astoria/default.aspx">Astoria</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/CrossDomain/default.aspx">CrossDomain</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Demo/default.aspx">Demo</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Documentation/default.aspx">Documentation</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/DataServiceContext/default.aspx">DataServiceContext</category></item><item><title>GridViewFilterExtender : Filter GridView Rows Client-Side</title><link>http://blogs.msdn.com/phaniraj/archive/2007/10/27/building-an-excel-like-gridview-filter-extender.aspx</link><pubDate>Sat, 27 Oct 2007 14:30:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5771108</guid><dc:creator>PhaniRajuYN</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/phaniraj/comments/5771108.aspx</comments><wfw:commentRss>http://blogs.msdn.com/phaniraj/commentrss.aspx?PostID=5771108</wfw:commentRss><description>&lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Download Source Code and Sample application&lt;/strong&gt;&amp;nbsp; :&amp;nbsp; &lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 26px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-925c2d2bb2d03c6b.skydrive.live.com/embedrow.aspx/Public/GridViewFilterExtender.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br&gt;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="709" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="348"&gt;&lt;strong&gt;Excel's Filter Dialog&lt;/strong&gt;&lt;/td&gt; &lt;td valign="top" width="359"&gt;&lt;strong&gt;My GridView Filter Extender&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="351"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/BuildinganExcellike_10A47/Excel_Filter.jpg"&gt;&lt;br&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="396" alt="Excel_Filter" src="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/BuildinganExcellike_10A47/Excel_Filter_thumb.jpg" width="339" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td valign="top" width="359"&gt;&amp;nbsp;&amp;nbsp; &lt;a href="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/BuildinganExcellike_10A47/GridRowFilterExtender_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="416" alt="GridRowFilterExtender" src="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/BuildinganExcellike_10A47/GridRowFilterExtender_thumb.jpg" width="306" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="354"&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top" width="359"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;The above Screen Shots look promising , don't they ?&lt;br&gt;So, How would one go about building such a control ? Well, I have it laid out in front of you .&lt;br&gt;&lt;br&gt;1) Find all unique Strings in the same column &lt;br&gt;2) Build a lookup table that stores the Unique string and the row Indices for the rows that contain the Unique String&lt;br&gt;3) Once user builds a Filter Expression and clicks on "Ok" , Filter the Rows in the Table based on the Expression.&lt;br&gt;4) For Now , the Filter Expression can only be&amp;nbsp; a sequence of strings that the user wants to see in the grid.&lt;/p&gt; &lt;p&gt;Ex : If your grid looks like this :&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/BuildinganExcellike_10A47/GridViewSampleData_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="295" alt="GridViewSampleData" src="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/BuildinganExcellike_10A47/GridViewSampleData_thumb.jpg" width="194" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The filter expression would be a comma-separated string that contains the unique strings to match in the rows.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; _currentRowFilter = &lt;span class="str"&gt;"Ajax,Moo"&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
The lookup Table would look like this :&lt;/p&gt;&lt;pre class="csharpcode"&gt;_lookupTable
        Select All    &lt;span class="str"&gt;"1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23"&lt;/span&gt;    
        Ajax    &lt;span class="str"&gt;"1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16"&lt;/span&gt;    
        Moo    &lt;span class="str"&gt;"17,18,19,20,21,22,23"&lt;/span&gt;    &lt;br&gt;
so , if we want to filter the rows , we would need to : &lt;/pre&gt;
&lt;p&gt;1) Hide all Rows to begin with . &lt;br&gt;&lt;b&gt;HideRows : this.lookupTable["Select All"]&lt;/b&gt; 
&lt;p&gt;2) Show only those rows that are found in the lookup table against the filter Terms. &lt;br&gt;&lt;b&gt;ShowRows :this.lookupTable["Ajax"]&lt;/b&gt; 
&lt;p&gt;That's about the algorithm / design for the extender to work .&lt;br&gt;Getting this working is another matter altogether.&lt;br&gt;Once you have understood this , lets start: 
&lt;p&gt;&lt;b&gt;Find all unique Strings in the same column :&lt;/b&gt; 
&lt;p&gt;once you find all the unique strings in all subsequent rows for the same column , we will need to build the checkbox list that &lt;br&gt;will allows the user to select the filter Terms. &lt;b&gt;I.e this :&lt;/b&gt;&lt;pre class="csharpcode"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/BuildinganExcellike_10A47/FilterExpressionSelector_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="245" alt="FilterExpressionSelector" src="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/BuildinganExcellike_10A47/FilterExpressionSelector_thumb.jpg" width="155" border="0"&gt;&lt;/a&gt; &lt;/pre&gt;
&lt;p&gt;This is a bit tricky , the way one would go about doing this would be :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Find out which Column the Extender is added in .Find the Cell Index of the Column , lets say _cellIndex&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For all subsequent rows in the table, Lookup the innerText of the Cell with CellIndex cellIndex. 
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each Row &lt;/strong&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Read the innerText of the Cell at CellIndex cellIndex.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF the string read is not yet present in the lookup Table then&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add it to the lookup Table along with the rowIndex of the current Row&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE if string is already present in the lookupTable then 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Begin &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add the RowIndex to the lookupTable[string] location. &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF 
&lt;p&gt;Once you have found all the Unique Strings , build the CheckBoxList and attach the appropriate handlers . 
&lt;p&gt;&lt;b&gt;Once user builds a Filter Expression and clicks on "Ok" , Filter the Rows in the Table based on the Expression.&lt;/b&gt; 
&lt;p&gt;Hide All Rows .&lt;br&gt;Get all the Rows in the Table other than the header and the footer , _rowsInTable.&lt;br&gt;Get the Current Search Filter by adding all the strings that are checked in the CheckBoxList.&lt;br&gt;For each term in the Search Filter , get the appropriate row Indices ,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For each row Index in the Row Indices, &lt;b&gt;_rowIndex&lt;br&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assign the cssClass _inFilterCssClass to the _rowsInTable[_rowIndex]. 
&lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;This is all neat , what if I have multiple columns in my GridView and I want to filter &lt;br&gt;each succeeding Column depending on the previous Column?&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Well, I have thought about that too ..&lt;br&gt;This is what we would do :&lt;br&gt;Every FilterExtender &lt;strong&gt;(a)&lt;/strong&gt; can have a Dependent Filter&amp;nbsp; &lt;strong&gt;(b)&lt;/strong&gt; , if filter &lt;strong&gt;(b) &lt;/strong&gt;is used to filter data ( it raises the itemFiltered Event ),&lt;br&gt;then&amp;nbsp; the Filter &lt;strong&gt;(a) &lt;/strong&gt;has to rebuild its index to remove any index text &lt;br&gt;that was removed as a result of the filter expression on filter &lt;strong&gt;(b)&lt;/strong&gt;.&lt;br&gt;&lt;strong&gt;&lt;br&gt;Important Note about the DependentFilterID &lt;br&gt;&lt;/strong&gt;&lt;br&gt;If a FilterExtender &lt;strong&gt;(a)&lt;/strong&gt;&amp;nbsp; has a FilterExtender &lt;strong&gt;(b)&lt;/strong&gt;&amp;nbsp; as its Dependent Filter ID , they both should have the matching values for the &lt;br&gt;InFilterCssClass and the NotInFilterCssClass attributes.&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2" width="612" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="610"&gt;&lt;strong&gt;Set DependentFilterID &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="610"&gt;&lt;strong&gt;In markup&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="610"&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;Raj:GridViewFilterExtender  DependentFilterId="optionListPnl"&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="610"&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="610"&gt;&lt;pre class="csharpcode"&gt;$find(&amp;lt;filterBehaviorID&amp;gt;).set_dependentFilterId(&amp;lt;dependentFilterId&amp;gt;)&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Attributes :&lt;/strong&gt;&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2" width="757" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" width="644"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;TargetControlID&lt;/td&gt;
&lt;td valign="top" width="644"&gt;ID of the control upon clicking on which , the Filter is shown&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;OkButtonId&lt;/td&gt;
&lt;td valign="top" width="644"&gt;ID of the control upon clicking on which , the FilterExpression is applied and the filter is hidden&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;CancelButtonId&lt;/td&gt;
&lt;td valign="top" width="644"&gt;ID of the control upon clicking on which , the FilterExpression is &lt;u&gt;NOT applied &lt;/u&gt;and the filter is hidden&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;EnableSelectAll&lt;/td&gt;
&lt;td valign="top" width="644"&gt;If the filter contains an option to "Select All" Rows&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;InFilterCssClass&lt;/td&gt;
&lt;td valign="top" width="644"&gt;The CssClass applied to all rows which are available from the Filter Expression.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;NotInFilterCssClass&lt;/td&gt;
&lt;td valign="top" width="644"&gt;The CssClass applied to all rows which are NOT available from the Filter Expression.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;FilterPanelID&lt;/td&gt;
&lt;td valign="top" width="644"&gt;The Panel Control which contains the Filter &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Events :&lt;/strong&gt;&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2" width="765" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="120"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" width="640"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="120"&gt;itemSelected&lt;/td&gt;
&lt;td valign="top" width="640"&gt;When any filter Expression is Selected&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="120"&gt;itemFiltered&lt;/td&gt;
&lt;td valign="top" width="640"&gt;When the filter Expression is applied.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="120"&gt;onOk&lt;/td&gt;
&lt;td valign="top" width="640"&gt;when the Control Referenced by OkButtonId is clicked&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="120"&gt;onCancel&lt;/td&gt;
&lt;td valign="top" width="640"&gt;when the Control Referenced by CancelButtonId is clicked&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;strong&gt;Subscribing to the Events :&lt;br&gt;&lt;br&gt;a) Markup :&lt;br&gt;&lt;/strong&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Raj:OptionPickerBehavior&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="optionListPnl"&lt;/span&gt; &lt;span class="attr"&gt;TargetControlID&lt;/span&gt;&lt;span class="kwrd"&gt;="btnToggle"&lt;/span&gt;
         &lt;span class="attr"&gt;blah&lt;/span&gt; &lt;span class="attr"&gt;blah&lt;/span&gt; &lt;span class="attr"&gt;blah&lt;/span&gt;
         &lt;span class="attr"&gt;OnOkScript&lt;/span&gt;&lt;span class="kwrd"&gt;="okClickHandler"&lt;/span&gt;
         &lt;span class="attr"&gt;OnCancelScript&lt;/span&gt; &lt;span class="kwrd"&gt;="cancelClickHandler"&lt;/span&gt;
         &lt;span class="attr"&gt;OnClientItemFiltered&lt;/span&gt; &lt;span class="kwrd"&gt;="itemFilteredHandler"&lt;/span&gt;
         &lt;span class="attr"&gt;OnClientItemSelected&lt;/span&gt; &lt;span class="kwrd"&gt;="itemSelectedHandler"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Raj:OptionPickerBehavior&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;&amp;lt;script language=&lt;span class="str"&gt;"javascript"&lt;/span&gt; type=&lt;span class="str"&gt;"text/javascript"&lt;/span&gt;&amp;gt;
            &lt;span class="kwrd"&gt;function&lt;/span&gt; itemSelectedHandler(element,args)  {
                Sys.Debug.trace( args.get_text() + &lt;span class="str"&gt;"   "&lt;/span&gt; + args.get_isChecked());
            }
            &lt;span class="kwrd"&gt;function&lt;/span&gt; itemFilteredHandler(element,args)  {
                Sys.Debug.trace( args.get_item() + &lt;span class="str"&gt;"   "&lt;/span&gt; + args.get_filterText());
            }
            &lt;span class="kwrd"&gt;function&lt;/span&gt; okClickHandler(element,args)  {
                Sys.Debug.trace( &lt;span class="str"&gt;"Ok Button was clicked"&lt;/span&gt; );
            }
             &lt;span class="kwrd"&gt;function&lt;/span&gt; cancelClickHandler(element,args)  {
                Sys.Debug.trace( &lt;span class="str"&gt;"Cancel Button was clicked"&lt;/span&gt;);
            }
            &lt;span class="kwrd"&gt;function&lt;/span&gt; traceCall(msg) {
                $get(&lt;span class="str"&gt;"traceDiv"&lt;/span&gt;).appendChild(document.createTextNode(msg)); 
            }
 &amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;strong&gt;b) Script &lt;br&gt;&lt;/strong&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;$find(&lt;span class="str"&gt;"BehaviorId"&lt;/span&gt;).add_onOk( okClickHandler );

$find(&lt;span class="str"&gt;"BehaviorId"&lt;/span&gt;).add_onCancel( cancelClickHandler );

$find(&lt;span class="str"&gt;"BehaviorId"&lt;/span&gt;).add_itemFiltered( itemFilteredHandler );

$find(&lt;span class="str"&gt;"BehaviorId"&lt;/span&gt;).add_itemSelected( itemSelectedHandler );&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Trebuchet MS"&gt;That's it for now ! Do give feedback on the control if you get a chance to use it / look at it .&lt;br&gt;&lt;/font&gt;&lt;br&gt;&lt;/pre&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5771108" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Prototype/default.aspx">Prototype</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Components/default.aspx">Components</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Astoria/default.aspx">Astoria</category></item><item><title>Extending the PhotoGrid to allow Xml DataBinding using JavaScript Enumerations</title><link>http://blogs.msdn.com/phaniraj/archive/2007/02/03/extending-the-photogrid-to-allow-xml-databinding-using-javascript-enumerations.aspx</link><pubDate>Sat, 03 Feb 2007 23:04:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1592154</guid><dc:creator>PhaniRajuYN</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/phaniraj/comments/1592154.aspx</comments><wfw:commentRss>http://blogs.msdn.com/phaniraj/commentrss.aspx?PostID=1592154</wfw:commentRss><description>&lt;p&gt;If you remember one of my previous posts about the PhotoGrid Control , we talked about the control binding to JSON data .&lt;/p&gt; &lt;p&gt;Today&amp;nbsp; , we talk about using Enumerations in Javascript to allow the PhotoGrid to bind to multiple Data Source Types.&lt;/p&gt; &lt;p&gt;Well, lets get going then....&lt;/p&gt; &lt;p&gt;Constructing the Enumeration&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/**** Enumeration to specify the Data Source Type**********/&lt;/span&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;1) The Constructor for the Enumeration&lt;/pre&gt;&lt;pre class="csharpcode"&gt;AtlasDemo.DataSourceType = &lt;span class="kwrd"&gt;function&lt;/span&gt;(){};&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;2) Define the different Types of data that can be bound using the Prototype Model .&lt;/pre&gt;&lt;pre class="csharpcode"&gt;AtlasDemo.DataSourceType.prototype =
{
    JSON : 0,
    XMLString : 1
}&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;3) Register the Enumeration using the "registerEnum" function of the ASP.net AJAX framework.&lt;/pre&gt;&lt;pre class="csharpcode"&gt;AtlasDemo.DataSourceType.registerEnum(&lt;span class="str"&gt;"AtlasDemo.DataSourceType"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;Modify the  BindGrid Function to accept the type of dataBinding to be performed.&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;BindGrid : &lt;span class="kwrd"&gt;function&lt;/span&gt;(dataSourceType)&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;Using the Enumeration from the client application &lt;/pre&gt;&lt;pre class="csharpcode"&gt;as a parameter to the  function  BindGrid , &lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; CreateGrid( JSONDataToBeBound )
{
  &lt;span class="rem"&gt;//Create an instance of the PhotoGrid Control&lt;/span&gt;
  &lt;span class="kwrd"&gt;var&lt;/span&gt; gridElement = &lt;span class="kwrd"&gt;new&lt;/span&gt; AtlasDemo.PhotoGrid( leftPosition , topPosition,&lt;span class="str"&gt;""&lt;/span&gt;,0,&lt;span class="str"&gt;"tblThumbnails"&lt;/span&gt;,horizontalOffset,VerticalOffset) ;
  &lt;span class="rem"&gt;//Set the Data for the PhotoGrid Control&lt;/span&gt;
  gridElement.setData(JSONDataToBeBound); 
  &lt;span class="rem"&gt;//Set the Number of images to be shown in one Page&lt;/span&gt;
  gridElement.setPageSize( pageSize );
  &lt;span class="rem"&gt;//Bind the Grid&lt;/span&gt;
  gridElement.BindGrid( AtlasDemo.DataSourceType.JSON  );
  
}&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;The Xml Data Format Supported by the PhotoGrid Component&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ResultSet&lt;/span&gt; &lt;span class="attr"&gt;totalResultsAvailable&lt;/span&gt;&lt;span class="kwrd"&gt;="2"&lt;/span&gt; &lt;span class="attr"&gt;totalResultsReturned&lt;/span&gt;&lt;span class="kwrd"&gt;="2"&lt;/span&gt; &lt;span class="attr"&gt;firstResultPosition&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Results&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt; &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="just-a-little-bit_1024.jpg"&lt;/span&gt; &lt;span class="attr"&gt;Summary&lt;/span&gt;&lt;span class="kwrd"&gt;="Website: Deviant Art Homepage Download: 1024x768"&lt;/span&gt; &lt;span class="attr"&gt;Url&lt;/span&gt;&lt;span class="kwrd"&gt;="http:\/\/www.pixelgirlpresents.com\/images\/desktops\/elyse\/just-a-little-bit_1024.jpg"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt; &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="just-a-little-bit_1024.jpg"&lt;/span&gt; &lt;span class="attr"&gt;Summary&lt;/span&gt;&lt;span class="kwrd"&gt;="Website: Deviant Art Homepage Download: 1024x768"&lt;/span&gt; &lt;span class="attr"&gt;Url&lt;/span&gt;&lt;span class="kwrd"&gt;="http:\/\/www.pixelgirlpresents.com\/images\/desktops\/elyse\/just-a-little-bit_1024.jpg"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Results&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ResultSet&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;&lt;strong&gt;&lt;u&gt;Calling the BindGrid Function With XMl Data &lt;/u&gt;&lt;/strong&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;1) Create and append the XML String to  a stringBuilder Object &lt;/pre&gt;&lt;pre class="csharpcode"&gt;   &lt;span class="kwrd"&gt;var&lt;/span&gt; sBuilder = &lt;span class="kwrd"&gt;new&lt;/span&gt; Sys.StringBuilder(&lt;span class="str"&gt;""&lt;/span&gt;);
    sBuilder.append(&lt;span class="str"&gt;"&amp;lt;ResultSet totalResultsAvailable=\"2\" totalResultsReturned=\"2\" firstResultPosition=\"0\"&amp;gt;"&lt;/span&gt;);
        sBuilder.append(&lt;span class="str"&gt;"&amp;lt;Results&amp;gt;"&lt;/span&gt;);
            sBuilder.append(&lt;span class="str"&gt;"&amp;lt;Result Title=\"just-a-little-bit_1024.jpg\" Summary=\"Website: Deviant Art Homepage Download: 1024x768\" Url=\"http:\/\/www.pixelgirlpresents.com\/images\/desktops\/elyse\/just-a-little-bit_1024.jpg\"&amp;gt;&amp;lt;/Result&amp;gt;"&lt;/span&gt;);
            sBuilder.append(&lt;span class="str"&gt;"&amp;lt;Result Title=\"just-a-little-bit_1024.jpg\" Summary=\"Website: Deviant Art Homepage Download: 1024x768\" Url=\"http:\/\/www.pixelgirlpresents.com\/images\/desktops\/elyse\/just-a-little-bit_1024.jpg\"&amp;gt;&amp;lt;/Result&amp;gt;"&lt;/span&gt;);   &lt;/pre&gt;&lt;pre class="csharpcode"&gt;        sBuilder.append(&lt;span class="str"&gt;"&amp;lt;/Results&amp;gt;"&lt;/span&gt;);
    sBuilder.append(&lt;span class="str"&gt;"&amp;lt;/ResultSet&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="csharpcode"&gt;2) Set the Data to be rendered by the PhotoGrid Control &lt;/pre&gt;&lt;pre class="csharpcode"&gt;PhotoGridGlobalInstance.setData( sBuilder.toString() );&lt;/pre&gt;&lt;pre class="csharpcode"&gt;3) Set the DataSource Type to be XML while Binding ..&lt;/pre&gt;&lt;pre class="csharpcode"&gt;gridElement.BindGrid( AtlasDemo.DataSourceType.XMLString  );&lt;/pre&gt;&lt;pre class="csharpcode"&gt;You are done .. Simple , neat and easy ...&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1592154" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/phaniraj/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Prototype/default.aspx">Prototype</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Components/default.aspx">Components</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/JavaScript/default.aspx">JavaScript</category></item><item><title>Using the Prototype Model with Microsoft AJAX</title><link>http://blogs.msdn.com/phaniraj/archive/2007/02/01/using-the-prototype-model-with-microsoft-ajax.aspx</link><pubDate>Thu, 01 Feb 2007 21:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1574673</guid><dc:creator>PhaniRajuYN</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/phaniraj/comments/1574673.aspx</comments><wfw:commentRss>http://blogs.msdn.com/phaniraj/commentrss.aspx?PostID=1574673</wfw:commentRss><description>&lt;p&gt;Microsoft Ajax allows you to extend your javaScript Programming framework so that you can emulate OOP practices with Javascript .&lt;/p&gt; &lt;p&gt;A SImple Example is &lt;a href="http://ajax.asp.net/docs/tutorials/EnhancingJavaScriptTutorial.aspx"&gt;Here&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The following is a list of stuff you can Use in javascript with Microsoft Ajax Extensions to javascript &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Classes&lt;/p&gt; &lt;li&gt; &lt;p&gt;Namespaces&lt;/p&gt; &lt;li&gt; &lt;p&gt;Inheritance&lt;/p&gt; &lt;li&gt; &lt;p&gt;Interfaces&lt;/p&gt; &lt;li&gt; &lt;p&gt;Enumerations&lt;/p&gt; &lt;li&gt; &lt;p&gt;Reflection&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Sounds Neat , doesnt it ?&lt;/p&gt; &lt;p&gt;Well, lets get started ...&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;We will build a Re-usable Photo Grid Component that you can use in your applications .&lt;/p&gt; &lt;p&gt;PhotoGrid&amp;nbsp; : It will show a grid of thumbnails with Animations associated with Click of each thumbNail.&lt;/p&gt; &lt;p&gt;On Click of the ThumbNail , the ThumbNail will move to a specific location and Resize itself .&lt;/p&gt; &lt;p&gt;The PhotoGird will have the Following Features.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Ability Bind Data in JSON Format  &lt;li&gt;Paging Functionality in Numbers and "Next" and "Prev" Links  &lt;li&gt;Jump to a&amp;nbsp; specific page  &lt;li&gt;Support for Placing the Controls at Specified X and Y Locations  &lt;li&gt;Support for Customising the Horizontal and Vertical Offset between thumbnails  &lt;li&gt;Support for specifying the Number of images in each page.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;It will be written as a Client Side Java Script Re-usable Component&lt;/p&gt; &lt;p&gt;Th JSON Data format will be like this&lt;/p&gt;&lt;pre class="csharpcode"&gt;{
&lt;span class="str"&gt;"ResultSet"&lt;/span&gt;:{&lt;span class="str"&gt;"totalResultsAvailable"&lt;/span&gt;:&lt;span class="str"&gt;"50014"&lt;/span&gt;,&lt;span class="str"&gt;"totalResultsReturned"&lt;/span&gt;:7,&lt;span class="str"&gt;"firstResultPosition"&lt;/span&gt;:1,
&lt;span class="str"&gt;"Result"&lt;/span&gt; :
    [
     {
        &lt;span class="str"&gt;"Title"&lt;/span&gt;:&lt;span class="str"&gt;"The-Incredibles-Poster-C10219976.jpeg"&lt;/span&gt;,
        &lt;span class="str"&gt;"Summary"&lt;/span&gt;:&lt;span class="str"&gt;""&lt;/span&gt;,
        &lt;span class="str"&gt;"Url"&lt;/span&gt;:&lt;span class="str"&gt;"http://a1259.g.akamai.net/f/1259/5586/1d/images.art.com/images/-/The-Incredibles-Poster-C10219976.jpeg"&lt;/span&gt;

     }
     {
        &lt;span class="str"&gt;"Title"&lt;/span&gt;:&lt;span class="str"&gt;"The-Incredibles-Poster-C10219976.jpeg"&lt;/span&gt;,
        &lt;span class="str"&gt;"Summary"&lt;/span&gt;:&lt;span class="str"&gt;""&lt;/span&gt;,
        &lt;span class="str"&gt;"Url"&lt;/span&gt;:&lt;span class="str"&gt;"http://a1259.g.akamai.net/f/1259/5586/1d/images.art.com/images/-/The-Incredibles-Poster-C10219976.jpeg"&lt;/span&gt;

     }
    ]
}&lt;/pre&gt;&lt;pre class="csharpcode"&gt;The PhotoGrid Component will convert the Data into something that looks like this &lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/UsingthePrototypeModelwithMicrosoftAJAX_14A88/Photo_Grid_Preview4.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="192" src="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/UsingthePrototypeModelwithMicrosoftAJAX_14A88/Photo_Grid_Preview3.jpg" width="240" border="0"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;pre class="csharpcode"&gt;On Clicking of a thumbnail  , it will resize itself automatically , then it will look like this &lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/UsingthePrototypeModelwithMicrosoftAJAX_14A88/photo_Grid_THumbnail_Expanded1.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="192" src="http://blogs.msdn.com/blogfiles/phaniraj/WindowsLiveWriter/UsingthePrototypeModelwithMicrosoftAJAX_14A88/photo_Grid_THumbnail_Expanded.jpg" width="240" border="0"&gt;&lt;/a&gt; &lt;/pre&gt;&lt;pre class="csharpcode"&gt;Now that I  have , hopefully, &lt;font face="Consolas" size="2"&gt;raised your curiosity . lets build this..&lt;/font&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;Creating the PhotoGrid Component using Microsoft AJAX Exntensions&lt;/pre&gt;&lt;pre class="csharpcode"&gt;1.Register the NameSpace&lt;/pre&gt;&lt;pre class="csharpcode"&gt;Type.registerNamespace(&lt;span class="str"&gt;"AtlasDemo"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="csharpcode"&gt;2.Declare the Constructor for your class.&lt;/pre&gt;&lt;pre class="csharpcode"&gt;AtlasDemo.PhotoGrid = &lt;span class="kwrd"&gt;function&lt;/span&gt; ( leftPosition , topPosition ,parentControlId ,animatorGlobalIndex ,tableID, horizontalOffset,VerticalOffset ){ 
&lt;span class="kwrd"&gt;this&lt;/span&gt;._jsonString        = &lt;span class="str"&gt;""&lt;/span&gt;;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._gridData          ;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._pageIndex         = 0;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._firstImageIndex   = 0;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._leftPosition      = leftPosition;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._topPosition       = topPosition;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._parentControlId   = parentControlId;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._thumbNailTableId  = tableID;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._horizontalOffset  = horizontalOffset;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._loopIndex         = 0 ;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._verticalOffset    = VerticalOffset;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._pageSize          =7;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._startIndex        =0;
&lt;span class="kwrd"&gt;this&lt;/span&gt;._initialStart      =0;

}&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;2. Define the functions of the PhotoGrid using the Prototype model .&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;u&gt;&lt;strong&gt;Syntax:&lt;/strong&gt;&lt;/u&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;AtlasDemo.PhotoGrid.prototype = {
  &amp;lt;functionName1&amp;gt;:&lt;span class="kwrd"&gt;function&lt;/span&gt;([arguments])
  {
    &amp;lt;FunctionBody&amp;gt;
  }
  ,
  &amp;lt;functionName2&amp;gt;:&lt;span class="kwrd"&gt;function&lt;/span&gt;([arguments])
  {
     &amp;lt;FunctionBody&amp;gt;
  }
}&lt;/pre&gt;&lt;pre class="csharpcode"&gt;The Code inside the JS function is specified in this  format , pretty neat  and organised &lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;strong&gt;&lt;u&gt;Actual Function Definitions:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;strong&gt;Function Name    : &lt;/strong&gt;pagesAvailable&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;strong&gt;Function Purpose : &lt;/strong&gt;To Return the Number of Pages Available For Paging&lt;strong&gt; &lt;/strong&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;strong&gt;Return Value     :&lt;/strong&gt; JSON Object with the total Number of Pages, Pages available in the Forward Direction and Backward Direction&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;strong&gt;Input Parameters : &lt;/strong&gt;None&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;strong&gt;Function Code:&lt;/strong&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;pagesAvailable:&lt;span class="kwrd"&gt;function&lt;/span&gt;()
    {
        &lt;span class="kwrd"&gt;var&lt;/span&gt; totalPages    = parseInt(&lt;span class="kwrd"&gt;this&lt;/span&gt;._gridData.ResultSet.totalResultsReturned)/parseInt(&lt;span class="kwrd"&gt;this&lt;/span&gt;._pageSize);
        &lt;span class="kwrd"&gt;var&lt;/span&gt; pagesForward  = parseInt(totalPages) - ( parseInt(&lt;span class="kwrd"&gt;this&lt;/span&gt;._pageIndex) +1 ) ;
        &lt;span class="kwrd"&gt;var&lt;/span&gt; pagesBackWard = parseInt( totalPages - pagesForward ); 
        &lt;span class="kwrd"&gt;var&lt;/span&gt; jsonStringData = &lt;span class="str"&gt;"{\"pagesData\":{\"totalPages\":\""&lt;/span&gt;+totalPages+&lt;span class="str"&gt;"\",\"pagesForward\":\""&lt;/span&gt;+pagesForward+&lt;span class="str"&gt;"\",\"pagesBackWard\":\""&lt;/span&gt;+pagesBackWard+&lt;span class="str"&gt;"\"}}"&lt;/span&gt;
        &lt;span class="kwrd"&gt;return&lt;/span&gt; ( eval( &lt;span class="str"&gt;'('&lt;/span&gt; + jsonStringData + &lt;span class="str"&gt;')'&lt;/span&gt; ) );
    }&lt;/pre&gt;&lt;pre class="csharpcode"&gt;The following are functions inside the Prototype function Declaration, the code is omitted for the purpose of clarity.&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;    setPageSize:&lt;span class="kwrd"&gt;function&lt;/span&gt;(pageSize)
    {
        &amp;lt;Function Body&amp;gt;
    },
    setData:&lt;span class="kwrd"&gt;function&lt;/span&gt;(jsonString)
    {
        &amp;lt;Function Body&amp;gt;
    },
    resetPositions:&lt;span class="kwrd"&gt;function&lt;/span&gt;( leftPosition , topPosition , animatorGlobalIndex  )
    {
        &amp;lt;Function Body&amp;gt;
    },
    resetAll:&lt;span class="kwrd"&gt;function&lt;/span&gt; ( jsonString ,leftPosition , topPosition ,parentControlId ,animatorGlobalIndex ,tableID, horizontalOffset,VerticalOffset ){ 
        &amp;lt;Function Body&amp;gt;
    },
    clearResults : &lt;span class="kwrd"&gt;function&lt;/span&gt;( leftPosition , topPosition , horizontalOffset,VerticalOffset )
    {
        &amp;lt;Function Body&amp;gt;
        
    },
    
    ShowPager:&lt;span class="kwrd"&gt;function&lt;/span&gt;(shouldIShowThePager,pagerControlHolder,pagingFunctionName)
    {
        &amp;lt;Function Body&amp;gt;
    },
    PageForward:&lt;span class="kwrd"&gt;function&lt;/span&gt;()
    {
    
        &amp;lt;Function Body&amp;gt;
    },
    __pagingFunction:&lt;span class="kwrd"&gt;function&lt;/span&gt;()
    {
       &amp;lt;Function Body&amp;gt; 
    },
    CurrentPageIndex : &lt;span class="kwrd"&gt;function&lt;/span&gt;()
    {
        &amp;lt;Function Body&amp;gt;
    },
    PageBackward : &lt;span class="kwrd"&gt;function&lt;/span&gt;()
    {
        &amp;lt;Function Body&amp;gt;
    },
    AnimateElement:&lt;span class="kwrd"&gt;function&lt;/span&gt;( imgElement )
    {
        &amp;lt;Function Body&amp;gt;
                        
    },
    CreateNewPhotoCell:&lt;span class="kwrd"&gt;function&lt;/span&gt;( searchResultItem )
    {
        &amp;lt;Function Body&amp;gt;
    }, 
    BindGrid : &lt;span class="kwrd"&gt;function&lt;/span&gt;()
    {
         &amp;lt;Function Body&amp;gt;
    }&lt;/pre&gt;&lt;pre class="csharpcode"&gt;3. Once you have declared the functions supported by the PhotoGrid Class, lets Go ahead and register the class.&lt;/pre&gt;&lt;pre class="csharpcode"&gt;AtlasDemo.PhotoGrid.registerClass(&lt;span class="str"&gt;'AtlasDemo.PhotoGrid'&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;, Sys.IDisposable);&lt;/pre&gt;&lt;pre class="csharpcode"&gt;You can read all about the registerClass &lt;a href="http://ajax.asp.net/docs/ClientReference/Global/TypeClass/TypeRegisterClassMethod.aspx"&gt;Here&lt;/a&gt;.&lt;/pre&gt;&lt;pre class="csharpcode"&gt;You are now done!&lt;/pre&gt;&lt;pre class="csharpcode"&gt;Lets go ahead and see how to use this component in our code.&lt;/pre&gt;&lt;pre class="csharpcode"&gt;ASPX Code:&lt;/pre&gt;&lt;pre class="csharpcode"&gt;1. Add the Mandatory Script Manager Control.&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptManager&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="ScriptManager1"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptManager&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;2. Include a reference to your script File in the &lt;strong&gt;&lt;u&gt;&lt;font color="#ff0000"&gt;&amp;lt;BODY&amp;gt; of the ASPX Page&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/javascript"&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;="ClientScripts/PhotoGrid.js"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;3. The Parent Control that will hold the ThumbNails&lt;/pre&gt;&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="divActualSize"&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;="left: 10px; overflow: auto; width: 90%; position: absolute;
            top: 18%; height: 650px"&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="grey"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="tblThumbnails"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tbody&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tbody&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;4. The Client Functions to the PhotoGrid Component&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; CreateGrid( JSONDataToBeBound )
{
  &lt;span class="rem"&gt;//Create an instance of the PhotoGrid Control&lt;/span&gt;
  &lt;span class="kwrd"&gt;var&lt;/span&gt; gridElement = &lt;span class="kwrd"&gt;new&lt;/span&gt; AtlasDemo.PhotoGrid( leftPosition , topPosition,&lt;span class="str"&gt;""&lt;/span&gt;,0,&lt;span class="str"&gt;"tblThumbnails"&lt;/span&gt;,horizontalOffset,VerticalOffset) ;
  &lt;span class="rem"&gt;//Set the Data for the PhotoGrid Control&lt;/span&gt;
  gridElement.setData(JSONDataToBeBound); 
  &lt;span class="rem"&gt;//Set the Number of images to be shown in one Page&lt;/span&gt;
  gridElement.setPageSize( pageSize );
  &lt;span class="rem"&gt;//Bind the Grid&lt;/span&gt;
  gridElement.BindGrid( );
  
}&lt;/pre&gt;&lt;pre class="csharpcode"&gt;we are done !&lt;/pre&gt;&lt;pre class="csharpcode"&gt;I have made a sample application that uses this control and shows off all the features possible .&lt;/pre&gt;&lt;pre class="csharpcode"&gt;Please let me know if this control is of any use to you .&lt;/pre&gt;&lt;pre class="csharpcode"&gt; If yes, then how ?&lt;/pre&gt;&lt;pre class="csharpcode"&gt; If No , then which features / options would make it useful ?&lt;/pre&gt;&lt;pre class="csharpcode"&gt;You can download the Sample Application here.&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1574673" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/phaniraj/attachment/1574673.ashx" length="256783" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/phaniraj/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Prototype/default.aspx">Prototype</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/Components/default.aspx">Components</category><category domain="http://blogs.msdn.com/phaniraj/archive/tags/JavaScript/default.aspx">JavaScript</category></item></channel></rss>