2014-07-24 227 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