Выбор элемента в инкапсулированном DropDownList на DataBind - PullRequest
1 голос
/ 15 февраля 2010

У меня есть комплекс UserControl с основной целью инкапсулировать DropDownList с рядом свойств для расширенной манипуляции.

Список заполняется по событию PreRender в зависимости от того, какие свойства были ранее установлены:

protected void Page_PreRender(object sender, EventArgs e)
{
    sourceClient.SelectCommand = this.Property1 ? "exec a" : "exec b";
}

Наиболее используемым свойством является ClientID:

[Category("Settings")]
public int ClientID
{
   get
   {
      return Int32.Parse(DropDownList1.SelectedItem.Value);
   }
   set
   {
      DropDownList1.Items.FindByValue(value).Selected = true;
   }
}

Getter обычно вызывается ControlPameters в SqlDataSources на страницах с этим элементом управления.

Сеттер - из разметки: <uc:UserControl1 runat="server" ClientID='<%# Bind("ID") %>' />.

Итак, вопрос:

Почему сеттер из Bind вызывается раньше, чем PreRender? И DropDownList пусто и выбор элемента не работает! Как обойти это поведение?

Edit1: Хорошо, не PreRender, а Init. Но DropDownList1_DataBinding по-прежнему вызывается после установки свойства!

1 Ответ

1 голос
/ 15 февраля 2010

Привязка данных всегда происходит до PreRender. С ASP.Net Page Lifecycle :

Привязка данных
Это событие поднято привязанные к данным элементы управления до PreRender событие, содержащее контроль (или объекта Page) и отмечает начало связывания контроль над данными.

Используйте это событие, чтобы открыть вручную подключения к базе данных, если требуется. (Элементы управления источником данных часто делают в этом нет необходимости.)

Одним из решений вашей проблемы было бы просто обработать событие DataBinding и предварительно связать свой выпадающий список (или даже просто сделать это во время Load), вместо того, чтобы ждать полностью до PreRender. Это обеспечит доступность DropDownList, когда вызов Bind сработает.

Другим решением было бы просто передать вашему элементу управления ссылку на сам источник данных, а не использовать вызов Bind. Тогда он мог бы программно справиться с самой привязкой в ​​нужное время - вы можете загрузить свой DropDownList, а затем получить свой идентификатор для него в течение всего PreRender, получив доступ к источнику данных.

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