ASP.NET putting dynamic controls on page in reverse messes up events
- by Jimmy Geels
I have this weird problem when putting textboxes on the page in reverse. The whole event system is messed up. Changing one textbox fires TextChange on all textboxes. I can fix this by putting the controls in a list first and then call add while iterating trough the list in reverse. But i just want to know why this fails. Heres some code (.net 2.0)
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
InitFields();
}
private void InitFields()
{
int nrFields;
//We have a static textbox called nrElements, this determines the number
//of fields to initialize
if (int.TryParse(nrElements.Text, out nrFields))
{
//Put all the dynamic fields on the screen in reverse order
foreach(Control t in GetDynamicFields(nrFields))
{
//Calling Controls.Add works fine
//Calling Controls.AddAt messes up the events
//Try changing different textboxes
plhFields.Controls.AddAt(0, t);
}
}
}
private IEnumerable<Control> GetDynamicFields(int nrFields)
{
for (int i = 0; i < nrFields; i++)
{
TextBox txtBox = new TextBox();
txtBox.ID = string.Format("dynTextBox{0}", i.ToString());
txtBox.AutoPostBack = true;
txtBox.TextChanged += t_TextChanged;
yield return txtBox;
}
}
private void t_TextChanged(object sender, EventArgs e)
{
TextBox txtBox = sender as TextBox;
if (txtBox != null)
txtBox.Text = txtBox.Text + "Changed ";
}
}