DropDownList в ModalPopup / UpdatePanel периодически не запускает SelectedIndexChanged - PullRequest
0 голосов
/ 04 февраля 2010

У меня есть UserControl, который используется внутри UpdatePanel.

UserControl - это довольно простая форма, которая появляется через ModalPopupExtender (который также является частью UserControl). Существует четыре DropDownLists, а также некоторые другие элементы пользовательского интерфейса.

Три из четырех DropDownList имеют AutoPostBack = "true" с событиями SelectedIndexChanged, которые запускаются на сервере и вызывают повторное связывание некоторых других DropDownLists.

Два из трех DDL, которые AutoPostBack работают нормально. Один из них, который я только что добавил, демонстрирует странное поведение.

Допустим, я связал с ним пять элементов: 1, 2, 3, 4, 5. Я установил SelectedIndex на 0, что делает 1 выбранным элементом.

Если я выберу 5, а затем 1 и продолжу переключаться вперед и назад, все будет нормально. Возврат происходит и SelectedIndexChanged срабатывает. Каждый раз.

Если я когда-либо выберу 2 или 4, происходит обратная передача, но SelectedIndexChanged не запускается. Каждый раз.

Если я когда-либо выберу 3, произойдет что-то странное, и иногда значение DDL вернется к 1. Даже если точки останова, кажется, показывают, что это не повторное связывание и не выполняется неожиданный код. Я знаю, что ваш первый инстинкт, вероятно, состоит в том, что я ошибаюсь из-за того, что код перепривязки не запущен, но я буквально часами смотрел на отладчик, пытаясь найти свою ошибку. Много точек останова. Я не понимаю - это действительно не так сложно.

Но, очевидно, я что-то упускаю.

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

HTML (и, между прочим, DropProtocolCycleID является контролем проблемы):

<asp:Panel ID="PanelPopupAssign" runat="server" Style="display:none; cursor: move; width:325px; background-color:Transparent;">
    <BlueUI:Panel runat="server" ID="PanelPatientProtocol" Width="500px" HeaderText="Assign Protocol">
    <table cellspacing="5">
        <tr>
            <td style="width:150px;"></td>
            <td style="width:50px;"></td>
            <td style="width:125px;"></td>
        </tr>
        <tr runat="server" id="TableRowCategory">
            <td align="right">Category:</td>
            <td colspan="2">
                <asp:DropDownList runat="server" ID="DropProtocolCategories" CausesValidation="false" autopostback="true"/>
            </td>
        </tr>                        
        <tr>
            <td align="right">Protocol:</td>
            <td colspan="2">
                <asp:DropDownList ID="DropProtocolID" runat="server" Enabled="false" CausesValidation="false" autopostback="true"/>
                <asp:Label ID="LabelProtocolName_SetDate" runat="server" />
            </td>
        </tr>

        <tr>
            <td colspan="3">

                <table style="margin-left: 120px">

                    <tr>
                        <td align="right">Cycle:</td>
                        <td><asp:DropDownList ID="DropProtocolCycleID" runat="server" autopostback="true" /></td>
                    </tr>

                    <tr>
                        <td align="right">Day:</td>
                        <td>
                            <asp:DropDownList ID="DropProtocolCycleDayID" runat="server" Enabled="false" />                                                 
                        </td>
                    </tr>
                </table>

            </td>
        </tr>               

        <tr>
            <td align="right">Start Date:</td>
            <td colspan="2">
                <table>
                    <tr>
                        <td>
                            <asp:Textbox ID="TextProtocolStartDate" runat="server" Width="65px" 
                                BackColor="Transparent" BorderStyle="None" ReadOnly="True" Font-Size="11px" 
                                ForeColor="#1C4071" Font-Names="Verdana" ValidationGroup="AssignProtocol" />                            
                        </td>
                        <td>
                            <img id="ImageProtocolStartDate" 
                                 alt="Calendar" 
                                 onclick="CalProtocolStartDate.show();" 
                                 class="calendar_button" 
                                 src="../../Images/Icons/btn_calendar.gif" 
                                 width="25" 
                                 height="22" />
                            <asp:RequiredFieldValidator ID="ValRequiredProtocolStartDate" runat="server" display="Dynamic" 
                                ControlToValidate="TextProtocolStartDate" ErrorMessage="Protocol Start Date is required!" 
                                InitialValue="(None)"
                                Enabled="false" ValidationGroup="AssignProtocol">*</asp:RequiredFieldValidator>                               
                        </td>
                    </tr>
                </table>

            </td>
        </tr>
    </table>
    <ComponentArt:Calendar runat="server" 
            id="CalProtocolStartDate" 
            AllowMonthSelection="false"
            AllowMultipleSelection="false"
            AllowWeekSelection="false"
            CalendarCssClass="calendar" 
            TitleCssClass="title" 
            ControlType="Calendar"
            DayCssClass="day" 
            DayHeaderCssClass="dayheader" 
            DayHoverCssClass="dayhover" 
            DayNameFormat="FirstTwoLetters"
            ImagesBaseUrl="~/Images/Calendar/"
            MonthCssClass="month"
            NextImageUrl="cal_nextMonth.gif"
            NextPrevCssClass="nextprev" 
            OtherMonthDayCssClass="othermonthday" 
            PopUp="Custom"
            PopUpExpandControlId="ImageProtocolStartDate"
            PrevImageUrl="cal_prevMonth.gif" 
            SelectedDate=""
            VisibleDate=""
            SelectedDayCssClass="selectedday" 
            SelectMonthCssClass="selector"
            SelectMonthText="¤" 
            SelectWeekCssClass="selector"
            SelectWeekText="»" 
            SwapDuration="300"
            SwapSlide="Linear" 
            AutoPostBackOnSelectionChanged="False" 
            PopUpCollapseDuration="0"
            ClientSideOnSelectionChanged="onCalProtocolStartDateChange"> 
          <ClientEvents>
            <Load EventHandler="Calendar1_onLoad" />
          </ClientEvents>
         </ComponentArt:Calendar>                        
    <br />
    <div style="text-align:center;">
        <asp:Button ID="ButtonSaveProtocol" runat="server" Text="Save" ValidationGroup="AssignProtocol" Enabled="false" />
        <asp:Button ID="ButtonCancel" runat="server" Text="Cancel" CausesValidation="false" />
    </div> 
    <br />
    </BlueUI:Panel>
</asp:Panel> 

<ajaxToolkit:ModalPopupExtender id="ModalPopupExtenderAssignProtocol" runat="server"
popupcontrolid="PanelPopupAssign" popupdraghandlecontrolid="PanelPopupAssign" CancelControlID="ButtonCancel"
targetcontrolid="ButtonAssignProtocol" BackgroundCssClass="modalBackground" RepositionMode="RepositionOnWindowResizeAndScroll" >
</ajaxToolkit:ModalPopupExtender>  

Соответствующий код:

Private Sub DropProtocolCycleID_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DropProtocolCycleID.SelectedIndexChanged
    Me.Show()

    Me.SetupDropProtocolCycleDayID()
End Sub

Public Sub Show()
    Me.ModalPopupExtenderAssignProtocol.Show()
End Sub

Вот код, к которому я привязываю DropProtocolCycleID, если вам интересно. Он срабатывает в событии SelectedIndexChanged DropProtocolID, которое на самом деле работает надежно:

Private Sub SetupDropProtocolCycleID()
    If Me.DropProtocolID.SelectedValue = Constants.NothingSelected Then
        Me.DropProtocolCycleID.Enabled = False
        Exit Sub
    Else
        Me.DropProtocolCycleID.Enabled = True
    End If

    Dim ProtocolID As Integer = Me.DropProtocolID.SelectedValue
    Dim ProtocolCycles As DataTable = ProtocolManager.GenerateCycleTable(ProtocolID)

    Me.DropProtocolCycleID.DataSource = ProtocolCycles
    Me.DropProtocolCycleID.DataTextField = "ProtocolCycleNumber"
    Me.DropProtocolCycleID.DataValueField = "ProtocolCycleID"
    Me.DropProtocolCycleID.DataBind()

    If DropProtocolCycleID.Items.Count > 0 Then
        Me.DropProtocolCycleID.SelectedIndex = 0
    End If
End Sub

ProtocolCycleNumber и ProtocolCycleID - это просто целые числа. Там нет никаких шансов, что может помешать JavaScript.

Ответы [ 3 ]

2 голосов
/ 04 февраля 2010

Это общая проблема, вы можете проверить эту тему: http://forums.asp.net/t/1103779.aspx

Существуют некоторые частично решения, если некоторые из них соответствуют вашим потребностям.

1 голос
/ 30 июня 2016

У меня была такая же проблема, я решил ее, добавив modalpop.show ()

например,

AutoPostback=true в файле дизайна

protected void ddlCars_SelectedIndexChanged(object sender, EventArgs e)
    {
        //Do all your work here 
        mpEditCars.Show();
    }
1 голос
/ 29 марта 2011

Это уродливое решение, но оно работает, и на данный момент мне нужно просто заставить его работать и двигаться дальше.

В двух словах, я добавил невидимую кнопку, а затем заставил событие onchange DropDownList нажимать кнопку с помощью JavaScript при каждом изменении. Это позволяет обойти любую проблему, с которой мы здесь имеем дело.

Я добавил этот JS на страницу:

function IndexChanged() {
    document.getElementById("ctl00$MainContent$AssignProtocolControl$ButtonIndexChanged").click(); 
}

Я изменил DropDownList для вызова этого:

<asp:DropDownList ID="DropProtocolCycleID" runat="server" onchange="IndexChanged();"  />

Я добавил невидимую кнопку:

<asp:Button id="ButtonIndexChanged" Text="Index Changed" style="display: none;" OnClick="DropProtocolCycleID_SelectedIndexChanged" runat="server" />

... И это решило проблему. Пожалуйста, дайте мне знать, если вы найдете лучшее решение.

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

Очевидно, что при этом ViewState запускает задание восстановления состояния и выбирает первое найденное совпадающее значение. Так что я сделал свою ценность немного более сложной, и теперь она отлично работает.

...