2010-02-15 80 views
1

我面对一个.aspx页面的奇怪行为。我有DataList MyDataList。我需要有条件地突出显示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事件(例如,MyDataList_ItemCreated),它工作正常(如上所示)。

如果我提供代码以突出显示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; 
     } 
    } 
} 

我该如何解决这个问题,使计时器继续更新?

回答

0

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

有没有很多(好的,任何)的情况下,我能想到哪些将需要这样的事情。

计时器回调基本上意味着你将操作的页面处理管道的外面,正因为如此,它是完全可能的代码或明或暗地依赖于任何对象不再可用。

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

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

+0

因为我在Timer1_Tick中放置了BreakPoints并且看不到任何操作,所以在第二种情况下Timer事件根本没有触发。 – 2010-02-15 22:20:59

+0

@Asad Butt - 查看我答案的最后一句(我修改了它)。看起来你对如何执行客户端更新有错误的想法。 – casperOne 2010-02-15 22:28:18