Darren,
After trying out some code, it appears the FindControl method of the Page object wants the UniqueID, not the ClientID. The first concatenates the control's id with any containers it is found it with colons, while ClientID does the same thing with underscores, in order to gen a special id.
You can implement the GridView_RowDataBound event handler to grab hold of an instance of your templated control, like this:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.DataItem != null)
{
Control c = e.Row.FindControl("Image1");
...
}
The Row object's FindControl method actually takes the simple ID property of your control as a parameter. This would be the id you gave your control inside your Item template. In my case, I had an image control called, naturally, Image1.
I found out that it was the UniqueID I wanted by adding this bit of code:
Control c = e.Row.FindControl("Image1");
Control c2 = Page.FindControl(c.ClientID);
Control c3 = Page.FindControl(c.ID);
Control c4 = Page.FindControl(c.UniqueID);
Only c4 actually evaluates to an object. c2 and c3 are null.
My bad, Darren. I apologize for misleading you. To my chagrin, I don't know as much as I sometimes think I do.
--James