我有一个由计时器每分钟触发一次的方法,该方法将一行添加到 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);
这是打勾方法:
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 (没有工作,因为该方法是由计时器触发的)
- 创建用于数据源的临时表(设置为静态表的信息)
提前非常感谢!:)