2012-01-20 20 views
0

をクリックしたときに、私はとき、項目が選択されている場合、この動的に追加、ユーザーコントロールは、私はそれに

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
     Step 1 (Choose a Widget to Manage)<br /> 
     <asp:DropDownList ID="DropDownWidgetSelection" runat="server" 
      OnSelectedIndexChanged="DropDownWidgetSelection_SelectedIndexChanged" 
      AutoPostBack="True"> 
     </asp:DropDownList> 
     <div id="WidgetAdminControls" runat="server"></div> 
    </ContentTemplate> 
</asp:UpdatePanel> 

のようなのUpdatePanel内のコントロールは、それはしかしWidgetAdminControls WidgetAdminControls.Controls.Add(widget);

に新しいユーザーコントロールを追加します持って消えます私は、ページが再構築されているかsomehtingであり、動的に追加されたUserControlについて知りませんので、私は、推測されていないコントロールをクリックします。

この問題を解決するにはどうすればよいですか?

答えて

2

正しいですが、ページが再構築されているため、部分的または完全なポストバックを含むコントロールツリーを再作成する必要があります。

これを達成するには、ページをステートフルにするか、すべての往復でコントロールツリーを再作成するのに十分な情報を含める必要があります。あらゆるアプローチには長所と短所があります。

ステートフル

ほとんどのステートフルなページはセッションを使用します。あまりにも多くのデータをSessionにダンプして適切にクリーンアップしないように気をつけなければなりません(通常は、セッションをラップし、ユーザーが一度に持つことができるアクティブオブジェクトの数を管理するマネージャを使用します)。その上に、Session(プロセス外でさえ)は非常に高速で安全です。

往復

このアプローチは、URLにViewStateの、隠しフィールド、または情報を使用しています。情報がページに含まれている場合は、バイトで測定する必要があります。これは極端に小さくする必要があります。また、改ざんに耐性がありません。

この作業を行うために実際に多くを行う必要はなく、クリーンアップに必要な処理プロセスはありません。

データベース

また、あなたはすべてのクリックでデータベースに変更を永続化し、データベースからツリーを再構築しますが、クリックは非常に表していない限り、私は通常、このアプローチのファンではないじゃないでした重要なイベントであり、データは完全で検証されています。

非常に簡単な例は、ここではコントロールツリーを維持するためにセッションを使用することを示す一例です。これはうまくいくはずですが、ユーザーが同じセッションの同じページの別のコピーを開くなど、多くのことを考慮していません。コントロールツリーの管理はかなり複雑になる可能性があります。

private List<string> _listOfStrings 
{ 
    get 
    { 
    return (List<string>)Session["_listOfStrings"]; 
    } 
    set 
    { 
    Session["values"] = value; 
    } 
} 

protected override OnInit(EventArgs e) 
{ 
    if(!Page.IsPostback) 
    { 
     _listOfStrings = new List<string>(); 
    } 

    BuildControlTree(); 
} 

private void BuildControlTree() 
{ 
    foreach(string s in _listOfStrings) 
    { 
    // add a control to the control tree 
    } 
} 

protected void btnAddItem_Click(object sender, EventArgs e) 
{ 
    _listOfStrings.Add("some new item"); 

    // insert the control into the tree 
} 
+0

私がこれを行う方法の例を挙げることができますか? – jax

+0

@jax - いくつかのオプションとサンプルを使用して回答を更新しました。 Webフォームのコントロールツリーは扱いが面倒です。私はプロセスを抽象化し、それを管理するために何度も "配管"コードを書くのを避けるために、ライブラリ全体を書いています。 –

0

Dynamically追加されたコントロールは、ポストバックごとにインスタンス化され、初期化される必要があります。したがって、この場合は、そのコントロールをpage_init/loadイベントにロードする必要があります。

関連する問題