0

asp.net を使用して vs2010 でレポート ホストを作成しようとしています。Web 開発を試みたのはこれが初めてなので、非常に明らかな間違いを犯している可能性があります。最終的な目標は、ユーザーにレポートを表示するだけでなく、ユーザーがレポートを閲覧している時間を追跡するホストです。ただし、タイマーが刻むたびにレポートが再描画されるというこの厄介な問題を回避することはできません。

私は UsageAuditor コントロールを持っています。これは、タイマーとラベルを含む単なる更新パネルです。

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
    <asp:Timer runat="server" ID="Timer1" Interval="3000" OnTick="Timer1_Tick"/>
    <asp:Label ID="lblTime" runat="server" Text="Not updated yet"></asp:Label>
</ContentTemplate>

次に、レポート シェルでそのコントロールを使用します。

<body>
<form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server"/>
    <uc1:UsageAuditor ID="ua1" runat="server" />
    <rsweb:reportviewer ID="reportViewer" runat="server"  Font-Names="Verdana" 
        Font-Size="8pt" InteractiveDeviceInfos="(Collection)" ProcessingMode="Remote" 
        WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt" 
        Height="800px" Width="1000px" AsyncRendering="True">            
    </rsweb:reportviewer>
</form>
</body>

そして、タイマーティックは単にラベルを更新します:

protected void Timer1_Tick(object sender, EventArgs e)
{
    lblTime.Text = String.Format("Updated at {0}", DateTime.Now.ToString());
}

そのため、ReportViewer を UpdatePanel の外で定義すると、UpdatePanel は自分自身を再描画すると考えましたが、ページの残りの部分は更新されません。ただし、タイマーが作動するたびに、レポートが再描画されます。レポートでカレンダー コントロールを開いていると閉じてしまうので、非常に面倒です。現在、テスト目的で、タイマーは 3 秒ごとに刻みますが、これは現実的ではありませんが、間隔に関係なく、ユーザーが使用しようとしているときにレポート コントロールが再描画されることは望ましくありません。何か案は?

4

1 に答える 1

0

ReportViewer と UpdatePanel が混在しないという投稿を見つけました。

レポート ビューアーがスクリプトを使用する方法が原因で、現在、UpdatePanel と互換性がありません。私たちはこの問題を認識しており、ReportViewer を UpdatePanel で機能させるために必要な変更を検討しています。しかし、現時点では回避策はありません。このシナリオでは単純なレポートを取得できるように見えるかもしれませんが、ブラウザー ウィンドウが開いたままになっているときにレポート セッションを維持するコードなど、レポート ビューアーのより微妙な動作の一部は依然として機能しません。

水たまりの提案を読んだ後、タイマーを使用して使用情報を更新する必要があると感じた理由について考えてみました。ユーザーがいつページを離れたかをキャプチャできれば、間隔をあけて更新する必要はまったくありませんでした。

この例に続いて、閉じるときにサーバー側の関数を呼び出す Java スクリプトをいくつか追加しました。

<script type="text/javascript">
    //<![CDATA[
    function HandleClose() {
        var QAid = document.getElementById('QAReportRequest');
        PageMethods.SetReportViewEndTime(QAid.value);
    }
    //]]> 
</script>

onunload での HandleClose 呼び出しと非表示の型を本体に追加しました。

<body onunload="HandleClose()">
  <form id="form1" runat="server">
  <input id="QAReportRequest" type="hidden" runat="server"/>
  <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"/>
  <rsweb:reportviewer ID="reportViewer" runat="server" Font-Names="Verdana" 
    Font-Size="8pt" InteractiveDeviceInfos="(Collection)" ProcessingMode="Remote" 
    WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt" 
    Height="800px" Width="1000px">
  </rsweb:reportviewer>          
  </form>
</body>

次に、サーバー側関数を作成しました。

    [WebMethod]
    public static void SetReportViewEndTime(string ID)
    {
        QAReportingManager manager = new QAReportingManager();
        QAReportUsageResponse element = manager.GetQAReportUsage(long.Parse(ID));
        QAReportUsageRequest request = new QAReportUsageRequest
        {
            ID = element.ID,
            userID = element.userID,
            userName = element.userName,
            reportName = element.reportName,
            startTime = element.startTime,
            endTime = DateTime.Now,
            department = "Unknown"
        };
        manager.SaveQAReportUsage(request);
    }
于 2012-11-21T15:56:05.620 に答える