【问题标题】:Timer behaving strangely!计时器行为异常!
【发布时间】:2011-01-17 04:16:22
【问题描述】:

我正面临 .aspx 页面的奇怪行为。

我有一个名为 MyDataList 的 DataList。我需要有条件地突出显示 DataList 的行,具体取决于数据中的任意值,例如 Date 字段是否小于 SomeDate

我正在使用 UpdatePanel、ScriptManager 和计时器(都是 AJAX)来刷新 MyDataList。

protected void Timer1_Tick(object sender, EventArgs e)
{                
    MyDataList.DataBind();
}

protected void MyDataList_ItemCreated(object sender, DataListItemEventArgs e)
{
}

问题:

如果我为ItemCreated 事件(EG,MyDataList_ItemCreated)添加一个 empty 事件处理程序,它可以正常工作(如上所示)。

如果我提供代码以突出显示 ItemCreated 事件处理程序中的值(如下所示),则计时器停止计时,并且事件 Timer1_Tick 不再触发。

protected void DataListBgArticles_ItemCreated(object sender, 
    DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || 
        e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Product product = (Product)e.Item.DataItem;
        if (product.SaleDate > DateTime.Now.AddDays(-2))
        {
            e.Item.BackColor = Color.Pink;
        }
    }
}

如何解决此问题,以便计时器继续更新?

【问题讨论】:

    标签: c# asp.net events timer


    【解决方案1】:

    请原谅这个问题,但我认为您应该准确地说明为什么您在 ASP.NET 页面的计时器回调中执行数据绑定操作。

    我能想到的情况并不多(好吧,任何)需要这样的事情。

    计时器回调基本上意味着您将操作置于页面处理管道之外,因此,代码隐式或显式依赖的任何对象完全有可能不再可用。

    因为您正在执行数据绑定,所以您的计时器事件完全有可能正在触发并尝试更新已经推送给用户的网格。

    您似乎正在使用计时器来触发事件以更新数据网格。这样做的问题是您正在更新服务器端的结构,但它并不等同于客户端上的更新。客户端需要刷新自己才能获取此数据(服务器无法实际连接到客户端并刷新)。

    【讨论】:

    • Timer 事件在第二种情况下根本没有触发,因为我已将 BreakPoints 放入 Timer1_Tick 并且看不到任何动作。
    • @Asad Butt - 请参阅我答案的最后一句话(我已经修改过)。您似乎对如何对客户端执行更新有错误的想法。
    猜你喜欢
    • 2022-01-21
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多