ASP.net C#でテーブルを使うページを作っています。
このテーブルはSQLを大量に使い、生成するのに時間がかかります。
ただしテーブルの行数列数そのものはそれほど大きくありません。

テーブルのセルの中に各行のデータの詳細ページへのリダイレクト機能をもったボタンを配置しています。
ボタンが押されたときにその行の詳細ページにリダイレクトするのですが、
そのときの処理の順番として

1.ボタンが押される
2.Page_Loadが走る
3.テーブルが作り直される
4.ボタンクリック処理メソッドが走る
5.リダイレクトされる

となっているようです。
問題はテーブルが作り直されるのところで、ここでまた時間がかかってしまいます。
そこで、IsPostBackフラグなどを見てボタンクリック時にテーブルを作る処理を飛ばしてみたのですが、
そうするとボタンクリック処理が呼ばれなくなってしまうようです。
テーブルを作り直す処理は必要なようです。

そこで思いついたのは初回に作ったテーブルオブジェクトのコピーをstatic変数にとっておき、
ボタンクリック時にそのstatic変数をもとにテーブルを作り直すというものです。
そうすればボタンクリック時のSQLの処理は要らなくなると思いました。
しかし、Controlsクラスにはクローンメソッドがなく、
推奨されない方法なのかなと思い躊躇しています。

一般的に言って一度作ったテーブルを次回のポストバック時に使いまわすというのは
どのような方法があるのでしょうか。
よろしくお願いします。

すいません、コメントで追記しようとしたのですが文字数超過とでたので本文に書きます。
すいません。まだ躓いてます。
ためしに以下のようなコードを組んでみたのですがボタンが上手く表示されません。
DataSetを使ってるのが悪いのでしょうか?

protected void Page_Load(object sender, EventArgs e)
{
  DataSet ds = new DataSet();
  DataTable dt = new DataTable();
  dt.Columns.Add("A");
  dt.Columns.Add("B");
  dt.Columns.Add("C");

  DataRow row = dt.NewRow();
  ButtonField b = new ButtonField();
  b.Text = "1";
  b.CommandName = "A1";
  row["A"]=b;
  row["B"] = 2;
  row["C"] = 3;
  dt.Rows.Add(row);
  ds.Tables.Add(dt);
  GridView1.DataSource = ds;
  GridView1.DataBind();
}