2015-10-15 53 views
0

我已經爲當前月份和頁面加載時突出顯示了一些事件。但是,如果我將月份更改爲上一個月或下個月,然後再回到當前月份,則在單擊當前月份中的某個日期之前,具有事件的日期不會突出顯示。如果事件與日期相關聯,Asp.net如何突出顯示日期

我查詢數據庫以獲取可見月份的事件如果月份發生變化我再次查詢數據庫。所以在任何時候,我的DataTable都會保存當前可見月份的事件。

我以前從未使用過asp.net日曆控件,所以我不太清楚如何突出顯示月份更改的日期。

這裏是我的代碼:

protected void CalendarDRender(object sender, System.Web.UI.WebControls.DayRenderEventArgs e) 
{ 

     foreach (DataRow dr in table.Rows) 
     { 
      lblError.Text = dr["caldate"].ToString(); 
      if ((dr["caldate"].ToString() != DBNull.Value.ToString())) 
      { 
       DateTime dtEvent = (DateTime)dr["caldate"]; 
       if (dtEvent.Equals(e.Day.Date)) 
       { 
        e.Cell.BackColor = Color.PaleVioletRed; 
       } 
      } 
     } 
} 
+0

哪裏是'table'存儲和當它被填滿?你知道所有的對象都放置在頁面生命週期的末尾嗎?因此,如果您更改月份,則頁面回傳並且您的'DataTable'爲'null'。你每次都填滿它嗎? –

+0

謝謝。當月份發生變化時,我不知道該頁面回覆。如果(!Page.IsPostBack)表被填滿。當我將它從外面移開時,它正在工作。但它造成了另一個問題。由於我將日曆的VisibleDate和SelectedDate設置爲今天的日期,因此如果我從當前月份以外選擇其他日期,則日曆將跳轉到當前月份。 – citm09

+0

@ citmo09:那麼你知道什麼應該留在'if(!IsPostBack)'部分;-) –

回答

0

所有對象都設置在頁面的生命週期結束。因此,如果您更改月份,則頁面會回傳,您的DataTable爲空。你每次都填滿它嗎?

所以加載它總是但是分配VisibleDateSelectedDate只有if(!IsPostBack)

protected void Page_Load(object sender, EventArgs e) 
{ 
    table = LoadTableFromDB(); 
    if (!IsPostBack) 
    { 
     calendar.VisibleDate = DateTime.Today; 
     calendar.SelectedDate = DateTime.Today; 
    } 
} 

您也可以讓你的DayRender與LINQ的幫助更具可讀性:

protected void CalendarDRender(object sender, System.Web.UI.WebControls.DayRenderEventArgs e) 
{ 
    bool dayHasEvent = table.AsEnumerable() 
     .Any(row => row.Field<DateTime>("caldate").Date == e.Day.Date); 
    if (dayHasEvent) 
     e.Cell.BackColor = Color.PaleVioletRed; 
}