Unanswered SPCalendarView Month Rendering

  • Tuesday, April 07, 2009 9:18 PM
     
     
    Hi I'm noticing some strange behaviour creating a web part with the SPCalendarView
    I have entered in a whole bunch of events but for some reason one of the items does not show up in the calendar.
    It seems to be blanked out. The event spans two months ie from April 30 to May 3. When I go to the week view it shows up.

    Thanks

All Replies

  • Wednesday, April 08, 2009 3:03 PM
     
      Has Code
    Here is my code ....
    I have 9 events on the 29th of April

    using System;
    using System.Runtime.InteropServices;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Serialization;
    using System.Data;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.WebControls;
    using Microsoft.SharePoint.WebPartPages;
    
    namespace CalendarWebPart
    {
        [Guid("e2f258df-cbe5-484e-a22e-82ad8789f2d8")]
        public class Calendar : System.Web.UI.WebControls.WebParts.WebPart
        {
            private SPCalendarView calView; 
    
            public Calendar()
            {
            }
    
            protected override void CreateChildControls()
            {
                base.CreateChildControls();
    
                calView = new SPCalendarView();
                calView.DataSource = getCalendarItems();
    
                calView.ViewType = getCalendarType();
    
                calView.DataBind();
                Controls.Add(calView);
    
            }
    
            private string getCalendarListName()
            {
                return "Calendar";
            }
    
            private SPCalendarItemCollection getCalendarItems()
            {
    
                SPCalendarItemCollection items = new SPCalendarItemCollection();
                SPWeb oWeb = SPContext.Current.Web;
                SPList list = oWeb.Lists[getCalendarListName()];
    
                string displayFormUrl = string.Empty;
    
                foreach (SPForm form in list.Forms)
                if (form.Type == PAGETYPE.PAGE_DISPLAYFORM)
                {
                    displayFormUrl = form.ServerRelativeUrl;
                    break;
                }
    
                DataTable dt = loadCalendar();
    
                foreach (DataRow row in dt.Rows)
                {
                    SPCalendarItem item = new SPCalendarItem();
                    item.ItemID = row["ID"].ToString();
                    item.DisplayFormUrl = displayFormUrl;
                    item.StartDate = DateTime.Parse(row["EventDate"].ToString());
                    item.EndDate = DateTime.Parse(row["EndDate"].ToString());
                    item.hasEndDate = true;
                    item.Title = row["Location"].ToString();
                    item.Location = row["Location"].ToString();
                    item.Description = row["Description"].ToString();
                    if (row["fAllDayEvent"] == System.DBNull.Value)
                    {
                        item.IsAllDayEvent = false;
                    }
                    else
                    {
                        item.IsAllDayEvent = (int.Parse(row["fAllDayEvent"].ToString()) != 0);
                    }
                    
                    item.IsRecurrence = (int.Parse(row["fRecurrence"].ToString()) != 0);
                    item.CalendarType = Convert.ToInt32(SPCalendarType.Gregorian);
                    items.Add(item);
                }
    
                return items;
    
            }
    
    
            public DataTable loadCalendar()
            {
                string calPeriod = "Month";
                DateTime calDate = System.DateTime.Now;
    
                if (Page.Request.QueryString["CalendarPeriod"] != null)
                    calPeriod = Page.Request.QueryString["CalendarPeriod"];
    
                if (Page.Request.QueryString["CalendarDate"] != null)
                    calDate = Convert.ToDateTime(Page.Request.QueryString["CalendarDate"]);
    
    
    
                DataTable dt = new DataTable();
                SPSite oSite = SPContext.Current.Site;
                SPWeb oWeb = oSite.OpenWeb();
                SPList oList = oWeb.Lists[getCalendarListName()];
                SPQuery oQuery = new SPQuery();
                oQuery.CalendarDate = calDate;
                string strWhere = string.Empty;
                    
                strWhere += "<Where>";
                strWhere += "   <DateRangesOverlap>";
                strWhere += "   <FieldRef Name='EventDate'/>";
                strWhere += "   <FieldRef Name='EndDate'/>";
                strWhere += "   <FieldRef Name='RecurrenceID'/>";
                strWhere += "       <Value Type='DateTime'><" + calPeriod + "/></Value>";
                strWhere += "   </DateRangesOverlap>";
                strWhere += "</Where>";
                
                oQuery.Query = strWhere;
                oQuery.ViewFields = getViewFields();
                SPListItemCollection oItems = oList.GetItems(oQuery);
                dt = (oItems.Count > 0) ? oItems.GetDataTable() : null;
                return dt;
    
            }
    
            protected string getViewFields()
            {
                string strViewFields = string.Empty;
    
                strViewFields += "<FieldRef Name='ID' />";
                strViewFields += "<FieldRef Name='Title' />";
                strViewFields += "<FieldRef Name='EventDate' />";
                strViewFields += "<FieldRef Name='EndDate' />";
                strViewFields += "<FieldRef Name='Location' />";
                strViewFields += "<FieldRef Name='Description' />";
                strViewFields += "<FieldRef Name='fRecurrence' />";
                strViewFields += "<FieldRef Name='fAllDayEvent' />";
    
                return strViewFields;
            }
    
            public string getCalendarType()
            {
                if (Page.Request.QueryString["CalendarPeriod"] == null)
                    return string.Empty;
                else
                    return Page.Request.QueryString["CalendarPeriod"].ToString().ToLower();
            }
        }
    }