When I heard ASP.Net Ajax controls now work within other templated controls like repeaters or gridviews, I, of course, had to get me some of that.  It wasn't as easy as I thought it would be.  The sample given  on the ASP.net site, is all declarative, with no code-behind example, and certainly no regard to appearing inside a template.  I started out with the example given and just slapped it right into my ItemTemplate.  That sort of worked, except that every DIV started off in the top left corner of the screen.  I realized then, that the divs in the example did not have "Runat=server" attributes.  So I was putting multiple controls with the same ID on the page - despite being in an itemtemplate, without the runat=server attribute the div was still named "flyout". 

The plot thickens, because once you add runat=server, your control ID now becomes something like: ctl00_contentplaceholder1_yourgridview_ctl02_info.  So something like

<ScriptAction Script="Cover($get('flyout'), $get('info'), true);" />  thus is not going to work. 

So then you might think of programmatically creating your animations with lovely intellisense and try something like this:

a = New Animation
a.Name = "ScriptAction"
a.Properties.Add("Script", "Cover($get('" & photo.ClientID & "'), $get('" & flyout.ClientID & "'));")
ace.OnClick.Children.Add(a)

but you'll soon discover that you can't really add the OnClick node to page (at least no way I can see).  Furthermore, it was apparently decided that letting you create animations in this fashion limits extensibility.

While I do understand where MSFT is coming from, I was really hoping for a more elegant solution in my grid's rowdatabound than this:

 

(If you're viewing this in a web browser, be sure to switch to "elastic layout" at the top of your screen to view the code: )

It also helps having a widescreen display tongue-out

 

Dim photo As ImageButton = CType(e.Row.FindControl("photo"), ImageButton)
Dim info As HtmlGenericControl = CType(e.Row.FindControl("info"), HtmlGenericControl)
Dim flyout As HtmlGenericControl = CType(e.Row.FindControl("flyout"), HtmlGenericControl)
Dim ace As AnimationExtender = CType(e.Row.FindControl("ace"), AnimationExtender)
ace.TargetControlID = photo.ID
ace.Animations = "<OnLoad><OpacityAction AnimationTarget=""" & info.ClientID & """ Opacity=""0"" /></OnLoad>" & _
"<OnClick>" & _
"<Sequence>" & _
"<EnableAction Enabled=""false"" />" & _
"<ScriptAction Script=""Cover($get('" & photo.ClientID & "'), $get('" & flyout.ClientID & "'));"" />" & _
"<StyleAction AnimationTarget=""" & flyout.ClientID & """ Attribute=""display"" Value=""block""/>" & _
"<Parallel AnimationTarget=""" & flyout.ClientID & """ Duration="".3"" Fps=""25"">" & _
"<Move Horizontal=""150"" Vertical=""-50"" />" & _
"<Resize Width=""260"" Height=""135"" />" & _
"<Color AnimationTarget=""" & flyout.ClientID & """ StartValue=""#AAAAAA"" EndValue=""#FFFFFF"" Property=""style"" PropertyKey=""backgroundColor"" />" & _
"</Parallel>" & _
"<ScriptAction Script=""Cover($get('" & flyout.ClientID & "'), $get('" & info.ClientID & "'), true);"" />" & _
"<StyleAction AnimationTarget=""" & info.ClientID & """ Attribute=""display"" Value=""block""/>" & _
"<FadeIn AnimationTarget=""" & info.ClientID & """ Duration="".2""/>" & _
"<StyleAction AnimationTarget=""" & flyout.ClientID & """ Attribute=""display"" Value=""none""/>" & _
"<StyleAction AnimationTarget=""" & info.ClientID & """ Attribute=""height"" value=""auto"" />" & _
"<Parallel Duration="".5"">" & _
"</Parallel>" & _
"<Parallel Duration="".5"">" & _
"<FadeIn AnimationTarget=""btnCloseParent"" MaximumOpacity="".9"" />" & _
"</Parallel>" & _
"</Sequence>" & _
"</OnClick>"
 

Nevertheless, I am pleased that I was able to do this, and it makes a lot of sense.  It would've saved me many hours however, if this method was better documented in the first place without having to have stumbled upon this post from Ted Glaza:   http://forums.asp.net/thread/1410861.aspx