2

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

ただし、その後、ページが送信されると、動的に作成されたアイテムが見つからないため、情報をデータベースに送信できません。

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 メソッドでアイテムを確認でき、それらは存在しますが、ページを送信して値をデータベースに挿入しようとしても何もありません...

どんなヒントでも大歓迎です。

4

4 に答える 4

1

コントロールを動的に作成する場合、それらは送信時にコントロール階層/ビュー ステートに永続化されません。

この記事をチェックしてください: http://www.4guysfromrolla.com/articles/092904-1.aspx

私はむしろ Repeater Control を持ち、セッションで ArrayList を維持し、それを DataSource として使用して Control をリピーターします。行を追加したい場合は、セッションで ArrayList に行を追加し、リピーター コントロールを再バインドします。例が必要な場合はお知らせください。

于 2011-01-07T20:46:27.707 に答える
1

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

于 2011-01-07T20:47:27.230 に答える
1

Postback ですべての動的コントロールを再作成する必要があります。そうしないと、それらの値を ViewState から再構築できません。そのため、テキストボックスの数を保存する必要があります (fe は ViewState 変数として)。それらは同じ ID を取得する必要があるため、ID (fe TextBox_4) からのサフィックスとしてカウンターを使用する必要があります。

于 2011-01-07T20:48:04.573 に答える
1

Controls コレクションはツリー構造です。コントロールには他のコントロールが含まれるため、1 つの Panel コントロールが含まれる場合があります。このコントロールには、他のいくつかの 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);
    }
}
于 2011-01-07T20:49:20.023 に答える