0

シンプルなカレンダー ページがあり、利用可能な日付のリストを入力する必要があります。

次のようにリストを取得します。

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

ただし、この関数が Page_load で呼び出される前にカレンダーがレンダリングされるように見えます。これを機能させるには、このクエリをコードに 2 回入れる必要があるためです。

    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 イベントにアクセスできるようにするにはどうすればよいですか?

4

2 に答える 2

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;
} 
于 2013-06-27T15:18:56.977 に答える