|
在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 ["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 [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 ["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 );
}
}
} |
|