gpt4 book ai didi

c# - ASP.NET - 添加新行后刷新 gridview(DataTable 源)(由计时器触发)

转载 作者:太空宇宙 更新时间:2023-11-03 13:59:52 24 4
gpt4 key购买 nike

我有一个由计时器每分钟触发的方法,该方法向 DataTable 添加一行。页面上有一个 GridView,它有这个 DataTable 作为它的路线。每次添加一行时,我都会使用 DataBind() - 新行显示在 DataTable 中(我可以在调试器中看到它),但不会显示在 GridView 上。

我不会用代码让你不知所措,但我会尽力展示所有相关内容。

下面是计时器和数据表的声明来源:

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(没有用,因为该方法是由计时器触发的)
  • 创建用于数据源的临时表(设置为静态表的信息)

提前致谢! :)

最佳答案

在我看来,您的重新绑定(bind)不正确。在 recordResults() 函数中,您的最后三行如下:

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

我认为您希望绑定(bind)到 logTable,而不是 logRow

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

关于c# - ASP.NET - 添加新行后刷新 gridview(DataTable 源)(由计时器触发),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10984946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com