2017-12-19 13 views
0

ASP.NETページに、コードから更新できるようにするために必要なListView要素があります。私の理解では、MicrosoftはUpdatePanelsとDataBindungを用意しています。リストビューのコンテンツをコード内のプロパティメンバーに「バインド」し、プロパティが変更されたときに自動的にブラウザのビューを更新することを約束します。 しかし、GetStuff()経由のアイテムの最初の読み込みのみが機能します。デバッグコンソールでは、タイマーがListに新しい要素を追加し続けるのを見ることができますが、ブラウザのビューには到着しません。私は何が欠けていますか? Default.aspxのでASP.NET:CodeBehindからリストビューを更新します

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="myLittleProject.Default" %> 
<%@ Register Src="~/StuffListItemControl.ascx" TagPrefix="stf" TagName="StuffListItem" %> 
<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
     <!-- some irrelevant stuff --> 
    </head> 
    <bod> 
     <form id="form1" runat="server"> 
      <asp:ScriptManager ID="ScriptManager" runat="server"></asp:ScriptManager> 

      <!-- some irrelevant stuff --> 

      <asp:UpdatePanel runat="server" ID="StuffUpdatePanel" UpdateMode="Always"> 
       <ContentTemplate> 
        <ul> 
         <asp:ListView ID="StuffBoundContent" runat="server"> 
          <ItemTemplate> 
           <stf:StuffListItem runat="server" ID="StuffListItemControl" /> 
          </ItemTemplate> 
         </asp:ListView> 
        </ul> 
       </ContentTemplate> 
      </asp:UpdatePanel> 

      <!-- some more irrelevant stuff --> 
     </form> 
    </body> 
</html> 

そしてDefault.aspx.csで:

using System.Collections.Generic; 
namespace myLittleProject 
{ 
    public partial class Default : System.Web.UI.Page 
    { 
     public static List<Stuff> StuffContent; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      StuffContent = Stuff.GetStuff(); // returns a list of three elements from the database 

      System.Timers.Timer t = new System.Timers.Timer(); 
      t.Interval = 3000; 
      t.Elapsed += T_Tick; 
      t.Enabled = true; 
     } 

     protected void Page_PreRender(object sender, EventArgs e) 
     { 
      StuffBoundContent.DataSource = StuffContent; 
      StuffBoundContent.DataBind(); 
     } 

     private void T_Tick(object sender, EventArgs e) 
     { 
      StuffContent.Add(new Stuff(StuffContent.Count + 1, DateTime.Now.ToShortDateString(), new string[] { "what", "ever" })); 
      System.Diagnostics.Debug.WriteLine("[TIMER EVENT] StuffContent.Count = " + StuffContent.Count.ToString()); 
     } 
    } 
} 

答えて

1

System.Timers.Timerは、Webページでは動作しません。 tがページの後に配置される理由は、クライアントに送信されます。実際に使用する場合は、タイマーコントロールを使用します。

<asp:Timer ID="Timer1" runat="server" OnTick="Timer1_Tick"></asp:Timer> 

Timer1_Tickでリストビューを更新することができます。

protected void Timer1_Tick(object sender, EventArgs e) 
{ 
    //update the ListView 
} 

タイマがトリガされたときに完全なポストバックを行わない場合は、タイマーコントロールをUPdatePanelの内部に配置します。

忘れてはならないのは、UpdatePanelを使用しても、完全なページライフサイクルがトリガーされることです。したがって、ページロード(およびPrerRender)で使用する他のすべてのコードは、ユーザーにListView更新のみが表示されている場合でも実行されます。数秒ごとに更新パネルが起動されると、サーバーに大きな負荷がかかる可能性があります。おそらくAjaxを使うのがよいでしょう。

PS Page_PreRenderを使用してデータをバインドする必要はありません。

+0

私はこれが問題であるとは思わなかったでしょう!私のタイマーは期待どおりに確実にメッセージをデバッグコンソールに表示したが、何も起こっていなかった。 ありがとう、特にページライフサイクルのヒントのために! – draconigen

関連する問題