计时器表现得很奇怪!

时间:2010-02-15 22:13:20

标签: c# asp.net events timer

我正面临一个.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)添加事件处理程序,它可以正常工作(如上所示)。

如果我提供代码以突出显示ItemCreated事件处理程序中的值(如下所示),则Timer会停止滴答,并且事件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;
        }
    }
}

如何解决这个问题,以便定时器继续更新?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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