Динамически создаваемый субклассовый выпадающий список, а не событие - PullRequest
0 голосов
/ 20 октября 2011

В сети множество постов на эту тему, но я не могу найти ту, которая соответствует моей ситуации;

У меня есть класс 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, но пока не понял, что именно.Если вы знаете, как я могу реализовать решение этой проблемы, очень хотелось бы получить короткий пример.

1 Ответ

0 голосов
/ 20 октября 2011

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

См. эту статью для разработки составного элемента управления.Для события свойство типизированной строки не будет работать - вы должны определить событие на уровне составного элемента управления.Вы можете вспомнить событие ребенка, подняв свое собственное событие в обработчике (это показано в статье).Другим способом было бы замкнуть обработчики событий.Например, определите событие в вашем составном элементе управления, например

public event EventHandler SelectedIndexChanged
{
   add
   {
      childDdl.SelectedIndexChanged += value;
   }
   remove
   {
      childDdl.SelectedIndexChanged -= value;
   }
}

childDll - ссылка на ваш дочерний элемент управления ddl.

...