LinkBut​​ton上的动态TextBox单击

时间:2011-01-07 20:41:03

标签: c# asp.net textbox linkbutton

我通过单击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方法中我可以看到这些项目,并且它们存在,但是如果我提交页面并尝试在数据库中插入值没有...

非常感谢任何提示。

4 个答案:

答案 0 :(得分:1)

如果动态创建控件,则它们不会保留在提交的控件层次结构/视图状态中。

查看此文章:http://www.4guysfromrolla.com/articles/092904-1.aspx

我宁愿拥有一个Repeater Control,然后在会话中维护一个ArrayList,并将其作为DataSource用于转发器Control。当我想添加一行时,我宁愿在会话中向ArrayList添加一行并重新绑定转发器控件。 如果您需要一个例子,请告诉我。

答案 1 :(得分:1)

页面生命周期的东西在ASP.NET中非常棘手。您需要确保在生命周期尝试加载其视图状态之前以相同的方式创建LinkBut​​tons。执行此操作的最佳方法可能是设置控件/页面,以便在保存ViewState时,它首先将有关您创建的文本框的信息添加到ViewState。然后,在加载ViewState后立即根据该信息创建文本框。您可以通过覆盖SaveViewState和LoadViewState方法来完成此操作。

答案 2 :(得分:1)

您必须在Postback上重新创建每个动态控件,否则无法从ViewState重建它们的值。因此,您需要保存文本框的计数(例如,作为ViewState变量)。他们需要获得相同的id,因此您应该使用计数器作为ID的后缀(f.e.TextBox_4)。

答案 3 :(得分:1)

Controls Collection是一种树形结构。控件包含其他控件,因此它可能有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);
    }
}