2014-12-23 3 views
1

Я хочу создать многопользовательский пользовательский элемент управления, который позволяет пользователю создавать и удалять теги.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" /> 

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


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», я получаю сообщение об ошибке, потому что событие клика, запускаемое динамически сгенерированной кнопкой, больше не может найти кнопку отправителя, так как оно еще не создано.

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

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

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

ответ

1

Объявить список типов кнопок OnInit method; затем в 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 
     } 
    } 
+0

Вы можете, конечно же, сгруппировать список кнопок, чтобы отобразить его на странице на каком-либо пользовательском мероприятии – Mir