2009-02-02 3 views
12

Итак, у меня есть UserControl с каскадом DropDownList s на нем. Выбор из списка 1 включает список 2, который, в свою очередь, включает список 3. После того, как вы сделали выбор во всех трех списках, вы можете перейти на следующую страницу.Обновление элемента управления за пределами UpdatePanel

DropDownList s все внутри UpdatePanel. Но кнопка «Следующая страница» находится за пределами UpdatePanel. Эта кнопка должна быть отключена до тех пор, пока все три списка не будут выделены, а затем снова должны быть включены. Но поскольку кнопка находится за пределами UpdatePanel, она не обновляется, когда я делаю выбор. (Edit: Кнопка «Следующая страница» находится на странице, которая также содержит UserControl.)

Я знаю, что один из способов решения этой проблемы:

var scriptManager = ScriptManager.GetCurrent(this.Page); 
scriptManager.RegisterPostBackControl(dropDownList1); 
scriptManager.RegisterPostBackControl(dropDownList2); 
scriptManager.RegisterPostBackControl(dropDownList3); 

Это обеспечивает постбэк, когда любой список раскрывающегося изменено, чтобы кнопка могла обновляться. Но если я сделаю это, я бы упростил, избавившись от UpdatePanel в первую очередь.

Есть ли другой способ, с помощью какого-то умного JavaScript или что-то еще, что я могу обновить элемент управления вне UpdatePanel без необходимости сдаваться Ajax?

ответ

6

Не могли бы вы добавить панель обновления вокруг «следующей страницы», а затем добавить триггер в панель обновления dropdownlist для запуска панели обновления следующей страницы?

Просто выбрасывая идеи, фактически не попробовав :)

+0

Это самое близкое к тому, что я должен был сделать. Вместо триггера мне просто нужно было вызвать метод на главной странице (листинг this.Page), чтобы правильно установить кнопку «Далее». Мне также пришлось зарегистрироваться в программе RegisterPostBackControl на кнопке Next, чтобы заставить его работать внутри UpdatePanel. –

1

Это в идеале быть сделано в JavaScript, с проверкой проверки на стороне сервера в обработчик события щелчка.

Быстрый пример JQuery:

//assuming the dropdowns all have the css class "cascade" 
$('select.cascade').change(function() { 
    If ($('option:selected',this).length == 3) { 
    $('input[id$=btnNext]').removeAttr('disabled'); 
    } 
}); 
12

Поместите UpdatePanel вокруг следующей кнопки и создать триггер для каждого из выпадающих так, что стреляет асинхронной постбэк. Пример:

<Triggers> 
    <asp:AsyncPostBackTrigger ControlID="dropDownList1" /> 
    <asp:AsyncPostBackTrigger ControlID="dropDownList2" /> 
    <asp:AsyncPostBackTrigger ControlID="dropDownList3" /> 
</Triggers> 
2

вы можете upddate контроль вне панели обновления, поместив его в update_panel2 и говорить update_panel2.update().

Обратите внимание, что для этого необходимо установить UpdateMode из UpdatePanel, чтобы он был установлен в conditional.

+0

верьте этому или нет, это действительно сработало для меня. Спасибо приятель. –

Смежные вопросы