2010-04-13 118 views
0

我試圖選擇和取消選擇C#Web日曆控件上的日期。在ASP.NET日曆控件中取消選擇日期

我遇到的問題是我可以選擇或取消選擇日期,除非只有一個選定的日期。

點擊它不會觸發選擇更改事件,所以需要在dayrender事件上做些事情,但我不確定是什麼或如何。

編輯:添加了Pre_Render事件代碼。這似乎現在工作,但它似乎有點不穩定,例如。 選擇日期:OK 選擇日期B:OK 取消他們兩個:OK 選擇日期答:不行的,需要選擇兩次 取消日期:好的 選擇日期C:日期A和C選擇

@John

是的,我知道該控件是.NET 2.0框架的一部分,與C#本身無關。

到目前爲止的代碼:

public static List<DateTime> list = new List<DateTime>(); 

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) 
{ 
    if (e.Day.IsSelected == true) 
    { 

      list.Add(e.Day.Date); 


    } 
    Session["SelectedDates"] = list; 
} 

protected void Calendar1_SelectionChanged(object sender, EventArgs e) 
{ 
    DateTime selection = Calendar1.SelectedDate; 

    if (Session["SelectedDates"] != null) 
    { 
     List<DateTime> newList = (List<DateTime>)Session["SelectedDates"]; 

     foreach (DateTime dt in newList) 
     { 
      Calendar1.SelectedDates.Add(dt); 
     } 

     if (searchdate(selection, newList)) 
     { 
      Calendar1.SelectedDates.Remove(selection); 
     } 


     list.Clear(); 
    } 
} 

public bool searchdate(DateTime date, List<DateTime> dates) 
{ 

    var query = from o in dates 
       where o.Date == date 
       select o; 
     if (query.ToList().Count == 0) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 

    } 


    protected void Calendar1_PreRender(object sender, EventArgs e) 
    { 
     if (Calendar1.SelectedDates.Count == 1) 
     { 
      foreach (DateTime dt in list) 
      { 
       if (searchdate(dt, list) && list.Count == 1) 
       { 


        Calendar1.SelectedDates.Clear(); 

        break; 
       } 
      } 
     } 
    } 
+0

@yomismo:你可能知道這一點,但日曆與C#無關。它是.NET的一部分,而不是C#語言的一部分。 – 2010-04-13 07:32:14

回答

1

我今天尋找一個快速的回答這個問題,但無法找到它,所以我設置爲找到自己的解決方案。即使差不多一年之後,我也會在這裏發佈。 (我希望這是不違反規則?)

注:我的代碼是在VB,不C#

我對這個問題的解決方案是一個布爾變量添加到我的網頁類,像這樣:

昏暗blnCalendarSelectionChanged由於布爾= FALSE

有了這個我能夠跟蹤如果選擇了通過添加以下到您的calendar_SelectionChanged方法開始發生變化:

blnCalendarSelectionChanged =真

只有在日曆SelectionChanged事件觸發後,布爾值纔會成立。當只剩下一個日期取消選擇時,它不會觸發SelectionChanged事件。所以,在日曆上的預渲染我有以下幾點:

Protected Sub calShift_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles calShift.PreRender 
    If blnCalendarSelectionChanged = False Then 
     If Not IsNothing(Session("SelectedDates")) Then 
      Dim newList As List(Of DateTime) = CType(Session("SelectedDates"), List(Of DateTime)) 
      newList.Remove(calShift.SelectedDate) 
      Session("SelectedDates") = newList 
      calShift.SelectedDate = Nothing 
     End If 
    End If 
End Sub 

,因爲它是在之前的DayRender在執行預渲染要做到這一點是很重要的。如果您將此代碼放入DayRender中,那麼將從日曆中選擇日期中刪除日期,但日曆渲染不會隨此更新,這會讓用戶看到日期仍處於選中狀態。

有一個問題,我還沒有找到解決辦法。日曆PreRender在任何控件的回發上執行,因此如果在用戶從另一個控件導致回發時選擇了單個日期,則會導致日曆失去其選擇。在我的情況下,這不是一個問題,但我一直在尋找一種方法來完善它。

這可能不是最好的解決方案,但它適用於我! :)

相關問題