I found this today and was completely floored in it’s simplicity.  Works like a charm:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

    {

        if (e.Row.RowType == DataControlRowType.DataRow)

        {

            string ProductId = DataBinder.Eval(e.Row.DataItem, "ProductId").ToString();

            string Location = ResolveUrl("~/Details.aspx") + "?ProductId=" + ProductId ;

            e.Row.Attributes["onClick"] = string.Format("javascript:window.location='{0}';", Location);

            e.Row.Style["cursor"] = "pointer";

        }

    }