簡體   English   中英

ASP.NET-添加新行后,刷新gridview(DataTable源)(由計時器觸發)

[英]ASP.NET - Make gridview (DataTable source) refresh after new row is added (triggered by timer)

我有一個由計時器每分鍾觸發一次的方法,並且該方法向DataTable添加一行。 頁面上有一個GridView,該表格以DataTable為課程。 每次添加一行時,我都會使用DataBind()-新行顯示在DataTable中(我可以在調試器中看到它),而不顯示在GridView中。

我不會用代碼讓您不知所措,但我會盡力顯示所有相關的內容。

這是計時器和DataTable源的聲明

static DataTable logTable;
System.Timers.Timer timeoutTimer;

這是在Page_Load上發生的事情:

   protected void Page_Load(object sender, System.EventArgs e)
    {
        if (logTable == null)
        {
            logTable = new DataTable();
            logTable.Columns.Add(new DataColumn("Timestamp", typeof(string)));
            logTable.Columns.Add(new DataColumn("Type", typeof(string)));
            logTable.Columns.Add(new DataColumn("Message", typeof(string)));
        }
    }

初始化計時器的方法如下(它每分鍾都會成功觸發):

    StopTime = DateTime.Now.AddMinutes(5);

    timeoutTimer = new System.Timers.Timer(60000);
    timeoutTimer.Interval = 60000;
    timeoutTimer.Elapsed += new ElapsedEventHandler(RunningStatusesTick);
    timeoutTimer.Start();

    GC.KeepAlive(timeoutTimer);

這是tick方法

    private void RunningStatusesTick(object sender, ElapsedEventArgs e){

        try
        {
            string info = GetRawInfo();
            recordResults(info);

        }
        catch (Exception ex)
        {
            // Error thrown?  Catch it and record it.
            recordResults(ex.Message, true);
        }
    }

是將新行添加到DataTable的方法 (並做DataBind()):

    private void recordResults(string ResultText, bool IsError = false)
    {
        DataRow logRow = logTable.NewRow();
        logRow["Timestamp"] = DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
        logRow["Type"] = (IsError ? "ERROR" : "INFO");
        logRow["Message"] = ResultText;
        logTable.Rows.Add(logRow);

        gvLogTable.DataSource = null;
        gvLogTable.DataSource = logTable;
        gvLogTable.DataBind();
    }

最后,這是帶有gridview的aspx標記:

<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView runat="server" id="gvLogTable"></asp:GridView>
    </div>
    </form>
</body>
</html>

我已經嘗試過的事情:

  • 將DataSource = null行放在創建新行的行之前
  • 添加Response.Redirect(由於該方法由計時器觸發,因此無法正常工作)
  • 創建用於數據源的臨時表(設置為靜態表的信息)

非常感謝! :)

在我看來,您的重新綁定是錯誤的。 在recordResults()函數中,最后三行如下:

gvLogTable.DataSource = null;
gvLogTable.DataSource = logRow;
gvLogTable.DataBind(); 

我認為您想綁定到logTable ,而不是logRow

或者,您是否嘗試過使用BindingListCollectionView和關聯的Refresh()方法? 我不確定它是否可以解決您的問題,但是可能值得一看。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM