2014-07-24 181 views
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秒)作为tick事件。我设置的事件OnTick如图所示:

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

的LoadChecklistsSubPanel只是获取的数据集,并将其分配到网格视图的数据源,并做了数据绑定。这一切工作正常......但我的问题如下:

注意如上所述的父更新面板和子更新面板。在这里我有更新进度关联到更新面板upParent。但我的问题是,当10秒命中和计时器事件被触发时,显示updateprogress(实际上导致我的整个页面基本上加载)。我会认为这不会发生,因为updatemode是条件,孩子作为触发器是错误的。

我也试过ChildrenAsTriggers = true,我试图使更新面板模式总是,我已经尝试了一切,但我的问题仍然存在。当10秒钟点击UpdateProgress(显示加载数据,请等待覆盖显示。)

除此之外,我的网格视图正确绑定,其获取其数据10秒后,等我唯一的问题是我似乎无法理解为什么UpdateProgress显示并覆盖我的整个屏幕,如果发生的只是我的嵌套子面板应该只是更新

+0

你有没有试过这个: - > http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.childrenastriggers(v=vs.110).aspx –

+0

Louis van Tonder - did你看我的帖子?我提到'我也尝试过ChildrenAsTriggers = true,我试图使更新面板模式始终,我已经尝试过几乎所有,但我的问题仍然存在。' – JonH

+0

对不起。不知道我怎么错过了。 –

回答

3

事实是,upPanel未更新,您可以通过将标签值为“0”的upPanel并在代码隐藏的TimerChecklistsTick下添加lblTest.text + = 1 您可以看到该值没有任何更改

实际上问题是UpdateProgress控件,UpdateProgress控件不是一个强大的工具,你的期望不应该太高。

,如果你想要一个强大的和可定制的UpdateProgress您768,16使自己的使用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,铬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> 

代码隐藏:

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 http://chat.stackoverflow.com/rooms/58438/jon – JonH

+0

我发现我忘了在主更新面板之外移动我的计时器,您对此正确... – JonH