2011-01-07 60 views
2

我正在通过单击LinkBut​​ton在页面中创建动态文本框。LinkBut​​ton上的动态文本框单击

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

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

我宁愿有一个Repeater控件,然后保持在会话一个ArrayList和使用,作为一个数据源到中继器控制。当我想添加一行时,我宁愿在会话中向ArrayList添加一行,然后重新绑定中继器控件。 让我知道你是否需要一个例子。

+0

感谢cybermate,我现在明白了。如果你能举一个例子,那就太好了。我正在阅读4guysfromrolla文章 – 2011-01-07 21:12:19

+0

我已经在pastebin上发布了一个粗略样本。检查这个URL:http://pastebin.com/dwqHDTUC – Chandu 2011-01-07 21:28:05

1

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

1

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

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); 
    } 
} 
相关问题