2010-02-15 114 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