Панель ASP.NET не обновляется при удалении последнего элемента - PullRequest
1 голос
/ 20 июня 2011

Я уверен, что мне здесь не хватает чего-то действительно очевидного, но я просто не вижу этого.

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

Удаление - это процесс, состоящий из двух частей: сначала я выскакиваю модальное диалоговое окно из codebehind для запроса подтверждения, например так:

/// <summary>
/// Manager delete command
/// </summary>
protected void dlKeywordsManager_DeleteCommand(object source, DataListCommandEventArgs e)
{
    //Get the subject ID
    int keywordID = (int)dlKeywordsManager.DataKeys[e.Item.ItemIndex];

    //Remember the keyword ID on the modal popup
    hfKeywordID.Value = keywordID.ToString();
    btnConfirmationPopupOK.CommandArgument = "Delete";

    lblConfirmationPopupMessage.Text = "キーワード「" + e.CommandArgument.ToString() + "」を本当に削除しますか?";

    mpConfirmationPopup.Show();
    dlKeywordsManager.DataBind();
    udpKeywordsManager.Update();
}

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

Когда пользователь нажимает кнопку OK во всплывающем окне, я идудля выполнения:

protected void btnConfirmationPopupOK_Click(object source, EventArgs e)
{
        int keywordID = int.Parse(hfKeywordID.Value);
        KeywordBLLOperation operationResult;
        switch (((Button)source).CommandArgument)
        {
            case "Delete":
                operationResult = keywordsAPI.DeleteKeyword(keywordID);
                switch (operationResult.Result)
                {
                    case KeywordBLLOperationResult.Deleted:
                        lnlNotificationsPopupMessage.Text = "キーワード「" + operationResult.KeywordName + "」を削除しました。";
                        break;
                    case KeywordBLLOperationResult.Failed:
                        lnlNotificationsPopupMessage.Text = "キーワード「" + operationResult.KeywordName + "」の削除に失敗しました。アドミニストレーターにお伝えください。";
                        break;
                }
                break;
        }
        mpNotificationPopup.Show();
        dlKeywordsManager.DataBind();
        udpKeywordsManager.Update();
}

Для краткости я удалил несколько несущественных строк.

А вот разметка aspx для кода:

    <asp:UpdatePanel ID="udpKeywordsManager" runat="server" Visible="true" UpdateMode="Conditional" >

<ContentTemplate>

    <div class="keywordsManagerHeader">

        <%--DISPLAY STATISTICS--%>
        <asp:CheckBox ID="chkShowUsageStatistics" runat="server" Text="参照回数を表示する" AutoPostBack="true" OnCheckedChanged="chkShowUsageStatistics_CheckedChanged" CssClass="keywordsManagerCheckBoxes" TextAlign="Left" />

        <%--DISPLAY ORDER--%>
        <span class="keywordsManagerLabel" >並べ替え</span>
        <asp:DropDownList ID="ddlKeywordsOrder" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlKeywordsOrder_SelectedIndexChanged" >
            <asp:ListItem Text="なし" Value="None" />
            <asp:ListItem Text="科目名" Value="Name" />
            <asp:ListItem Text="参照回数" Value="Frequency" />
        </asp:DropDownList>
        <asp:RadioButtonList ID="rdlOrder" runat="server" AutoPostBack="true" RepeatLayout="Flow" RepeatDirection="Horizontal" CssClass="keywordsManagerRadioButtons" Enabled="false" >
            <asp:ListItem Text="昇順" Value="Ascending" />
            <asp:ListItem Text="降順" Value="Descending" />
        </asp:RadioButtonList>

        <%--UPDATE PROGRESS INDICATOR--%>
        <span style="position: absolute;">
            <asp:UpdateProgress ID="udpSubjectsManagerUpdateProgress" AssociatedUpdatePanelID="udpKeywordsManager" runat="server" DisplayAfter="500" DynamicLayout="False" >
                <ProgressTemplate>
                    <img class="updateProgressIndicator" src="~/Library_Images/Animations/ajax_loading.gif" alt="" runat="server" />
                </ProgressTemplate>
            </asp:UpdateProgress>
        </span>

    </div>

    <div class="keywordsManagerContainer">

        <%--SUBJECTS DATALIST--%>
        <asp:DataList ID="dlKeywordsManager" runat="server" DataKeyField="Keyword_ID" DataSourceID="dsBookKeywords" RepeatDirection="Horizontal" 
            OnItemDataBound="dlKeywordsManager_ItemDataBound" OnDeleteCommand="dlKeywordsManager_DeleteCommand" OnUpdateCommand="dlKeywordsManager_UpdateCommand" OnPreRender="dlKeywordsManager_PreRender" >

            <ItemTemplate>

                <span id="KeywordInfo" class="keywordsManagerItem" runat="server">
                    <asp:Label ID="Subject_NameLabel" runat="server" Text='<%# Eval("Keyword_Name") %>' />
                    <asp:Label ID="Subject_FrequencyLabel" runat="server" Text='<%#  " (" + Eval("Frequency") + ")" %>' Visible="false" />
                </span>

                <%--HOVER MENU PANEL--%>
                <asp:Panel ID="pnlKeywordContextMenu" runat="server" CssClass="keywordsManagerPopupMenuOverall">

                    <div class="keywordsManagerPopupMenuRow" >
                        <span class="keywordsManagerLabel">科目「</span>
                        <asp:Label ID="pnlSubjectContextMenu_Subject_NameLabel" runat="server" Text='<%# Eval("Keyword_Name") %>' />
                        <span class="keywordsManagerLabel">」を参照している文書数:</span>
                        <asp:Label ID="pnlSubjectContextMenu_Subject_FrequencyLabel" runat="server" Text='<%# Eval("Frequency") %>' />
                    </div>

                    <div ID="Book_ISO_NumbersList" class="keywordsManagerBookISONumbersList" runat="server" visible='<%# (string.IsNullOrEmpty(Eval("Book_ISO_Numbers").ToString())) ? bool.Parse("false") : bool.Parse("true") %>' >
                        <span class="keywordsManagerLabel">文書:</span>
                        <asp:Label ID="Book_ISO_Numbers_Label" runat="server" Text='<%# Eval("Book_ISO_Numbers") %>' />
                    </div>

                    <div class="keywordsManagerPopupMenuSeparator"></div>

                    <div class="keywordsManagerPopupMenuRow" >
                        <asp:TextBox ID="Keyword_NameTextBox" runat="server" Text='<%# Eval("Keyword_Name") %>' CssClass="keywordsManagerPopupMenuInput" />
                        <asp:Button ID="btnEdit" runat="server" Text="編集" CssClass="buttonShortBottom" CommandName="Update" CausesValidation="true" CommandArgument='<%# Eval("Keyword_Name") %>' />
                        <asp:Button ID="btnDelete" runat="server" Text="削除" CssClass="buttonShort" CommandName="Delete" CommandArgument='<%# Eval("Keyword_Name") %>' />
                    </div>

                </asp:Panel>

                <%--HOVER MENU EXTENDER--%>
                <asp:HoverMenuExtender ID="hmeKeywordContextMenu" runat="server" TargetControlID="KeywordInfo" PopupControlID="pnlKeywordContextMenu" PopDelay="100" PopupPosition="Right" HoverDelay="100" />

            </ItemTemplate>

            <SeparatorTemplate>

                <span class="keywordsManagerItemSeparator"></span>

            </SeparatorTemplate>

        </asp:DataList>

    </div>

    <%--MODAL POPUPS--%>
    <%--CONFIRMATION POPUP--%>
    <asp:Panel ID="pnlConfirmationsPopup" runat="server" CssClass="modalNotificationOverall" >
            <div class="modalNotificationRow">
                <asp:Label ID="lblConfirmationPopupMessage" runat="server" Text="" />
            </div>
            <div class="modalNotificationRow">
                <asp:Button ID="btnConfirmationPopupOK" runat="server" Text="はい" CssClass="buttonMediumLong" OnClick="btnConfirmationPopupOK_Click" />
                <asp:Button ID="btnConfirmationPopupCancel" runat="server" Text="いいえ" CssClass="buttonMediumLong" />
            </div>
        <asp:HiddenField ID="hfKeywordID" runat="server" />
        <asp:HiddenField ID="hfNewKeywordName" runat="server" />
        </asp:Panel>
    <%--NOTIFICATION POPUP--%>
    <asp:Panel ID="pnlNotificationsPopup" runat="server" CssClass="modalNotificationOverall" >
            <div class="modalNotificationRow">
                <asp:Label ID="lnlNotificationsPopupMessage" runat="server" Text="" />
            </div>
            <div class="modalNotificationRow">
                <asp:Button ID="btnNotificationsPopupOK" runat="server" Text="OK" CssClass="buttonMediumLong" />
            </div>
        </asp:Panel>
    <%--MODAL POPUP ANCHORS AND MODULES--%>
    <%--DELETE CONFIRMATION--%>
    <asp:Label ID="lblConfirmationPopupAnchor" runat="server" Text="" />
    <asp:ModalPopupExtender ID="mpConfirmationPopup" runat="server" TargetControlID="lblConfirmationPopupAnchor" PopupControlID="pnlConfirmationsPopup" BackgroundCssClass="modalNotificationBackground" CancelControlID="btnConfirmationPopupCancel" />
    <asp:Label ID="lblNotificationPopupAnchor" runat="server" Text="" />
    <asp:ModalPopupExtender ID="mpNotificationPopup" runat="server" TargetControlID="lblNotificationPopupAnchor" PopupControlID="pnlNotificationsPopup" BackgroundCssClass="modalNotificationBackground" CancelControlID="btnNotificationsPopupOK" />

</ContentTemplate>

Там много разметки.Структура выглядит следующим образом: у меня есть раздел заголовка с раскрывающимся списком, список радиобуттон и т. Д., Который позволяет мне указать сортировку данных (данные поступают из источника данных объекта)

У меня есть список данных с элементами.У каждого элемента есть hovermenuextender, в котором у меня есть кнопки для запуска команд редактирования и удаления.

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

Моя проблема в том, что это работает нормально, пока элемент, который я удаляю, не является последним элементом, оставшимся в Datalist.Если это последний элемент, который не отображается в последнем всплывающем окне (mpNotificationPopup).

Код выполняется полностью, поэтому отсутствие элементов должно привести к тому, что панель upadte (udpKeywordsManager) не будет обновляться?

Любая помощь в том, как получить список данных для обновления в этом случае, будет очень кстати.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Отвечая на мой собственный вопрос. После мучительной перестройки всего этого я понял, что я устанавливал видимость панели обновления в false в событии OnPreRender списка данных, когда не осталось никаких элементов. Это в основном отключило панель обновления на полпути через обновление, поэтому страница не обновлялась, когда последний элемент был удален.

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

1 голос
/ 20 июня 2011

Вы должны также показать нам разметку aspx, но, возможно, вы использовали ModalPopupExtender внутри вашей UpdatePanel.Попробуйте переместить div / Panel, который имеет идентификатор свойства PopupControlID ModalPopupExtender, за пределы панели UpdatePanel.

Вам нужно только вложить UpdatePanel внутри Popup-Control, а не вокруг него.

Надеюсь, что следующее делает это понятнее:

Вместо того, чтобы делать это следующим образом:

<UpdatePanel> 
   <DataList> 
   </DataList> 
   <ModalPopupExtender> 
   </ModalPopupExtender> 
</UpdatePanel> 

Вы должны сделать это следующим образом:

<ModalPopupExtender> 
   <UpdatePanel> 
      <DataList> 
      </DataList> 
   </UpdatePanel>
<ModalPopupExtender> 
...