Добавление экземпляров UserControl - PullRequest
1 голос
/ 11 ноября 2011

У меня есть веб-страница, содержащая панель и кнопку.Когда вы нажимаете кнопку, я хочу добавить новый экземпляр UserControl на панель.

Метод panel.Controls.Add указывает, что он добавляет элемент в коллекцию.

Iможно сделать это с помощью локальной переменной для хранения количества экземпляров элемента управления.Затем, когда он добавляется, он многократно повторяет цикл, создавая новые элементы управления.

private void AddUCToUI(int counter)
    {
        for (int i = 0; i < counter; i++)
        {
            MyControl ctrlMyControl = (MyControl)LoadControl("MyControl.ascx");
            ctrlMyControl.SetID(i);
            myPanel.Controls.Add(ctrlMyControl);
        }
    }

НО, я не хочу каждый раз воссоздавать все элементы управления, поскольку пользователь, возможно, уже ввел в них данные...

Итак, все, что я хочу сделать, - это создать еще один элемент управления и добавить его в коллекцию, в которой уже содержится первый элемент.

private void AddUCToUI(int counter)
    {
        MyControl ctrlMyControl = (MyControl)LoadControl("MyControl.ascx");
        ctrlMyControl.SetID(counter);
        myPanel.Controls.Add(ctrlMyControl);
    }

Это должно создать новый элемент управления, дать емуидентификатор, а затем добавить его в коллекцию.Однако кажется, что он добавляет элемент управления в первую очередь, а затем перезаписывает этот элемент управления в коллекции, когда я пытаюсь добавить другой.Почему это?

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Мне удалось решить эту проблему:

Перемещение кода с onInit на Page_Load и использование переменной сеанса для counter решило проблему увеличения его значения.Переменные сеанса не сбрасываются при возникновении PostBack.

Вот мое решение:

protected override void Page_Load(object sender, EventArgs e)
{
    int counter;

    if (Session["counter"] == null)
    {
        counter = 0;
    }
    else
    {
        counter = (int)Session["counter"];
    }

    for (int i = 0; i < counter; i++)  
    {  
        MyControl ctrlMyControl = (MyControl)LoadControl("MyControl.ascx");  
        ctrlMyControl.ID = String.Format("ctrl_{0}", myPanel.Controls.Count); //count = 0
        myPanel.Controls.Add(ctrlMyControl); //count = 1
    }      
}
0 голосов
/ 11 ноября 2011

Поскольку вы добавляете элементы управления динамически, вам придется каждый раз создавать их заново.Однако если вы назначите один и тот же идентификатор элементам управления при воссоздании их, они будут повторно заполнены из ViewState.Если элементы управления не заполняются, вы, вероятно, воссоздаете их слишком поздно в жизненном цикле страницы.Попробуйте воссоздать их во время OnInit:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    for (int i = 0; i < counter; i++)  
    {  
        MyControl ctrlMyControl = (MyControl)LoadControl("MyControl.ascx");  
        ctrlMyControl.ID = String.Format("ctrl_{0}", myPanel.Controls.Count); //count = 0
        myPanel.Controls.Add(ctrlMyControl); //count = 1
    }      
}

Другой вариант - DynamicControlsPlaceHolder.По сути, этот элемент управления заботится о вышесказанном для вас, не требуя никакого дополнительного кода.

Вы можете скачать его здесь:http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...