Добавление usercontrol каждый раз на событие ButtonClick - PullRequest
0 голосов
/ 14 мая 2010

Я пытаюсь каждый раз добавлять экземпляр UserControl в событие button_click, оно работает только в первый раз.Я добавляю идентификаторы в пользовательский элемент управления, добавляя целые числа из ViewState.Почему это не добавляет работы для последующих кликов.Вот упрощенная версия с тем же поведением.

protected void Button1_Click(object sender, EventArgs e)
{
    HtmlButton btnClick = new HtmlButton();
    btnClick.ID = "bt" + Append.ToString();
    btnClick.InnerText = "Button 1";
    MainArea.Controls.Add(btnClick);
}        

Ответы [ 3 ]

0 голосов
/ 14 мая 2010

Я делаю что-то похожее с адресом пользователя.

Поскольку вы добавляете элемент управления динамически, вам нужно будет заново создавать элемент управления после каждого постбэка (каждый раз, когда вы добавляете другой, вам необходимо воссоздать ВСЕ предыдущие элементы управления, которые вы добавили).

Я держу массив списков идентификаторов элементов управления (если вы хотите, чтобы viewstate сохранял содержимое, вам нужно создать элементы управления с такими же идентификаторами), который также отслеживает, сколько элементов управления я ранее добавил и которые необходимо воссоздать. Затем я повторяю цикл и снова создаю элементы управления в событии загрузки страницы:

foreach (string id in AddressItemIDs)
{
   addAddressControl(null, id);
}

и затем мое событие "button1_click" (в моем случае я использую кнопку ссылки ...

    protected void LinkButton1_Click(object sender, EventArgs e)
    {
        if (AddressCount == 0 || AddressCount < MaxAddresses && ((addressItem)addressContainer.Controls[addressContainer.Controls.Count-1]).HasAddress)
        {
            int i = 0;
            string prefix = "addressItem_";
            while (AddressItemIDs.Contains(prefix + i)) i++;

            AddressCount++;
            addAddressControl(null, prefix + i);

        }
        Button1.Visible = (AddressCount < MaxAddresses);
    }

вот мой метод addAddressControl:

    protected void addAddressControl(Address address, string id)
    {
        addressItem ai = (addressItem)LoadControl("~/controls/addressItem.ascx");
        ai.RemoveClicked += new EventHandler(ai_RemoveClicked);
        ai.ID = id;

        if (address != null)
        {
            ai.AddressID = address.AddressID;
            ai.Address = address.Street;
            ai.City = address.City;
            ai.State = address.State;
            ai.Zip = address.Zip;
            ai.TypeID = address.TypeID;
        }
        if(!AddressItemIDs.Contains(id))
            AddressItemIDs.Add(id);

        addressContainer.Controls.Add(ai);
    }
0 голосов
/ 01 апреля 2013
public partial class _Default : Page
{
    public int n;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (ViewState["Controls"] != null)
            n = (int)ViewState["Controls"];
        if (!Page.IsPostBack)
            n = 0;
        for (int i = 0; i <= n; i++)
        {
            TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl;
            uc.ID = "TestControl" + i.ToString();
            PlaceHolder1.Controls.Add(uc);
        }

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl;
        uc.ID = "TestControl" + n++.ToString();
        PlaceHolder1.Controls.Add(uc);
        ViewState["Controls"] = n;
    }
}
0 голосов
/ 14 мая 2010

Хорошо, теперь, когда код опубликован, я могу подтвердить проблему.

Каждый раз, когда вы нажимаете кнопку, выполняется обратная передача. При обратной передаче вы добавляете новую кнопку с именем, содержащим ваш счет. Но, когда страница повторно отображается при втором нажатии кнопки, она теряет все элементы управления, которые вы добавили, и просто добавляет обратно (из-за нажатия кнопки этой обратной передачи).

Итак, вы хотите настроить цикл, например:

protected void Button1_Click(object sender, EventArgs e) {
    for(int i = 0; i < Append; i++)
    {
        HtmlButton btnClick = new HtmlButton();
        btnClick.ID = "bt" + i.ToString();
        btnClick.InnerText = "Button " + i;
        MainArea.Controls.Add(btnClick);
    }
}

И это добавит одну кнопку на предыдущий клик, при условии, что «Append» - это некий счетчик, который вы храните в viewstate.

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

...