Usercontrol, который динамически генерирует список элементов управления при обратной передаче

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

Он должен иметь текстовое поле, в котором пользователь может ввести имя тега, и кнопку для отправки тега.

После добавления тега он должен динамически создать ярлык с именем тега с помощью кнопки "X", чтобы удалить его для каждого введенного тега.

Что-то вроде этого:

[ Textbox ] [Submit]

[X] Tag 1
[X] Tag 2
[X] Tag 3

Проблема в том, что я не могу понять, как заставить все работать правильно.


Selector.ascx

< markup for the textbox >
< markup for the sumbit button >
<asp:Placeholder runat="server" ID="PHList" />

Я использую asp:Placeholder для создания динамических элементов управления.


Selector.ascx.cs

Мне нужно отслеживать сгенерированные элементы управления между постбэками.

Я использую List<string> хранится в viewstate:

private List<string> SelectedTags
{
    get
    {
        return (List<string>) ViewState["SelectedTags"];
    }
    set { ViewState["SelectedTags"] = value; }
}

Когда я нажимаю кнопку отправки, я добавляю новый тег в список SelectedTags и вызываю функцию RefreshPlaceholder:

void RefreshPlaceholder()
{
    PHList.Controls.Clear();
    foreach(var x in SelectedTags) 
    {
         // generate a label and the "X" button, wiring it with a lambda
    }
}

Когда я нажимаю кнопку отправки, новая пара (кнопка, метка) правильно генерируется и отображается после обратной передачи.

Однако, когда я нажимаю любую из сгенерированных кнопок "X", я получаю сообщение об ошибке, потому что событие click, вызванное динамически сгенерированной кнопкой, больше не может найти кнопку отправителя, так как она еще не была сгенерирована.

Если я пытаюсь сгенерировать кнопки в OnLoad, возникает та же проблема, что и события обратной передачи перед Page.Load.

Если я попытаюсь сгенерировать кнопки в OnInit, ViewState еще не будет обновлен, поэтому сгенерированный список будет устаревшим, так как список состояния SelectedTags еще не обновлен.

Я не могу найти решение, чтобы заставить все работать как задумано. Что я делаю неправильно?

1 ответ

Решение

Объявите список типов кнопок в методе OnInit; затем в RefreshPlaceHolder извлекает и перебирает выбранные теги и добавляет их в список

protected override void OnInit(EventArgs e)
        {

               List<Button> listButtons ;

            base.OnInit(e);
        }  



 void RefreshPlaceholder()
    {
        listButtons = new List<Button>();
        PHList.Controls.Clear();
        foreach(var x in SelectedTags) 
        {
         Button b = new Button();
         b.Text=x;
         listButtons.add(b);



       // generate a label and the "X" button, wiring it with a lambda
        }
    }  
Другие вопросы по тегам