Вложенная панель обновления, вызывающая обновление родительской панели обновления

1

Я думаю, что я пробовал каждую комбинацию с панелями обновлений, и я просто не могу заставить это работать. У меня есть панель обновления, например:

<asp:UpdatePanel runat="server" ID="upParent" UpdateMode="Conditional" ChildrenAsTriggers="False">
        <ContentTemplate>

       Some content...
     <div style="width:100%;text-align:center;">
                    <asp:Label ID="lblMainMessage" runat="server"></asp:Label>
                    <asp:UpdateProgress AssociatedUpdatePanelID="upParent" ID="UpdateProgress7" runat="server" DisplayAfter="100" DynamicLayout="True" Visible="True">
                        <ProgressTemplate>
                             <div class="loader ui-widget-overlay">
                                            Loading data, please wait...<br/><img style="border-style:none;" src="../../Images/ajax-loader.gif" alt="loading" />
                             </div>
                        </ProgressTemplate>
                    </asp:UpdateProgress>
        </div>
        <div>
        <asp:UpdatePanel runat="server" ID="upChild" UpdateMode="Conditional" ChildrenAsTriggers="False">
 <ContentTemplate>
                <asp:Timer ID="timerChecklists" runat="server" OnTick="TimerChecklistsTick" Interval="10000"></asp:Timer>
                                               <asp:GridView ID="gvChecklists" runat="server"
                                AutoGenerateColumns="False" >
                                <Columns>
                                        <ItemTemplate>
                                     <asp:TemplateField HeaderText="Ques. Ans. Yes">
                                        <ItemTemplate>
                                            <asp:Label ID="lblQuestionsAnsweredYes" runat="server" ForeColor="Green"
                                                Text='<%# DataBinder.Eval(Container, "DataItem.QuestionYesAnswered") %>' 
                                                ToolTip="Questions answered Yes."></asp:Label>
                                        </ItemTemplate>
                                        <FooterStyle HorizontalAlign="Center" />
                                        <HeaderStyle HorizontalAlign="Center" />
                                        <ItemStyle HorizontalAlign="Center" />
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="Ques. Ans. No">
                                        <ItemTemplate>
                                            <asp:Label ID="lblQuestionsAnsweredNo" runat="server" ForeColor="Red" 
                                                Text='<%# DataBinder.Eval(Container, "DataItem.QuestionNoAnswered") %>' 
                                                ToolTip="Questions answered No."></asp:Label>
                                        </ItemTemplate>
                                        <FooterStyle HorizontalAlign="Center" />
                                        <HeaderStyle HorizontalAlign="Center" />
                                        <ItemStyle HorizontalAlign="Center" />
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="Ques. Ans. N/A">
                                        <ItemTemplate>
                                            <asp:Label ID="lblQuestionsAnsweredNA" runat="server" ForeColor="Gray" 
                                                Text='<%# DataBinder.Eval(Container, "DataItem.QuestionNAAnswered") %>' 
                                                ToolTip="Questions answered N/A."></asp:Label>
                                        </ItemTemplate>
                                        <FooterStyle HorizontalAlign="Center" />
                                        <HeaderStyle HorizontalAlign="Center" />
                                        <ItemStyle HorizontalAlign="Center" />
                                    </asp:TemplateField>
                                </Columns>
                                </asp:GridView>  
                                <asp:Image ID="imgLoader" runat="server" ImageUrl="/Images/ajax-loader.gif" /> 
                                </td>
                                </tr>
                                </table>   
                                </div>          
                                <div style="width:100%;text-align:center;">
                                    <asp:Label ID="lblspChecklists2" runat="server"></asp:Label>
                                </div> 
             </ContentTemplate>
                 <Triggers>
                    <asp:PostBackTrigger ControlID="btnChecklistExcel"/>
                     <asp:AsyncPostBackTrigger ControlID="timerChecklists" />
                </Triggers>
             </asp:UpdatePanel>

То, что я пытаюсь выполнить, - это сортировать ленивую загрузку некоторых данных gridview из-за ее размера. Так что я просто сделал, это обрезать gridview внутри панели обновления. Затем я помещаю таймер в эту панель обновления и устанавливаю его для 10000 (10 секунд) для события тика. Я установил событие OnTick, как показано:

   protected void TimerChecklistsTick(object sender, EventArgs e)
        {
            LoadChecklistsSubPanel();
            timerChecklists.Enabled = false;
            imgLoader.Visible = false;
        }

LoadChecklistsSubPanel просто получает набор данных и присваивает его источнику данных grid-представлений и делает привязку данных. Все это прекрасно работает... однако моя проблема заключается в следующем:

Обратите внимание на родительскую панель обновлений и дочернюю панель обновления. В этом случае у меня есть обновление, связанное с панелью обновления upParent. Но моя проблема заключается в том, что при нажатии на 10 секунд и событии таймера это обновление отображается (фактически, для загрузки всей моей страницы). Я бы подумал, что этого не произойдет, если updatemode является условием, а дети как триггеры являются ложными.

Я также попробовал ChildrenAsTriggers = true, я пытался всегда делать режим панели обновления, я пробовал практически все, но моя проблема все еще сохраняется. Правильно, когда 10 секунд попадает на UpdateProgress (который показывает данные по загрузке, пожалуйста, подождите, пока на дисплее не появится надпись.

Кроме того, мое представление сетки получает привязку правильно, получение ее данных через 10 секунд и т.д. Моя единственная проблема заключается в том, что я не могу понять, почему UpdateProgress появляется и накладывает весь экран, если все, что происходит, это моя вложенная под панель должны обновляться только.

  • 0
    Вы пробовали это: -> msdn.microsoft.com/en-us/library/…
  • 0
    Луи ван Тондер - вы читали мой пост? Внизу я упомянул, что I have also tried ChildrenAsTriggers=true, I've tried to make the update panel mode always, I've tried just about everything but my issue still persists.
Показать ещё 1 комментарий
Теги:
gridview
updatepanel

1 ответ

3
Лучший ответ

Дело в том, что upPanel не обновлен, вы можете проверить это, поставив метку в upPanel со значением = "0" и добавив lblTest.text + = 1 под TimerChecklistsTick в codebehind. вы можете видеть, что значение не имеет никаких изменений.

На самом деле проблема заключается в управлении UpdateProgress, управление UpdateProgress не является мощным инструментом, и ваши ожидания не должны быть очень высокими.

если вы хотите мощный и настраиваемый UpdateProgress, который вы создаете самостоятельно, используя JavaScript:

<script type="text/javascript">
    var postBackElement;
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_initializeRequest(InitializeRequest);
    prm.add_endRequest(EndRequest);
    function InitializeRequest(sender, args) {
        postBackElement = args.get_postBackElement();
        if (prm.get_isInAsyncPostBack()) {
            args.set_cancel(true);
        } else {
            //Put your progress UI here
            //Check Trigger Id if needed.
            //Show an image or Hide another div or ...
        }
    }
    function EndRequest(sender, args) {
    }
</script>


Но решение...

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

    </ContentTemplate>
</asp:UpdatePanel>
//Outside the upParent
<asp:Timer ID="timerChecklists" runat="server" OnTick="TimerChecklistsTick" Interval="10000"></asp:Timer>

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


Обновление Это симулированный код, который работает для меня (ASP.NET 4.5, Chrome 36):

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default2.aspx.vb" Inherits="StackOverflowTests_WebVB.net.Default2" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        <asp:UpdatePanel runat="server" ID="upParent" UpdateMode="Conditional" ChildrenAsTriggers="False">
            <ContentTemplate>
                <asp:Label ID="lbl1" runat="server" Text="0"></asp:Label>
                    <asp:UpdateProgress AssociatedUpdatePanelID="upParent" ID="UpdateProgress7" runat="server" DisplayAfter="100" DynamicLayout="True" Visible="True">
                        <ProgressTemplate>
                            <div class="loader ui-widget-overlay">
                                Loading data, please wait...<br />
                                <img style="border-style: none;" src="../Images/loading.gif" alt="loading" />
                            </div>
                        </ProgressTemplate>
                    </asp:UpdateProgress>
                <asp:UpdatePanel runat="server" ID="upChild" UpdateMode="Conditional" ChildrenAsTriggers="False">
                    <ContentTemplate>
                        <asp:Label ID="lbl2" runat="server" Text="0"></asp:Label>
                    </ContentTemplate>
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="timerChecklists" />
                    </Triggers>
                </asp:UpdatePanel>
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:Timer ID="timerChecklists" runat="server" OnTick="TimerChecklistsTick" Interval="1000"></asp:Timer>
    </div>
    </form>
</body>
</html>

CodeBehind:

Protected Sub TimerChecklistsTick(sender As Object, e As EventArgs)
    lbl1.Text += 1
    lbl2.Text += 1
End Sub

На выходе lbl2 начинает подсчет без полной обратной передачи и без отображения содержимого UpdateProgress на каждом тике. Если вы перемещаете таймер внутри upChild, вы можете увидеть, что содержимое UpdateProgress будет отображаться на evey Tick, но все же lbl1 покажет 0 без каких-либо изменений.

  • 0
    moshtaf chat.stackoverflow.com/rooms/58438/jon
  • 0
    Я вижу, что я забыл переместить таймер за пределы главной панели обновления, вы правы об этом ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню