yol 发表于 2015-9-25 10:24:04

SharePoint Event Calendar Recurrence Event

在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 {
   
    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";
      
      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 = "&nbsp;";
                  } 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 = "&nbsp;";
                  } 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 .GetItems ( query );
                                    if ( calendarItems.Count > 0 ) {
                                        for ( int i = 0; i < calendarItems.Count; i++ ) {
                                          DateTime startDate=( DateTime ) calendarItems ["EventDate"];
                                          if ( DateTime.Compare ( new DateTime(startDate.Year,startDate.Month,startDate.Day), day.Date ) <= 0 && DateTime.Compare ( day.Date, ( DateTime ) calendarItems ["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 .GetItems ( query2 );
                                        if ( calendarItems2.Count > 0) {                                          
                                             // date <S0 || date > En 的时候 直接退出 减少循环分 n>0 和 n=0
                                          if ( calendarItems2.Count > 1 ) {
                                                DateTime startDate = ( DateTime ) calendarItems2 ["EventDate"];
                                                DateTime endDate = ( DateTime ) calendarItems2 ["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 ["EventDate"];
                                                DateTime endDate = ( DateTime ) calendarItems2 ["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 ["EventDate"];
                                                if ( DateTime.Compare ( new DateTime ( startDate.Year, startDate.Month, startDate.Day ), day.Date ) <= 0 && DateTime.Compare ( day.Date, ( DateTime ) calendarItems2 ["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 );
      }
    }
}
页: [1]
查看完整版本: SharePoint Event Calendar Recurrence Event