2

我通过单击链接按钮在页面中创建动态文本框。

但是,之后,如果页面被提交,我找不到动态创建的项目,因此无法将信息发送到数据库。

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

我宁愿有一个中继器控件,然后在会话中维护一个 ArrayList 并将其用作中继器控件的数据源。当我想添加一行时,我宁愿在会话中向 ArrayList 添加一行并重新绑定转发器控件。如果你需要一个例子,请告诉我。

于 2011-01-07T20:46:27.707 回答
1

页面生命周期的东西在 ASP.NET 中确实很棘手。您需要确保在生命周期尝试加载其视图状态之前以相同的方式创建链接按钮。最好的方法可能是设置您的控件/页面,以便在保存 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

控件集合是一个树结构。控件包含其他控件,因此它可能有 1 个 Panel 控件,其中包含几个其他 Panels 和那些包含您正在寻找的 TextBoxes。您必须递归地通过控件。

看看这个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 回答