Modalpopup Extender в панели обновлений, который контролирует события, не запускающие - PullRequest
1 голос
/ 27 января 2012

Я знаю, что это похоже на многие другие вопросы по SO, но ни один из них, похоже, не относится к этой ситуации и не решает проблему.Проблема в том, что у меня есть один модальный всплывающий элемент управления, в который я передаю другие элементы управления по мере необходимости.Таким образом, когда пользователь нажимает одну кнопку на моем пользовательском интерфейсе, он может получить этот мод с одним набором контента, а затем, нажимая другую кнопку, он получает другой контент.Все работало нормально, пока я не попытался запустить события из контента, который был добавлен в модальное всплывающее окно.Было бы не совсем точным сказать, что я пытался все, чтобы решить эту проблему, но я попытался совсем немного.Я становлюсь убежденным, что это либо невозможно сделать, либо я каким-то образом неправильно его настроил.

Этот код панели обновлений

<input id="dummy" type="button" style="display: none" runat="server" />
<asp:ModalPopupExtender CancelControlID="Close" runat="server" ID="mpeThePopup" TargetControlID="dummy" PopupControlID="pnlModalPopUpPanel" BackgroundCssClass="modalBackground" PopupDragHandleControlID="Title" />
<asp:Panel ID="pnlModalPopUpPanel" runat="server" CssClass="modalPopup" Width="400px" Height="600px">
    <asp:UpdatePanel ID="udpInnerUpdatePanel" runat="Server">
        <ContentTemplate>
            <table id="ContentTableTag" runat="server" cellpadding="0" cellspacing="0" style="width: 100%;
                height: 100%;">
                <tr>
                    <td id="Title" runat="server" style="background-color: rgb(79,82,90); text-align: left;
                        height: 28px; width: 90%; color: White;" nowrap="nowrap">
                        <h4 style="margin: 0px 0px 0px 5px;">
                            <asp:Label ID="LblSectionTitle" runat="server" Text="Modal"></asp:Label>
                        </h4>
                    </td>
                    <td id="Close" runat="server" style="background-color: rgb(79,82,90); text-align: right;
                        height: 28px; width: 10%" nowrap="nowrap">
                        <asp:ImageButton ID="ibClose" runat="server" Style="margin-right: 5px;" ImageUrl="~/WLImages/MLS/button_close.png"
                            ToolTip="Close" />
                    </td>
                </tr>
                <tr>
                    <td id="MainContentHolder" colspan="2" align="left" style="top: 0px; bottom: 100%;
                        vertical-align: top; width: 100%; height: 100%" />
                </tr>
            </table>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Panel>

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

<table id="mainContent" runat="server" visible="false" width="350" height="300">
    <tr>
        <td>
            <asp:label ForeColor="White" runat="server" Text="Exam Date:" />
        </td>
        <td>
            <asp:TextBox ID="txtDate" runat="server" Width="127" ForeColor="Black" 
                readonly="true" ontextchanged="txtDate_TextChanged"/>
            <asp:CalendarExtender ID="CalendarExtender" runat="server" 
                PopupButtonID="ibtnCalendar" OnClientDateSelectionChanged="checkDate" 
                TargetControlID="txtDate" onload="LoadCalendar" />
        </td>
        <td>
            <asp:ImageButton ID="ibtnCalendar" ImageUrl="../imgs/btn_calendar.png" Width="20px" runat="server" />
        </td>
    </tr>
    <tr>
        <td style="vertical-align: top; padding-top:5px">
            <asp:label ForeColor="White" runat="server" Text="Study Days:" />
        </td>
        <td colspan="2" style="vertical-align: top; padding-top:5px">
            <asp:CheckBoxList ID="WeekCheckBox" runat="server" ForeColor="White" 
                onselectedindexchanged="WeekCheckBox_SelectedIndexChanged">
                <asp:ListItem Text="Monday" Value="1" />
                <asp:ListItem Text="Tuesday" Value="2" />
                <asp:ListItem Text="Wednesday" Value="3" />
                <asp:ListItem Text="Thursday" Value="4" />
                <asp:ListItem Text="Friday" Value="5" />
                <asp:ListItem Text="Saturday" Value="6" />
                <asp:ListItem Text="Sunday" Value="7" />
            </asp:CheckBoxList>
        </td>
    </tr>
    <tr>
        <td>
            <asp:label ForeColor="White" runat="server" Text="Study hours per day:" />
        </td>
        <td colspan="2">
            <asp:TextBox ForeColor="Black" ID="tbStudyHours" runat="server" Width="127px" ReadOnly="true" />
        </td>
    </tr>
</table>

Наконец, вот как я прикрепляю элемент управления к модальному.

private void GenerateCalendarPopup(ExamDateSelector eds)
    {
        pnlModalPopUpPanel.BackColor = GUI.Instance.GUIColorElement(GUIElements.color_main);
        LblSectionTitle.Text = "Exam Date";
        pnlModalPopUpPanel.Height = eds.ControlHeight + 40;
        pnlModalPopUpPanel.Width = eds.ControlWidth + 25;
        eds.ShowControl = true;
        MainContentHolder.Controls.Add(eds);
    }

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Не зная остальной части вашего кода.Я собираюсь взять конечность и сказать: конечно, она не сработает: P.

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

Это говорит: зачем вы это делаете?Почему бы просто не использовать 2 разных ModalPopupExtenders?Это зверь сам по себе, даже не прибегая к подобным хитростям.

0 голосов
/ 31 января 2012

Хотя, возможно, это не самый правильный способ справиться с ситуацией, которую я создал для себя, пытаясь скопировать поток и стиль нашего продукта Windows для Интернета, я нашел способ решить проблему событий. не запускается из этого элемента управления, когда отображается в модальном всплывающем окне; хотя окольным путем. Сначала я написал функцию в javascript, функция выполняет большую часть математики, которую я бы поместил в события элемента управления; по сути, он рассчитывает количество учебного времени, оставшегося между настоящим моментом и конкретной датой, с учетом дней недели, которые пользователь выбрал в качестве учебных дней. Затем я передаю информацию, которую я сохраняю, в базу данных с помощью веб-метода.

function calculateStudyTime() {
    //do some math
    …
    PageMethods.SaveModalExamDateChangesToDB(datesString, selectedDate);
}

Я прикрепляю скрипт к каждому из элементов управления, которые я хочу запустить в своем коде. В моем случае я хочу пересчитать время обучения, когда когда-либо один из флажков, обозначающих день недели, будет переключен. Поэтому я прикрепил скрипт к элементам управления ListItem. Я сделал это так, потому что элемент управления ListItem на самом деле не имеет атрибута onclick, доступного через конструктор, но его можно добавить таким образом.

protected void LoadCalendar(object sender, EventArgs e)
{

   …
   foreach (ListItem item in WeekCheckBox.Items)
   {
      item.Attributes.Add("onclick", "calculateStudyTime()");
   }
      …
}

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

Static Dashboard thisPage;
protected void Page_Load(object sender, EventArgs e)
{
   …
   thisref = this;
   …
}

[WebMethod]
[ScriptMethod]
public static void SaveModalExamDateChangesToDB(string days, string date)
{
   thisPage.UserSession.UserCourse.ExamDate = DateTime.Parse(date);
   thisPage.UserSession.UserCourse.StudyDays = days;
   thisPage.UserSession.UserCourse.Save();
}

Как я уже сказал, это не идеально, но работает.

...