Потеря событий Button.Click после первой частичной обратной передачи в UpdatePanel

StackOverflow https://stackoverflow.com/questions/180366

Вопрос

У меня есть страница с единственным экземпляром UserControl, который сам имеет одну панель UpdatePanel. Внутри UpdatePanel есть несколько кнопок управления. Событие Click для этих элементов управления подключено к коду, в событии Init UserControl.

Я получаю событие Click для первой кнопки, которую я нажимаю, каждый раз, без проблем. После этого я получаю события Click только для одной кнопки (SearchButton) - остальные игнорируются. Я включил код для элемента управления ниже - для краткости я исключил методы обработчика событий щелчка, но они все являются стандартными " void Button_Click (отправитель объекта, EventArgs e) " разнообразие. Есть идеи?

<asp:UpdatePanel ID="PickerUpdatePanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Panel ID="Container" runat="server">
            <div>
                <asp:TextBox ID="PickerResults" runat="server" style="margin-right: 3px;" SkinID="Plain" />
                <asp:Image
                    ID="LaunchPopup" runat="server" ImageUrl="~/images/icons/user_manage.png" 
                    ImageAlign="Top" BorderColor="#294254" BorderStyle="Dotted" BorderWidth="1px" 
                    Height="20px" Width="20px" style="cursor: pointer;" />
            </div>
            <asp:Panel ID="PickerPanel" runat="server" DefaultButton="OKButton" CssClass="popupDialog" style="height: 227px; width: 400px; padding: 5px; display: none;">
                <asp:Panel runat="server" id="ContactPickerSearchParams" style="margin-bottom: 3px;" DefaultButton="SearchButton">
                    Search: <asp:TextBox ID="SearchTerms" runat="server" style="margin-right: 3px;" Width="266px" SkinID="Plain" />
                    <asp:Button ID="SearchButton" runat="server" Text="Go" Width="60px" SkinID="Plain" />
                </asp:Panel>
                <asp:ListBox ID="SearchResults" runat="server" Height="150px" Width="100%" SelectionMode="Multiple" style="margin-bottom: 3px;" />
                <asp:Button ID="AddButton" runat="server" Text="Add >>" style="margin-right: 3px;" Width="60px" SkinID="Plain" />
                <asp:TextBox ID="ChosenPeople" runat="server" Width="325px" SkinID="Plain" />
                <div style="float: left;">
                    <asp:Button ID="AddNewContact" runat="server" SkinID="Plain" Width="150px" Text="New Contact" />
                </div>
                <div style="text-align: right;">
                    <asp:Button ID="OKButton" runat="server" Text="Ok" SkinID="Plain" Width="100px" />
                </div>
                <input id="SelectedContacts" runat="server" visible="false" />
            </asp:Panel>
            <ajax:PopupControlExtender ID="PickerPopEx" runat="server" PopupControlID="PickerPanel" TargetControlID="LaunchPopup" Position="Bottom" />
        </asp:Panel>
   </ContentTemplate>
   <Triggers>
        <asp:AsyncPostBackTrigger ControlID="AddButton" EventName="Click" />
        <asp:AsyncPostBackTrigger ControlID="SearchButton" EventName="Click" />
        <asp:AsyncPostBackTrigger ControlID="AddNewContact" EventName="Click" />
    </Triggers>
</asp:UpdatePanel>

public partial class ContactPicker : System.Web.UI.UserControl
{
    protected void Page_Init(object sender, EventArgs e)
    {
        SearchButton.Click += new EventHandler(SearchButton_Click);
        AddButton.Click += new EventHandler(AddButton_Click);
        OKButton.Click += new EventHandler(OKButton_Click);
    }

    // Other code left out
}
Это было полезно?

Решение

Похоже, что добавление UseSubmitBehavior = " false " Чтобы определения кнопок решили мою проблему. Все еще не знаю, почему это первое нажатие кнопки сработало вообще.

Другие советы

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

Если элементы управления добавляются на панель динамически, идентификатор вашей кнопки может отличаться в разных обратных передачах, из-за чего .Net не может связать событие click с правильным обработчиком события в вашем коде.

В моем случае у меня был LinkButton в обработчике событий dgPatients_ItemDataBound , который использовал свойство PostBackUrl .

В тот момент, когда я изменил LinkButton на HyperLink , проблема исчезла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top