2013-06-27 67 views
0

我有一個簡單的日曆頁面,我需要用可用日期列表填充它。我應該在哪裏放置這個查詢來避免多次運行?

我得到的名單如下:

List<DateTime> availableDates = (from d in sb.GetDaysWithAvailableSlotsByLocation(3) 
             select d.Date).ToList<DateTime>(); 

但是,它看起來像日曆呈現之前調用此函數在Page_Load,我需要把這個查詢我的代碼兩次,使其工作:

public partial class BookYourSlot : System.Web.UI.Page 
{ 

    public SlotBooker sb = new SlotBooker(); 
    public List<DateTime> availableDates = new List<DateTime>(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 

     List<DateTime> availableDates = (from d in sb.GetDaysWithAvailableSlotsByLocation(3) 
             select d.Date).ToList<DateTime>(); 
     DateTime firstAvailable = availableDates.Min(); 

     calSlotBooker.VisibleDate = firstAvailable; 



    } 


    protected void calSlotBooker_DayRender(object sender, DayRenderEventArgs e) 
    { 
     List<DateTime> availableDates = (from d in sb.GetDaysWithAvailableSlotsByLocation(3) 
             select d.Date).ToList<DateTime>(); 


     if (!(availableDates.Contains(e.Day.Date)) || (e.Day.Date.DayOfWeek == DayOfWeek.Saturday) || (e.Day.Date.DayOfWeek == DayOfWeek.Sunday)) 
     { 
      e.Cell.BackColor = System.Drawing.Color.Silver; 
      e.Day.IsSelectable = false; 
      e.Cell.ToolTip = "Unavailable"; 
     } 

    } 
} 

這似乎效率很低,因爲它每次單元呈現時都調用availableDates查詢。

我該如何在頁面上執行一次操作,並使日曆控件的DayRender事件可以訪問它?

+0

你能添加一個if語句來檢查一個標誌''''''''嗎? – Jonesopolis

回答

0

存儲列表的頁面屬性:

List<DateTime> AvailableDates {get; set;} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    AvailableDates = (from d in sb.GetDaysWithAvailableSlotsByLocation(3) 
            select d.Date).ToList<DateTime>(); 
    DateTime firstAvailable = AvailableDates.Min(); 
    calSlotBooker.VisibleDate = firstAvailable; 
} 

protected void calSlotBooker_DayRender(object sender, DayRenderEventArgs e) 
{ 
    if (!(AvailableDates.Contains(e.Day.Date)) || (e.Day.Date.DayOfWeek == DayOfWeek.Saturday) || (e.Day.Date.DayOfWeek == DayOfWeek.Sunday)) 
    { 
     e.Cell.BackColor = System.Drawing.Color.Silver; 
     e.Day.IsSelectable = false; 
     e.Cell.ToolTip = "Unavailable"; 
    } 
} 

它看起來像日曆呈現之前調用此函數在Page_Load

我對此表示懷疑。渲染髮生在加載後,所以除非這個特定的控件做了奇怪的事情(比如Init之後的渲染,但是在Load之前)應該先調用Load

我的猜測是你試圖從Render方法,這是行不通的訪問Page_Load一個本地變量,但事件的順序不是因爲..

+0

完全正確!我在頁面加載時重新初始化列表,並且沒有提供頁面屬性日期 – Ben

0

會發生什麼事是,你是隱藏了availableDates的聲明。在Page_Load中,您沒有使用在Page上聲明的字段,而是在方法範圍內本地聲明的字段(在calSlotBooker_DayRender中也是如此)。只需將變量List<DateTime> availableDates的本地聲明更改爲availableDates即可。

public List<DateTime> availableDates; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    availableDates = (from d in sb.GetDaysWithAvailableSlotsByLocation(3) 
            select d.Date).ToList<DateTime>(); 
    DateTime firstAvailable = availableDates.Min(); 
    calSlotBooker.VisibleDate = firstAvailable; 
} 
+1

即使他解決了這個問題,他仍然會在每次回發中執行查詢。 – Servy

+0

@Servy是的,你是對的。 – mipe34

相關問題