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

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

１．ボタンが押される  
２．Page_Loadが走る  
３．テーブルが作り直される  
４．ボタンクリック処理メソッドが走る  
５．リダイレクトされる

となっているようです。  
問題はテーブルが作り直されるのところで、ここでまた時間がかかってしまいます。  
そこで、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();
    }
    
```
CC BY-SA 3.0
2017-06-29T06:43:35.220
35959
2017-06-30T04:29:46.613
2017-06-30T04:29:46.613
18637
18637
question
c# asp.net
ASP.net ポストバック時にテーブルを作り直さないですむようにするには
> Controlsクラスにはクローンメソッドがなく、推奨されない方法なのか

ASP.NET Web Formsでテーブルを表示する場合、通常は[データバインド](https://msdn.microsoft.com/ja-
jp/library/gg695802\(v=crm.7\).aspx)という手法を使用して表を構築します。ですのでコントロール自体ではなく、コントロールのデータソースを複製すれば事足ります。

データバインドをする実装に変更したうえでポストバック時のためにデータソースを保持し続ける方法ですが、`Session`または`ViewState`に保存するのが適当です。`static`変数はユーザー別に分割されていないためサーバー全体で共通の値となりますし、ワーカープロセスが複数存在する場合やリサイクルされた場合に値が共有されないため確実性に劣ります。
CC BY-SA 3.0
2017-06-29T07:05:17.533
35960
2017-06-29T07:05:17.533
5750
35959
answer