ASP.net Динамическое добавление элементов управления при нажатии кнопки. Проблема обратной передачи - PullRequest
1 голос
/ 03 мая 2011

У меня есть пользовательский элемент управления, который содержит несколько кнопок, в зависимости от нажатой кнопки, на страницу добавляется другой элемент управления (скажем, кнопка 1 добавляет текстовое поле, кнопка 2 добавляет метку).

У меня есть код такой:

protected void but1_click(object sender, EventArgs e)  
{  
    TextBox tb = new TextBox();  
    tb.ID = "tb1";  
    paramsCtrlDiv.Controls.Add(tb);  
}  

protected void but2_click(object sender, EventArgs e)  
{  
    Label lb = new Label();  
    lb.ID = "lb1";  
    paramsCtrlDiv.Controls.Add(lb);  
}  

Затем у меня есть третья кнопка (кнопка3), чтобы получить все элементы управления на странице и их значения. (Предположим, что каждая кнопка нажимается только один раз для этого примера).

Моя проблема в том, что при нажатии кнопки 3 массив paramsCtrlDiv.controls не содержит добавленные элементы управления. Я знаю, что мне нужно добавить эти элементы управления во время каждой обратной передачи. Моя проблема в том, что я не знаю точно, какие элементы управления добавил пользователь. Я не знаю, что я хочу добавить Page_Load (там может быть текстовое поле, затем метка, просто метка или просто таблица символов), я могу не управляйте тем, что нажимает пользователь.

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

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Поскольку вы делаете это динамически, вам нужен способ хранения того, что вы делаете, чтобы сервер мог воссоздать его с каждым PostBack. Если вы не хотите использовать Session, сохраните данные в ViewState (что будет сохраняться на странице независимо от времени). Создайте List<YourControlObjects> и убедитесь, что это Serializable, а затем сохраните его в ViewState. Вы, вероятно, хотите сохранить тип элемента управления, местоположение и т. Д., Чтобы можно было перестроить его на Page_Load каждый раз, когда появляется PostBack.

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

0 голосов
/ 03 мая 2011

Лично я бы справился с этим, используя ListView. Включите все необходимые элементы управления в ItemTemplate с помощью Visible=false и свяжите их с небольшим списком, хранящимся в состоянии просмотра. Программно установите правильный элемент управления, видимый в строке данных. Обратите внимание, что вам придется собрать свои данные в элементах управления и сохранить их в своем списке, прежде чем связывать их.

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