Проблема события с панелью обновления ASP.net - PullRequest
4 голосов
/ 02 декабря 2009

Я полностью озадачен этим и буду очень признателен за любую помощь.

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

Существует также раскрывающийся список для фильтрации данных. Изменение этого факта инициирует обратную запись, однако ничего не происходит. В раскрывающемся списке возвращается значение по умолчанию, функция OnSelectedIndexChanged никогда не вызывается.

Я установил точки останова в page_prerender и page_preload, и оба они попадают в пост. Точки останова с функцией dropdownGroup_changed никогда не достигаются.

Удаление панели обновления решает проблему, однако она разрывает остальную часть страницы, поэтому я не могу использовать это ни для чего, кроме тестирования.

Я также убедился, что в моей предварительной загрузке / загрузке страницы нет ничего, что сбрасывало бы состояние страницы.

Вот код панели обновления:

<asp:UpdatePanel ID="UpdatePanel6" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional" >    
<ContentTemplate>   
    <ucControlName:ControlName ID="ControlName1" runat="server" />   
</ContentTemplate>
</asp:UpdatePanel>

Вот раскрывающийся список - он расположен внутри пользовательского элемента управления

<asp:DropDownList ID="dropdownGroup" runat="server" Visible="false" AutoPostBack="true" OnSelectedIndexChanged="dropdownGroup_changed"></asp:DropDownList>

Конечно, это видно и связано с точкой в ​​коде, где возникает проблема


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

Похоже, что событие не запускается, потому что значения никогда не меняются в отношении .net. Я проверял управление во время page_init и page_load - значение всегда одинаково.

Тот факт, что кнопка работает, но другие элементы управления не заставляют меня думать, что где-то здесь есть проблема состояния просмотра, но я не могу точно определить, что вызывает ее. Viewstate включен для страницы и панели - не знаю, может ли что-нибудь переопределить / повредить ее.

Я упоминал, что ненавижу обновлять панели со страстью? потому что я ненавижу обновлять панели со страстью.

Ответы [ 3 ]

1 голос
/ 03 декабря 2009

Я предлагаю проверить свойство 'Value' для каждого элемента ListItem в элементе управления DropDownList. Если все они являются одинаковыми , даже если свойства 'Text' отличаются, то 'OnSelectedIndexChanged' вообще не будет запускаться, поскольку ASP.NET не может определить, изменилось ли что-либо (см. этот связанный вопрос для получения дополнительной информации.)

Это была настоящая причина моей проблемы, хотя у меня тоже был «UserControl» с «DropDownList» внутри «UpdatePanel» и «AutoPostBack» срабатывал, как и ожидалось. Я думал, что UpdatePanel был виновником, но это не имело место. Каждый из элементов в моем DropDownList имел одинаковое базовое значение «10», хотя у них были разные значения «Текст». Я изменил их, чтобы у каждого было уникальное значение, которое затем позволяло запускать событие OnSelectedIndexChanged, тем самым устраняя проблему.

1 голос
/ 02 декабря 2009

Два ответа по цене одного:

  1. Вы звоните DataBind() в вашем Page_Load? Если вы сделаете это на PostBack, вы потеряете события. Замените вызов следующим:

    if (!IsPostBack) { 
        DataBind();
    }
    
  2. Если ваш DropDownList находится за пределами вашего UpdatePanel, вам необходимо добавить Trigger следующим образом:

    <asp:UpdatePanel ID="UpdatePanel6" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional" >    
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="dropdownGroup" EventName="SelectedIndexChanged" />
    </Triggers>
    <ContentTemplate>   
        <ucControlName:ControlName ID="ControlName1" runat="server" />   
    </ContentTemplate>
    </asp:UpdatePanel>
    
0 голосов
/ 03 декабря 2009

Вы пробовали UpdatePanel.Update (); после вашей привязки.

...