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>

私が達成しようとしているのは、そのサイズのためにいくつかのグリッドビューデータを遅延ロードすることです。だから私が単純にしたことは、更新パネル内にグリッドビューをラップすることです。次に、この更新パネル内にタイマーを配置し、ティック イベント用に 10000 (10 秒) に設定します。次のようにイベント OnTick を設定します。

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

LoadChecklistsSubPanel は単純にデータセットを取得し、それをグリッド ビュー データソースに割り当て、データバインドを行います。これはすべて正常に機能します...ただし、私の問題は次のとおりです。

前述のように、親更新パネルと子更新パネルに注意してください。この中に、更新パネル upParent に関連付けられた更新の進行状況があります。しかし、私の問題は、10秒がヒットしてタイマーイベントが発生したときに、この更新の進行状況が表示されることです(実際には、ページ全体が基本的に読み込まれます)。updatemode が条件であり、トリガーとしての子が false であることを考えると、これは起こらないと思います。

また、ChildrenAsTriggers = trueを試しました。更新パネルモードを常に作成しようとしました。ほぼすべてを試しましたが、問題は解決しません。10 秒が UpdateProgress (データの読み込みを示す) に達した時点で、オーバーレイが表示されるまでお待ちください。

それ以外は、グリッド ビューが正しくバインドされ、10 秒後にデータが取得されるなどです。唯一の問題は、ネストされたサブパネルだけが発生している場合に、UpdateProgress が表示されて画面全体がオーバーレイされる理由を理解できないように見えることです。のみ更新する必要があります。

4

1 に答える 1

3

実際のところ、upPanel は更新されていません。これを確認するには、upPanel に value="0" のラベルを配置し、分離コードの TimerChecklistsTick の下に lblTest.text +=1 を追加します。値が変化していないことがわかります。

実際、問題は 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>

この問題は、子 updatepanels 内に配置されたすべてのコントロールで持続します。基本的な解決策があるかどうかはわかりませんが、私が言うように、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>

分離コード:

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

出力では、lbl2 は完全なポストバックなしでカウントを開始し、Tick ごとに UpdateProgress の内容を表示しません。upChild 内で Timer を移動すると、UpdateProgress の内容が Tick ごとに表示されることがわかりますが、lbl1 は変更されずに 0 を表示します。

于 2014-07-28T19:33:39.290 に答える