タイマーによって毎分トリガーされるメソッドがあり、このメソッドは DataTable に行を追加します。この DataTable をコースとして持つページに GridView があります。行が追加されるたびに、I 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();
}
最後に、グリッドビューを含む aspx タグを次に示します。
<body>
<form id="form1" runat="server">
<div>
<asp:GridView runat="server" id="gvLogTable"></asp:GridView>
</div>
</form>
</body>
</html>
私がすでに試したこと:
- 新しい行が作成される行の前に DataSource = null 行を置く
- Response.Redirect の追加 (メソッドがタイマーによってトリガーされたため、機能しませんでした)
- データソースに使用する一時テーブルの作成 (静的テーブルの情報に設定)
よろしくお願いします!:)