В сети множество постов на эту тему, но я не могу найти ту, которая соответствует моей ситуации;
У меня есть класс BasePage, от которого наследуется мой .aspx;У меня также есть классы BaseLabel и BaseDDL, которые расширяют соответственно Label & Dropdownlist.Кроме того, у меня есть класс ReadyDDL, который объединяет BaseLabel & BaseDDL в один элемент управления (но это класс, а не пользовательский элемент управления) и отображает их со своими собственными элементами Div, Table, TableRow, TableCells и другой меткой.Класс ReadyDDL позволяет мне определять метку, выпадающий список и макет в одном html-выражении в соответствии с:
<moc:ReadyDDL ID="Person" runat="server" Member="@UserID" Caption="Create strike for"
DataSourceSQL="SELECT ID, UserName FROM [User] WHERE isDeleted = 0 AND ClientID = 3" TextField="UserName" ValueField="ID"
OnSelectedIndexChanged="ddl_SelectedIndexChanged" />
Однако у меня есть проблема или две:
a) Событие не срабатывает.Посты, которые я прочитал на эту тему, говорят, что выпадающий список должен быть воссоздан OnInit, и все будет хорошо.НО -
Я не динамически создаю выпадающий список, а пользовательское расширение, равное одному - таким образом, код, который создает выпадающий список, отсутствует в моем aspx, где определен обработчик событий, но находится в отдельном .csфайл и, соответственно, я не могу написать
ddl.SelectedIndexChanged + = new EventHandler (X);
, потому что X не существует в классе, только на странице.
Единственный способ обойти это - открыть строковое свойство (OnSelectedIndexChanged), которое устанавливает другое свойство в BaseDDL, а при визуализации BaseDDL добавить свойство OnSelectedIndexChanged в создаваемую разметку.
Созданный html выглядит нормально, и на экране он выглядит нормально, и он выполняет обратную передачу, когда я изменяю выбор в элементе управления, но обработчик событий не запускается: в настоящее время он просто содержит пару операторов присваивания, которые яиметь точку останова, и которая не достигнута.
При отражении, я полагаю, рендеринг обработчика только добавляет событие к элементу управления в том, что касается клиента, а сервер не знает об этом - но как я могу преодолеть это и определить обработчик?при инициализации управления, когда обработчик не находится в том же файле исходного кода, что и код инициализации?
Есть ли у кого-нибудь какие-либо идеи относительно (1) запуска события или (2) как я могу определитьСобытие в коде, а не через рендеринг?
Любые вопросы, пожалуйста, задавайте.Буду признателен за любую помощь или предложения, и я отмечу Q как ответивший, если появится подходящая информация.
b) выбранное значение будет потеряно при обратной передаче.Я знаю, что должен что-то делать с Viewstate, но пока не понял, что именно.Если вы знаете, как я могу реализовать решение этой проблемы, очень хотелось бы получить короткий пример.