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

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

Я получаю событие Click для первой кнопки, которую я нажимаю, каждый раз, без проблем. После этого я получаю события Click только для одной кнопки (SearchButton) - остальные игнорируются. Я включил код для элемента управления ниже - для краткости я исключил методы обработчика событий щелчка, но они все стандартного разнообразия "void Button_Click(object sender, 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
}

3 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам