ASP.NET将动态控件放在页面上反过来混乱事件

时间:2009-09-16 07:22:00

标签: c# asp.net events dynamic .net-2.0

将文本框反向放在页面上时,我遇到了这个奇怪的问题。整个事件系统搞砸了。更改一个文本框会在所有文本框上触发TextChange。我可以通过先将控件放在列表中然后调用add来反复调用列表来解决这个问题。但我只是想知道为什么会失败。下面是一些代码(.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 ";
    }
}

2 个答案:

答案 0 :(得分:0)

尝试在Page_PreInit事件而不是Page_Load上调用InitFields()。

或者替代方法是覆盖CreateChildControls()方法(MSDN Article),如果使用CreateChildControls(),则需要在Page_Load方法上调用EnsureChildControls()以确保CreateChildControls()方法在尝试访问在该方法中创建的任何控件之前已调用。

答案 1 :(得分:0)

始终将动态控件放在OnInit事件中。然后viewstate序列化器/反序列化器将工作。而且你必须在每个请求上添加控件,而不仅仅是!IsPostBack。