Как зарегистрировать события для постбэка с помощью RenderControl?

Я использую RenderControl в построителе строк, чтобы добавить раскрывающийся список в asp:TreeView. Мой раскрывающийся список настроен на автопостбэк, и у меня есть событие в прикрепленном файле SelectedIndexChanged. К сожалению, я вижу, что мой выпадающий список правильно заполнен внутри моего дерева, но изменение выбора не вызывает событий.

вот мой код:

DropDownList ddlTest = new DropDownList();
ddlTest.Items.Add("test");
ddlTest.Items.Add("test2");
ddlTest.AutoPostBack = true;
ddlTest.SelectedIndexChanged += ddlTest_SelectedIndexChanged;

TreeNode node = new TreeNode();

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter writer = new HtmlTextWriter(sw);

ddlTest.RenderControl(writer);

node.Text = sb.ToString();
node.ShowCheckBox = false;

В раскрывающемся списке нет метода RegisterEvent или что-то в этом роде. Есть ли способ добиться того, что я пытаюсь сделать?


person jpsimard-nyx    schedule 06.04.2009    source источник


Ответы (2)


Render/RenderControl обычно опаздывает для любого вида событий. Вместо этого попробуйте использовать PreRender.

person gsnerf    schedule 06.04.2009
comment
Он не получит никаких подключений — выпадающий список не добавляется ни в одну коллекцию элементов управления. Это просто пишется как текст. - person Ruslan; 06.04.2009
comment
Хороший момент, я проигнорировал эту часть: у меня есть решение этой проблемы: в зависимости от вашей версии .net вы можете использовать метод GetPostBackEventReference на странице (устаревший) или ClientScriptManager для ручного создания обратного вызова, который может быть установлен на событие onchange элемента. - person gsnerf; 06.04.2009

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

Прямо сейчас вы записываете отображаемый HTML-код раскрывающегося списка в виде текста. Он может иметь или не иметь функцию doPostBack. И если бы это было так, у фреймворка не было бы возможности обработать это, поскольку нет контроля для обработки.

Поскольку в TreeNode нет коллекции Controls, вы можете попробовать поэкспериментировать с добавлением одного скрытого выпадающего списка, отображая остальные так, как вы это делаете, и таким образом обманывая фреймворк. Однако это сложно, так как вам приходится иметь дело с проверкой, видимостью, идентификаторами и т. д.

Вы также можете попытаться обработать событие обратной отправки самостоятельно. Предполагая, что вы правильно сформировали __doPostBack, при загрузке страницы проверьте Request.Form["__EVENTTARGET"] и Request.Form["__EVENTARGUMENT"] и обработайте их соответствующим образом.

Вы также можете попробовать создать свое собственное древовидное представление...

person Ruslan    schedule 06.04.2009