2016-06-18 2 views
1

私はまだ.NETで新しい作業をしていますが、この問題を解決するには作業の必要があると私は思っています。C#:Page_Load後のダイナミックコントロールへのアクセス

コードの簡略化されたバージョンを追加します。ここでは、リストに含まれる文字列を使用していくつかのチェックボックスを作成する必要があります。それらが作成されたら、私はそれらのいくつかを選択し、別のボタンをクリックし、選択されたチェックボックスの数を得ることができるはずです。

ページがリロードされているため、動的コンテンツのコントロール値が削除されているため、機能しません。私はこのような何かを使ってみました:

ViewState.Add("panelCheckListContainer", CheckListContainer); 

しかし、私はそれだけでエラーが発生します。私はいくつかの同様の質問を見たことがあるが、彼らのソリューションは私のために働いていないか、私はそれらを働かせることができませんでした。

コードは以下の通りです:

<asp:PlaceHolder runat="server" ID="checkList"></asp:PlaceHolder> 

答えて

0

私たちが知っているようにHTTPはステートレスなプロトコルであり、ASP.NETページ全体を通過:これはチェックボックスが接続されているプレースホルダがある

Panel panelCheckListContainer = new Panel(); 

protected void buttonCheck_Click(object sender, EventArgs e) 
{ 
    List<string> results = Get_Rand_Values(); 
    Get_CheckList(results); 
} 


private void Get_CheckList(List<string> results) 
{ 
    CheckBox checkBox; 
    panelCheckListContainer.ID = "correction-check-list"; 
    panelCheckListContainer.CssClass = "checkbox"; 

    foreach (string result in results) 
    { 

     checkBox = new CheckBox(); 
     checkBox.ID = Cypher_MD5(result); 
     checkBox.Text = result; 
     //checkBox.CheckedChanged += new EventHandler(Change); 

     panelCheckListContainer.Controls.Add(checkBox); 

    } 

    checkList.Controls.Add(panelCheckListContainer); 
} 


protected void buttonCount_Click(object sender, EventArgs e) 
{ 
    int i = 0; 
    foreach (Control c in panelCheckListContainer.Controls) 
    { 
     if ((c is CheckBox) && ((CheckBox)c).Checked) 
     { 
      ++i; 
     } 
    } 
    Response.Write("<script>alert('Checked: " + i + "');</script>"); 
} 

各要求のライフサイクル。これにより、初期コントロールで新しいページオブジェクトが初期化されます。ダイナミックコントロールはクラス定義に存在せず、実行時にインスタンス化されるため、すべての動的コントロールはレンダリングから削除されます。誰かが次にレンダリングして、ページのレンダリング時にこれらの動的コントロールをロードしたい場合は、page_loadイベントで(ダイナミックコントロール初期化)コードを処理する必要があります。

これで、ダイナミックコントロールの価値を維持し、 "要求"オブジェクトまたは "非表示フィールド"のいずれかを使用できます。コードスニペットにいくつかのコードを追加しました。

protected void Button1_Click(object sender, EventArgs e) 
    { 
     List<string> results = Get_Rand_Values(); 
     Get_CheckList(results); 
     Session["results"] = results; 
    } 
    protected void buttonCount_Click(object sender, EventArgs e) 
    { 
     int i = 0; 
     //foreach (Control c in) 
     //{ 
     // if ((c is CheckBox) && ((CheckBox)c).Checked) 
     // { 
     //  ++i; 
     // } 
     //} 
     var results = (List<string>)Session["results"]; 
     foreach (var k in results) 
     { 
      var tmp = Request[Cypher_MD5(k)]; 
      if(tmp == "on") 
      { 
       i++; 
      } 
      count++; 
     } 
     Response.Write("<script>alert('Checked: " + i + "');</script>"); 
    } 
関連する問題