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
}
}