ASP.NET помещает динамические элементы управления на страницу в обратном порядке - PullRequest
0 голосов
/ 16 сентября 2009

У меня странная проблема при размещении текстовых полей на странице в обратном порядке. Вся система событий испорчена. Изменение одного текстового поля вызывает 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 голосов
/ 16 сентября 2009

Всегда помещайте динамические элементы управления в событие OnInit. Тогда будет работать сериализатор / десериализатор viewstate. И вы должны добавлять элементы управления для каждого запроса, а не только в! IsPostBack.

0 голосов
/ 16 сентября 2009

Попробуйте вызвать InitFields () для события Page_PreInit, а не Page_Load.

Или альтернативой может быть переопределение метода CreateChildControls () ( Статья MSDN ), если вы используете CreateChildControls (), вам необходимо вызвать EnsureChildControls () для метода Page_Load, чтобы убедиться, что CreateChildControls () вызван до того, как вы попытаетесь получить доступ к элементам управления, созданным в этом методе.

...