1

押されたボタンに応じて、別のコントロールがページに追加されます (ボタン 1 が TextBox を追加し、button2 がラベルを追加するとします)。

次のようなコードがあります。

protected void but1_click(object sender, EventArgs e)  
{  
    TextBox tb = new TextBox();  
    tb.ID = "tb1";  
    paramsCtrlDiv.Controls.Add(tb);  
}  

protected void but2_click(object sender, EventArgs e)  
{  
    Label lb = new Label();  
    lb.ID = "lb1";  
    paramsCtrlDiv.Controls.Add(lb);  
}  

次に、ページ上のすべてのコントロールとその値を取得するための 3 番目のボタン (button3) があります。(この例では、各ボタンが 1 回だけクリックされると仮定します)。

私の問題は、button3 が押されたときに paramsCtrlDiv.controls 配列に追加されたコントロールが含まれていないことです。各ポストバックの Page_Load 時にこれらのコントロールを追加する必要があることはわかっています。私の問題は、ユーザーが追加したコントロールが正確にわからないためです。何を追加したいのかわからないため、Page_Load (テキスト ボックス、ラベル、ラベルのみ、または tb のみ) を追加できます。ユーザーが押すものを制御しません。

セッションにすべてを保存できることはわかっていますが、これがエレガントなソリューションかどうかはわかりません。このコントロールの複数のインスタンスが異なるタブにある場合もあるため、それぞれが独自のコントロール コレクションを正しく維持する必要があります。

4

2 に答える 2

2

これを動的に行っているため、サーバーが各 で再作成できるように、行っていることを保存する方法が必要ですPostBack。を使用したくない場合はSession、データを に保存しますViewState(時間に関係なくページに保持されます)。を作成し、List<YourControlObjects>それが存在することを確認してSerializableから、 に保存しViewStateます。Page_Loadがあるたびに再構築できるように、コントロールの種類、場所などを保存する必要があるでしょうPostBack

問題は、これらの動的に作成されたコントロールの独自の状態を維持する必要があることに帰着します。これは 1 つの提案にすぎませんが、さまざまな方法でこれを行うことができます。

于 2011-05-03T16:09:51.910 に答える
0

個人的には、 を使用してこれを処理しListViewます。必要なすべてのコントロールをItemTemplatewithに含めVisible=false、それらをビューステートに格納された小さなリストにバインドします。行データバインドで表示される正しいコントロールをプログラムで設定します。再バインドする前に、コントロールでデータを収集してリストに保存する必要があることに注意してください。

于 2011-05-03T16:08:27.390 に答える