2010-02-15 2 views
1

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

Список заселяется на 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 пуст и выбор предметов не работает! Как обойти это поведение?

Редактировать 1: Хорошо, а не PreRender, но Init. Но DropDownList1_DataBinding все еще вызывается после настройки свойств!

ответ

1

DataBinding всегда встречается до PreRender. От ASP.Net Page Lifecycle:

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

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

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

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

+0

@womp: Привет, спасибо за советы! Я переписал свой код, так что теперь у меня есть обработчик событий Page_DataBinding, но он сначала называется Page_DataBinding после него setterter и после него DropDownList1_DataBinding, где он заносится из источника данных. Как связать данные с выпадающим списком перед установщиком? – abatishchev