2011-01-07 11 views
2

LinkBut​​tonをクリックしてページ内に動的TextBoxを作成しています。LinkBut​​tonの動的TextBoxをクリックします。

しかし、それ以降、ページが送信された場合、私は動的に作成されたアイテムを見つけることができないため、情報をデータベースに送信することはできません。

protected void lbAddTag_Click(object sender, EventArgs e) 
{ 
    for (int i = 0; i < 3;i++) 
    { 
     CreateTextBox("txtTag-" + i.ToString()); 
    } 

} 

private void CreateTextBox(string ID) 
{ 
    TextBox txt = new TextBox(); 
    txt.ID = ID; 
    txt.Width = Unit.Pixel(300); 
    //txt.TextChanged += new EventHandler(OnTextChanged); 
    txt.AutoPostBack = false; 
    tagsPanel.Controls.Add(txt); 

    Literal lt = new Literal(); 
    lt.Text = "<br /><br />"; 
    tagsPanel.Controls.Add(lt); 
} 

私が入れた場合:

foreach (Control c in tagsPanel.Controls) 
{ 
    if (c is TextBox) 
    { 
     lblError.Text += c.ClientID + " , "; 
    } 
} 

をlbAddTag_Click方法で私はアイテムを見ることができ、そして、彼らは存在するが、私はページを送信し、データベース何に値を挿入しようとすると...

ヒントは大変ありがとうございます。

答えて

1

コントロールを動的に作成すると、送信時にコントロールの階層/ビューの状態に保持されません。

チェックこの記事:http://www.4guysfromrolla.com/articles/092904-1.aspx

私はむしろ、リピータコントロールを持っているし、その後のセッションでのArrayListを維持し、コントロールをリピータにデータソースとしてそれを使用します。行を追加したいときは、セッションのArrayListに行を追加し、リピータコントロールを再バインドします。 例が必要な場合は教えてください。

+0

おかげでcybermate、私は今理解しています。あなたが例を挙げることができればそれはすばらしいことでしょう。私は今4guysfromrollaのポストを読んでいます –

+0

私はpastebinで原油サンプルを投稿しました。このURLを確認してください:http://pastebin.com/dwqHDTUC – Chandu

+0

ありがとうございます。これを試してみます –

1

ページライフサイクルのことは、ASP.NETでは本当に面倒です。ライフサイクルがビューステートでロードしようとする前に、LinkBut​​tonが同じ方法で作成されることを確認する必要があります。これを行う最善の方法はおそらくコントロール/ページを設定して、ViewStateを保存するときに、作成したテキストボックスに関する情報をViewStateに追加するようにすることです。次に、ViewStateを読み込んだ直後に、その情報に基づいてテキストボックスを作成します。これは、SaveViewStateメソッドとLoadViewStateメソッドをオーバーライドすることで実行できます。

1

ポストバックですべてのダイナミックコントロールを再作成する必要があります。そうしないと、ViewStateから値を再構築できません。したがって、テキストボックスの数を(ViewState変数として)保存する必要があります。彼らは同じIDを取得する必要がありますので、カウンターをIDの接尾辞として使用する必要があります(f。TextBox_4)。

1

コントロールコレクションはツリー構造です。コントロールには他のコントロールが含まれていますので、1つのPanelコントロールを持つことができます。これには、他のいくつかのパネルが含まれており、探しているTextBoxが含まれています。あなたは再帰的にコントロールを通過する必要があります。このhttp://msdn.microsoft.com/en-us/library/486wc64h.aspx

それとも、この時

ルック:

public delegate void control_visitor(Control control); 

public void iterate_controls(ControlCollection controls, control_visitor visitor) 
{ 
    foreach (Control control in controls) 
    { 
     visitor(control); 
     iterate_controls(control.Controls, visitor); 
    } 
} 
+0

hi Zac。私の問題はコントロールの反復に関連していません。私はこれがどのように行われたのか理解していました。問題は、私がページを送信した後、コントロールがviewstateに残らないということです。感謝のアレックス –

関連する問題