在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