2

タイマーによって毎分トリガーされるメソッドがあり、このメソッドは 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 の追加 (メソッドがタイマーによってトリガーされたため、機能しませんでした)
  • データソースに使用する一時テーブルの作成 (静的テーブルの情報に設定)

よろしくお願いします!:)

4

1 に答える 1

1

あなたのリバインドが間違っているようです。recordResults() 関数では、最後の 3 行は次のようになります。

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

logTableではなく、にバインドしたいと思いますlogRow

または、 BindingListCollectionViewと関連するRefresh()メソッドを使用してみましたか? 問題が解決するかどうかはわかりませんが、一見の価値があるかもしれません。

于 2012-06-11T17:53:49.970 に答える