Обработка панелей обновления, которые «связаны» вместе в asp.net? - PullRequest
1 голос
/ 05 октября 2009

Так же, как когда вы ищете поддержку на веб-сайте или чем-то еще, вы выбираете Product из первого списка (скажем, Hard Disk), который запускает и заполняет второй список с большим количеством опций (скажем, «Solid State», «» SATA ") и так далее ...

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

Например.

[Раскрывающийся список 1] (содержит A B C D E)

[DropDown 2] (в выпадающем меню 1 есть опции X Y Z) * ​​1009 *

[выпадающий список 3] ...

Если вы выберете A, то в раскрывающемся списке 2 появится XYZ. Вы выбираете Z, и он должен обновить dropdown3, но постбэк также снова вызывает dropdown 1, который заменяет содержимое Dropdown 2 и сбрасывает значение обратно в X.

Я ищу подходящее решение. У меня был один, в котором говорилось, что только переполнить раскрывающийся список 2, если раскрывающийся список 1 изменился, но это означает, что нужно отслеживать, какой выпадающий список 1 был до того, как страница была отправлена ​​обратно.

Каждый раскрывающийся список находится в панели обновления и имеет значение autopostback = true, а каждая панель обновления имеет предыдущий список в своих триггерах.

Ответы [ 5 ]

2 голосов
/ 05 октября 2009

Первый Проверьте, не является ли второй TextBox триггером первой UpdatePanel, и затем удалите его из Коллекции триггеров первой панели обновления.

Вот ключевая концепция:

Если у вас есть два отдельных тега, вы должны поместить триггерный тег на вторую панель обновлений и вставить AsyncPostBackTrigger с controlID первого выпадающего списка, вот простой пример :

<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:Label runat="server" ID="TxtBox1" />
</ContentTemplate>
</asp:UpdatePanel>

<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:Label runat="server" ID="TxtBox2" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="TxtBox1" />
</Triggers>
</asp:UpdatePanel>
0 голосов
/ 05 октября 2009

Может быть, я думаю слишком упрощенно, но почему бы вам не обработать все эти события ... как события? Заполните DDL1 только в начале Page_Load. Заполните DDL2 только на DDL1.SelectedIndexChanged. Заполните DDL3 только на DDL2.SelectedIndexChanged ...

0 голосов
/ 05 октября 2009

Почему бы вам не попробовать AjaxControl Toolkit CascadingDropDown . Кажется, для удовлетворения ваших потребностей.

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

0 голосов
/ 05 октября 2009

Я понял это - я могу использовать ScriptManager1.AsyncPostBackSourceElementID, чтобы проверить, что вызвало триггер, и заставить его обновляться только для обратной передачи и первого выпадающего списка.

0 голосов
/ 05 октября 2009

Я бы просто поместил все выпадающие списки в одну панель обновления. Это может быть не так эффективно, но, вероятно, будет достаточно хорошо и, безусловно, потребует меньше строк кода.

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