Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to determine the entire date range displayed by ASP.NET calendar?

The ASP.NET calendar always displays 6 weeks of dates in a 7x6 grid. My problem is that the first day of the target month does not necessarily appear in the first row... in some cases, the entire first row displays dates from the previous month. In other cases, the entire last row displays dates from the next row. Is there a reliable way to query the calendar object to determine the 42-day range that would be rendered for a specific month/year?

For example, consider June 2008 and Feb 2009:

Notice that the first week contains ONLY dates from prior month http://img371.imageshack.us/img371/2290/datesmq5.png

I assume that the calendar tries to avoid bunching all of the "other month" dates at either the top or bottom of the grid, and therefore puts the first of the target month on the 2nd row. I am looking for an easy way to determine that the displayed range for June 2008 is May 25 - July 5, for instance.

like image 519
Seth Petry-Johnson Avatar asked Nov 04 '08 18:11

Seth Petry-Johnson


2 Answers

Looking at the public members exposed by the ASP.NET Calendar control I do not believe that this information is something that you can just get from the calendar control.

You have a few options as "workarounds" to this though, although not nice....but they would work.

  1. You could manually calculate the first week values
  2. You can handle the "day render" event to handle the binding of the individual days, and record min/max values.

Granted neither is elegant, but AFAIK it is the only real option

Edit

After discussion in the comments, another option is a modified version of my second option above. Basically the first time Day Render is called, get the block of data for the next 42 days, then you can simply search the list for the proper day value to display on future calls to DayRender, avoiding a DB hit for each day. Doing this is another "non-elegant" solution, but it works, and reduces a bit of load on the DB, but introduces some overhead on the application side.

It will be important here to define well structured page level properties to hold the items during the binding events, but to ensure that if a month changed, etc that it wasn't loaded incorrectly etc.

like image 92
Mitchel Sellers Avatar answered Oct 23 '22 13:10

Mitchel Sellers


I wrote a couple of methods to help with this. Just pass in Calendar.VisibleDate:

public static DateTime GetFirstDateOfMonth(DateTime date)
{
    return new DateTime(date.Year, date.Month, 1);
}

public static DateTime GetFirstDisplayedDate(DateTime date)
{
    date = GetFirstDateOfMonth(date);
    return date.DayOfWeek == DayOfWeek.Sunday ? date.AddDays(-7) : date.AddDays((int)date.DayOfWeek * -1);
}

public static List<DateTime> GetDisplayedDates(DateTime date)
{
    date = GetFirstDisplayedDate(date);

    List<DateTime> dates = new List<DateTime>();
    for (int i = 0; i < 42; i++)
    {
        dates.Add(date.AddDays(i));
    }

    return dates;
}
like image 30
Ronnie Overby Avatar answered Oct 23 '22 15:10

Ronnie Overby