SharePoint Event Calendar Recurrence Event

it2022-05-08  42

在SPList Item 的Recurrence 属性,例如设置 开始时间 20090201,结束时间 20090228,Recurrence 设置一个星期一次,这下以前的webpart Calendar 就识别不了一个星期一次,默认将日期 20090201 -20090228 所有日子当作 EventDate  ....... 没试过设置还真的被它搞了一头雾水,后来通过SPCAMLEditor tool 的使用,点击list name -》 Current Events 查看了它的SchemaXml 的query 发现它是这样查询的 Code <Query>   <Where>     <DateRangesOverlap>       <FieldRef Name="EventDate" />       <FieldRef Name="EndDate" />       <FieldRef Name="RecurrenceID" />       <Value Type="DateTime">         <Now />       </Value>     </DateRangesOverlap>   </Where>   <OrderBy>     <FieldRef Name="EventDate" />   </OrderBy></Query> 所以那个Calendar 的webpart 就要改了 ~~ 思路 是先查 当天有没有 Recurrence =0的Event,没有的话再查有没有 Recurrence =1的Event, 有就跳出 绑定 ~ Code namespace SharePoint.Panda.Calendar {     [Guid ( "9c7c129b-9442-4d16-a30f-c1d43c35c0e3" )]     public class WebPart1 : System.Web.UI.WebControls.WebParts.WebPart {         public WebPart1 () {         }         System.Web.UI.WebControls.Calendar cal;         string url;         Literal redire = new Literal ();         private string _eventName = "CLP.SRS.Events";         [Personalizable ( PersonalizationScope.Shared ), WebBrowsable ( true ), WebDisplayName ( "Event name" ), WebDescription ( "Input event name" )]         public string eventName {             get { return _eventName; }             set { _eventName = value; }         }         private DateTime _monthStartDate;         public DateTime MonthStartDate {             get { return _monthStartDate; }             set { _monthStartDate = value; }         }         private DateTime _monthEndDate;         public DateTime MonthEndDate {             get { return _monthEndDate; }             set { _monthEndDate = value; }         }         private bool setMonth = false;         protected override void OnInit ( EventArgs e ) {             this.EnsureChildControls ();             this.Load += new EventHandler ( Calendar_Load );             base.OnInit ( e );         }         void Calendar_Load ( object sender, EventArgs e ) {             if ( string.IsNullOrEmpty ( Page.Request.Url.ToString () ) ) {                 return;             }             if ( this.WebPartManager.DisplayMode == WebPartManager.EditDisplayMode ) {                 return;             }         }         protected override void CreateChildControls () {             cal = new System.Web.UI.WebControls.Calendar ();             this.cal.ID = "Calendar";             this.cal.CssClass = "CLPSRS_Calendar";             this.cal.BorderWidth = Unit.Pixel ( 0 );             this.cal.BorderStyle = BorderStyle.None;             this.cal.TitleStyle.CssClass = "Calenader_Header";             this.cal.OtherMonthDayStyle.CssClass = "Calendar_IsOtherMonth";             this.cal.SelectedDayStyle.CssClass = "Calendar_SelectedDay";             this.cal.DayRender += new System.Web.UI.WebControls.DayRenderEventHandler ( OnDayRender );             this.cal.SelectionChanged += new EventHandler ( this.cal_SelectionChanged );             this.Controls.Add ( cal );             this.Controls.Add ( redire );         }         protected void cal_SelectionChanged ( object sender, EventArgs e ) {             System.Web.UI.WebControls.Calendar sendCal = ( System.Web.UI.WebControls.Calendar ) sender;             RenderEventsByDate ( sendCal.SelectedDate );         }         private void RenderEventsByDate ( DateTime selectedDate ) {             if ( !string.IsNullOrEmpty ( eventName ) ) {                 SPSecurity.RunWithElevatedPrivileges ( delegate () {                     using ( SPSite site = new SPSite ( SPContext.Current.Site.ID ) ) {                         try {                             using ( SPWeb web = site.RootWeb ) {                                 try {                                     url = SPContext.Current.Web.Url + "/Lists/" + eventName.Replace ( ".""" ) + "/calendar.aspx?CalendarDate=" +                                        string.Format ( "{0:00}", selectedDate.Day ) + Page.Server.UrlEncode ( "/" ) + string.Format ( "{0:00}", selectedDate.Month ) + Page.Server.UrlEncode ( "/" ) +                                          selectedDate.Year.ToString () + "&CalendarPeriod=month";                                     redire.Text = "<script language='javascript'>window.location='" + url + "'</script>";                                 } catch ( Exception ee ) {                                     web.Dispose ();                                 }                             }                         } catch ( Exception ee ) {                             site.Dispose ();                         }                     }                 } );             }         }         protected void OnDayRender ( object sender, DayRenderEventArgs e ) {             CalendarDay day = ( ( DayRenderEventArgs ) e ).Day;             TableCell cell = ( ( DayRenderEventArgs ) e ).Cell;             cell.CssClass = "Calendar_Day";             if ( !setMonth && day.IsOtherMonth ) {                 MonthStartDate = day.Date.AddDays ( 1 - day.Date.Day ).AddMonths ( 1 );                 MonthEndDate = MonthStartDate.AddMonths ( 1 ).AddDays ( -1 );                 setMonth = true;             }             if ( day.IsToday && !day.IsOtherMonth ) {                 cell.CssClass = "Calendar_IsToday";             } else if ( day.IsOtherMonth ) {                 cell.CssClass = "Calendar_IsOtherMonth";                 if ( DateTime.Compare ( day.Date, MonthStartDate ) < 0 ) {                     DateTime weekend = day.Date.AddDays ( 6 - day.Date.DayOfWeek.GetHashCode () );                     if ( weekend.Month == day.Date.Month ) {                         cell.Text = " ";                     } else {                         cell.ForeColor = System.Drawing.Color.Gray;                     }                 } else if ( DateTime.Compare ( day.Date, MonthEndDate ) > 0 ) {                     DateTime weekStart = day.Date.AddDays ( -day.Date.DayOfWeek.GetHashCode () );                     if ( weekStart.Month == day.Date.Month ) {                         cell.Text = " ";                     } else {                         cell.ForeColor = System.Drawing.Color.Gray;                     }                 }             }             if ( !string.IsNullOrEmpty ( eventName ) ) {                 SPSecurity.RunWithElevatedPrivileges ( delegate () {                     using ( SPSite site = new SPSite ( SPContext.Current.Site.ID ) ) {                         try {                             using ( SPWeb web = site.RootWeb ) {                                 try {                                      //check items with not recurrence                                     SPQuery query = new SPQuery ();                                     query.ExpandRecurrence = false;                                     query.Query = string.Format ( "<OrderBy><FieldRef Name=\"EventDate\" /></OrderBy><Where><And><And><Geq><FieldRef Name='EventDate'/><Value Type='DateTime'>{0}</Value></Geq><Leq><FieldRef Name='EventDate'/><Value Type='DateTime'>{1}</Value></Leq></And><Eq><FieldRef Name='fRecurrence'/><Value Type='Recurrence'>0</Value></Eq></And></Where>", SPUtility.CreateISO8601DateTimeFromSystemDateTime ( day.Date ), SPUtility.CreateISO8601DateTimeFromSystemDateTime ( day.Date ) );                                     SPListItemCollection calendarItems = web.Lists [eventName].GetItems ( query );                                     if ( calendarItems.Count > 0 ) {                                         for ( int i = 0; i < calendarItems.Count; i++ ) {                                             DateTime startDate=( DateTime ) calendarItems [i] ["EventDate"];                                             if ( DateTime.Compare ( new DateTime(startDate.Year,startDate.Month,startDate.Day), day.Date ) <= 0 && DateTime.Compare ( day.Date, ( DateTime ) calendarItems [i] ["EndDate"] ) <= 0 ) {                                                 cell.CssClass = "Calendar_EventDay";                                                 break;                                             }                                         }                                     } else {                                         //check items with recurrence                                         SPQuery query2 = new SPQuery ();                                         query2.ExpandRecurrence = true;                                         query2.Query = string.Format ( "<Where><DateRangesOverlap><FieldRef Name=\"EventDate\" /><FieldRef Name=\"EndDate\" /><FieldRef Name=\"RecurrenceID\" /><Value Type=\"DateTime\"><Now /></Value></DateRangesOverlap></Where><OrderBy><FieldRef Name=\"EventDate\" /></OrderBy>");                                         SPListItemCollection calendarItems2 = web.Lists [eventName].GetItems ( query2 );                                         if ( calendarItems2.Count > 0  ) {                                                                                          // date <S0 || date > En 的时候 直接退出 减少循环  分 n>0 和 n=0                                            if ( calendarItems2.Count > 1 ) {                                                 DateTime startDate = ( DateTime ) calendarItems2 [0] ["EventDate"];                                                 DateTime endDate = ( DateTime ) calendarItems2 [calendarItems2.Count - 1] ["EndDate"];                                                 if ( DateTime.Compare ( new DateTime ( startDate.Year, startDate.Month, startDate.Day ), day.Date ) > 0 || DateTime.Compare ( day.Date, new DateTime ( endDate.Year, endDate.Month, endDate.Day ) ) > 0 ) {                                                     return;                                                 }                                             } else{                                                 DateTime startDate = ( DateTime ) calendarItems2 [0] ["EventDate"];                                                 DateTime endDate = ( DateTime ) calendarItems2 [0] ["EndDate"];                                                 if ( DateTime.Compare ( new DateTime ( startDate.Year, startDate.Month, startDate.Day ), day.Date ) > 0 || DateTime.Compare ( day.Date, new DateTime ( endDate.Year, endDate.Month, endDate.Day ) ) > 0 ) {                                                     return;                                                 }                                             }                                                                                 for ( int i = 0; i < calendarItems2.Count; i++ ) {                                                 DateTime startDate = ( DateTime ) calendarItems2 [i] ["EventDate"];                                                 if ( DateTime.Compare ( new DateTime ( startDate.Year, startDate.Month, startDate.Day ), day.Date ) <= 0 && DateTime.Compare ( day.Date, ( DateTime ) calendarItems2 [i] ["EndDate"] ) <= 0 ) {                                                     cell.CssClass = "Calendar_EventDay";                                                     break;                                                 }                                              }                                                                                         }                                     }                                 } catch ( Exception ee ) {                                     web.Dispose ();                                     string error = ee.ToString ();                                 }                             }                         } catch ( Exception ee ) {                             site.Dispose ();                             string error = ee.ToString ();                         }                     }                 } );             }         }         protected override void Render ( HtmlTextWriter writer ) {             EnsureChildControls ();             redire.RenderControl ( writer );             cal.RenderControl ( writer );         }     } }

转载于:https://www.cnblogs.com/chris_thanks/archive/2009/03/03/1402093.html


最新回复(0)