Creating a Global Calendar Webpart using SPCalendarView

In order to make such a custom Calendar Webpart that will display events from all Calendars on the site, Recurring and non-Recurring Events need to be treated differently. We need to expand the Recurring series using <DaterangesOverLap> in SPQuery.Query. Also , need to initialise SPCalendarItem's ItemId property with either "Edit Menu Table End" or "Select" Field's value to make sure the SPCalendarItem.DisplayFormUrl is correct.

The code demonstrating the usage is below
The SPCalendarItemCollection returned can be assigned to SPCalendarView Datasource as in :

 SPCalendarView calendar = null;
 calendar = new SPCalendarView();
 calendar.Visible = true;
 calendar.EnableViewState = true;
 calendar.ViewType = GetCalendarType(Page.Request["CalendarPeriod"]);
 calendar.DataSource = getDataFromCalendar(somesite, somecalendar);
 calendar.DataBind();

And then rendered in a custom Webpart.

Here's the code that can be used to get all events after specifying SPSite url and Events List Title as parameters :

<Sample-Code>

   private SPCalendarItemCollection getDataFromCalendar(String str_site_collection, String str_calendar)
        {   
            string temp = "";
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite sitex = new SPSite(str_site_collection))
                {
                    SPWeb oWeb = sitex.OpenWeb();
                    SPList oList = oWeb.Lists[str_calendar];
                    SPCalendarItem citem = null;
                    SPListItem citemx = null;

                    foreach (SPListItem item in oList.Items)
                    {
                        if (!(bool.Parse(item["Recurrence"].ToString())))
                        {
                            citem = new SPCalendarItem();
                            citem.ItemID = item["ID"].ToString();
                            try
                            {
                                citem.StartDate = DateTime.Parse(item["EventDate"].ToString());

                            }
                            catch { }

                            try
                            {
                                citem.EndDate = DateTime.Parse(item["EndDate"].ToString());
                            }
                            catch { }
                            temp = item["Title"] as string;
                            temp += " " + item["RecurrenceData"];
                            citem.Title = item["Title"] as string;
                            temp = oList.ParentWebUrl + "/" + oList.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url;
                            citem.DisplayFormUrl = temp.Replace("//", "/");
                            citem.Location = item["Location"] as string;
                            citem.Description = item["Description"] as string;

                            if (bool.Parse(item["Recurrence"].ToString()))
                            {
                                citem.IsRecurrence = true;
                            }
                            else
                            {
                                citem.IsRecurrence = false;
                            }
                            citem.CalendarType = Convert.ToInt32(SPCalendarType.Gregorian);
                            collection.Add(citem);
                        }
                    }
                            SPQuery queryRecurrence = new SPQuery();
                            queryRecurrence.ExpandRecurrence = true;
                            queryRecurrence.Query = "<Where>" +
                                                       "<And>" +
                                                          "<Eq>" +
                                                             "<FieldRef Name='fRecurrence' />" +
                                                             "<Value Type='Recurrence'>1</Value>" +
                                                          "</Eq>" +
                                                          "<DateRangesOverlap>" +
                                                             "<FieldRef Name='EventDate' />" +
                                                             "<FieldRef Name='EndDate' />" +
                                                             "<FieldRef Name='RecurrenceID' />" +
                                                                 "<Value Type='DateTime'>" +
                                                                    "<Month />" +
                                                                 "</Value>" +
                                                          "</DateRangesOverlap>" +
                                                       "</And>" +
                                                    "</Where>" +
                                                    "<ViewFields>" +
                                                       "<FieldRef Name='Title' />" +
                                                       "<FieldRef Name='EventDate' />" +
                                                       "FieldRef Name='EndDate' />" +
                                                       "<FieldRef Name='fRecurrence' />" +
                                                       "<FieldRef Name='Absentee' />" +
                                                    "</ViewFields>";

                            // Look forward from the beginning of the current month  
                  queryRecurrence.CalendarDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                            // Returns all items (including recurrence instances) that  
                            // would appear in the calendar view for the current month  
                            SPListItemCollection calendarItems = oList.GetItems(queryRecurrence);
                            foreach (SPListItem listItem in oList.GetItems(queryRecurrence))
                            {
                                SPCalendarItem calItem = new SPCalendarItem();
                                calItem.ItemID = listItem["Edit Menu Table End"].ToString();
                                calItem.Title = listItem["Title"].ToString();
                                calItem.CalendarType = Convert.ToInt32(SPCalendarType.Gregorian);
                                calItem.StartDate = (DateTime)listItem["Start Time"];
                                if (listItem["End Time"] != null)
                                {
                                    calItem.hasEndDate = true;
                                    calItem.EndDate = (DateTime)listItem["End Time"];
                                }
                                else
                                    calItem.hasEndDate = false;

                                if (listItem["Description"] != null)
                                    calItem.Description = listItem["Description"].ToString();

                                if (listItem["Location"] != null)
                                    calItem.Location = listItem["Location"].ToString();
                                temp = "";
                               
                            temp = oList.ParentWebUrl + "/" + oList.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url;
                              // temp += "?ID=" + listItem["Edit Menu Table End"];
                               calItem.DisplayFormUrl = temp.Replace("//", "/");
                                collection.Add(calItem);
                            }  
                                    }
            }
            );
            return collection;
        }
 </Sample-Code>
 I will post the full code once I have tested it.