Firstly - I couldn't have answered this without the help of codingBiz, so thanks dude !!
The trick was to ditch the <input type="button">
type button and go for a server control, which adds the onclick event on the RowDataBound.
The reason I couldn't go for this the first time round was because I needed to add some javascript to the onclick event, and while this would work on a standard HTML button control, it wouldn't work on the asp:button. CodingBiz pointed me towards adding the onclick event at RowDataBound. With a few code changes to be able to access the correct row and datakey data, I got it working...
ASPX page :
<asp:TemplateField>
<ItemTemplate>
<asp:Button runat="server" ID="btnDateRange" Text="asp Date Range" CssClass="JQDatePicker SmallText FloatRight WrapButtonText" />
<asp:Button ID="btnShowImpressions" CommandArgument='<%# Eval("ImpressionTagID") %>' CommandName="ShowImpressions" Text="Total Impressions" runat="server" UseSubmitBehavior="false" CssClass="SmallText FloatLeft WrapButtonText" Width="80px" />
</ItemTemplate>
</asp:TemplateField>
Code behind :
protected void gridImpressionTags_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
Button btnDateRange = e.Row.FindControl("btnDateRange") as Button;
if (e.Row.RowType == DataControlRowType.DataRow)
{
Button btn = e.Row.Cells[5].Controls[1] as Button;
string datakey = gridImpressionTags.DataKeys[e.Row.RowIndex].Value.ToString();
btn.Attributes["onclick"] = "javascript:document.getElementById('hdnImpressionTagID').value = '" + datakey + "'";
}
}