2009-04-15 14 views
0

ダイナミック制御:私はASP.NETで動的にコントロールの作成、テキストのこの作品について読ん作成

...ダイナミックコントロールを使用している場合、あなたは は、彼らが唯一の次のポストバックまで を存在することを覚えておく必要があります。 ASP.NET は、動的に追加された コントロールを再作成しません。 コントロールを複数回再作成する必要がある場合は、 Page.Loadイベントハンドラで コントロールを作成する必要があります。これには、 コントロールの コントロールで ビューステートを使用できるという追加の利点があります。ビューステートが 通常、あなたがPage.Loadイベントの ハンドラでコントロールを作成する場合、 ASP.NETはそれが 後に持っている任意のビューステート 情報が適用され、Page.Load イベントの前に復元されていてもPage.Loadイベントハンドラが終了します。

<asp:Button ID="Button1" runat="server" Text="Button" 
      onclick="Button1_Click" /> 

と動的にコード5つのチェックボックスの後ろに - -

protected void Page_Load(object sender, EventArgs e) 
{ 
    for (int i = 0; i <= 5; i++) 
    { 
     var chBox = new HtmlInputCheckBox(); 
     Controls.Add(chBox); 
    } 

} 

この プロセスは

は私が宣言ボタンを作成 例でそれを試してみたかった...自動
ですしかし、いくつかのチェックボックスをチェックしてボタンを押すと、ポストバックの後にすべてのチェックボックス の状態が消去されます。つまり、ASP.NETはダイナミックコントロール のビューステートを自動的に管理しません。私は、チェックボックスのそれぞれにビューの状態を有効にしようとしましたが、ページ全体では が動作しません。 説明できる人: 1.なぜそうですか? 2.これを避けるには?

+0

こんにちは。私のコメントの更新されたコードを参照してください、それがうまくいきます。そうでない場合は、私にコメントを書いてください。私が助けることができるかどうかがわかります。 – Kirtan

答えて

0

Page_Initでコントロールを作成できます。

protected void Page_Init(object sender, EventArguments e) 
{ 
    //Generate the checkboxes dynamically here. 
    CheckBox c; 
    for (int i = 0; i < 5; i++) { 
    c = new CheckBox(); 
    c.ID = "Checkbox" + i.ToString(); 

    divContainer.Controls.Add(c); //create a div with runat="Server" attribute or use an asp:Panel, etc. container controls. 
    } 
} 

その後、もう一度ボタンをクリックしてください。状態は常に維持されます。

+0

あなたとアンドリューウサギが言ったように私はそれをしなかったが、変化なし、私がすることができますここに私のaspxを公開しますか? – ge1serf

+0

divContainerヒントありがとう! – ge1serf

2

これは、ASP.NETがPOSTされた値を復元するために、それらのコントロールがLoadより前のページの一部である必要があるためです。この作業を行うには、(可能であれば)ページのコントロールOnInitを作成する必要があります。

+0

private void Page_Init(オブジェクト送信者、System。(int i = 0; i <= 5; i ++) { var chBox = new HtmlInputCheckBox(); Controls.Add(chBox); } } 引用されたOPとして変更なし:( – ge1serf

+0

、これはPageLoad –

+0

で作成されたコントロールのために、すでに動作します私は両方の方法でIDを設定しようとしました – ge1serf

0

ダイナミックコントロールごとにIDを設定して、ポストバック間で同期できるようにする必要があります。

0

私は理解したよう - のOnInit onLoadなど にコントロールを作成するために関係なく(ただし、いくつかの本のonLoadで示唆)がある、問題は彼らにを配置する場所です - あなたはControls.Addて配置 場合 - それは、それらを<form></form>の外に置くので、ポストバック は制御の状態をとらない。 <form></form>のプレースホルダを作成してこのプレースホルダにダイナミックコントロールを追加した後、うまく動作するようになりました。

関連する問題