ASP.NET - 在添加新行(由计时器触发)后刷新网格视图(数据表源)

本文关键字:刷新 网格 数据表 视图 计时器 NET 添加 新行 ASP | 更新日期: 2023-09-27 18:36:45

我有一个由计时器每分钟触发一次的方法,此方法向数据表添加一行。 页面上有一个 GridView,它以这个数据表为过程。 每次添加一行时,我 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);

这是刻度方法

    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();
    }

最后,下面是带有网格视图的 aspx 标记:

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

我已经尝试过的事情:

  • 将数据源 = 空行放在创建新行的行之前
  • 添加响应重定向(不起作用,因为该方法是由计时器触发的)
  • 创建用于数据源的临时表(设置为静态表的信息)

提前非常感谢! :)

ASP.NET - 在添加新行(由计时器触发)后刷新网格视图(数据表源)

在我看来,

你的重新绑定是不正确的。 在 recordResults() 函数中,最后三行如下所示:

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

我认为你想绑定logTable,而不是logRow.

或者,您是否尝试过使用 BindingListCollectionView 和关联的 Refresh() 方法? 我不确定它是否能解决你的问题,但可能值得一看。