desplegable - ¿Cómo determinar el rango de fechas completo mostrado por el calendario de ASP.NET?
calendarios asp net (5)
En cuanto a los miembros públicos expuestos por el control de calendario de ASP.NET, no creo que esta información sea algo que solo se puede obtener del control de calendario.
Sin embargo, tiene algunas opciones como "soluciones" a esto, aunque no es agradable ... pero funcionarían.
- Puede calcular manualmente los valores de la primera semana
- Puede gestionar el evento "renderización diurna" para gestionar el enlace de los días individuales y registrar valores mínimos / máximos.
Concedido tampoco es elegante, pero AFAIK es la única opción real
Editar
Después de la discusión en los comentarios, otra opción es una versión modificada de mi segunda opción anterior. Básicamente, la primera vez que se llama a Day Render, obtenga el bloque de datos para los próximos 42 días, luego simplemente puede buscar en la lista el valor del día apropiado para mostrar en futuras llamadas a DayRender, evitando un DB golpe por cada día. Hacer esto es otra solución "no elegante", pero funciona y reduce un poco la carga en el DB, pero introduce cierta sobrecarga en el lado de la aplicación.
Aquí será importante definir propiedades de nivel de página bien estructuradas para contener los elementos durante los eventos vinculantes, pero para garantizar que si un mes cambió, etc., que no se cargó incorrectamente, etc.
El calendario de ASP.NET siempre muestra 6 semanas de fechas en una cuadrícula de 7x6. Mi problema es que el primer día del mes objetivo no aparece necesariamente en la primera fila ... en algunos casos, toda la primera fila muestra las fechas del mes anterior. En otros casos, toda la última fila muestra las fechas de la siguiente fila. ¿Hay alguna manera confiable de consultar el objeto de calendario para determinar el rango de 42 días que se representaría para un mes / año específico?
Por ejemplo, considere junio de 2008 y febrero de 2009:
Supongo que el calendario intenta evitar agrupar todas las fechas del "otro mes" en la parte superior o inferior de la cuadrícula, y por lo tanto coloca el primero del mes objetivo en la segunda fila. Estoy buscando una manera fácil de determinar que el rango mostrado para junio de 2008 es el 25 de mayo y el 5 de julio, por ejemplo.
Escribí un par de métodos para ayudar con esto. Solo pase en 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;
}
He estado investigando esto por mí mismo, y me han enviado a este lugar. Personalmente estoy tentado de ir con la opción dos, porque la alternativa es desordenada. La versión de Ronnie es agradable, pero desafortunadamente no toma en cuenta las culturas con FirstDayOfWeeks diferentes.
Usando Reflector, podemos ver cómo se hace internamente:
...
DateTime visibleDate = this.EffectiveVisibleDate();
DateTime firstDay = this.FirstCalendarDay(visibleDate);
...
private System.Globalization.Calendar threadCalendar =
DateTimeFormatInfo.CurrentInfo.Calendar;
private DateTime EffectiveVisibleDate()
{
DateTime visibleDate = this.VisibleDate;
if (visibleDate.Equals(DateTime.MinValue))
{
visibleDate = this.TodaysDate;
}
if (this.IsMinSupportedYearMonth(visibleDate))
{
return this.minSupportedDate;
}
return this.threadCalendar.AddDays(visibleDate,
-(this.threadCalendar.GetDayOfMonth(visibleDate) - 1));
}
private DateTime FirstCalendarDay(DateTime visibleDate)
{
DateTime date = visibleDate;
if (this.IsMinSupportedYearMonth(date))
{
return date;
}
int num = ((int)
this.threadCalendar.GetDayOfWeek(date)) - this.NumericFirstDayOfWeek();
if (num <= 0)
{
num += 7;
}
return this.threadCalendar.AddDays(date, -num);
}
private int NumericFirstDayOfWeek()
{
if (this.FirstDayOfWeek != FirstDayOfWeek.Default)
{
return (int) this.FirstDayOfWeek;
}
return (int) DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek;
}
private bool IsMinSupportedYearMonth(DateTime date)
{
return this.IsTheSameYearMonth(this.minSupportedDate, date);
}
private bool IsTheSameYearMonth(DateTime date1, DateTime date2)
{
return (((this.threadCalendar.GetEra(date1) ==
this.threadCalendar.GetEra(date2)) &&
(this.threadCalendar.GetYear(date1) ==
this.threadCalendar.GetYear(date2))) &&
(this.threadCalendar.GetMonth(date1) ==
this.threadCalendar.GetMonth(date2)));
}
Tristemente, la funcionalidad ya está allí, ¡no podemos lograrlo!
Mitchel, funcionó perfectamente, gracias. Comenzó con una variable pública bool m_FirstDay = false
en la función day_render
if(m_FirstDay == false)
{
DateTime firstDate;
DateTime lastDate;
firstDate = e.Day.Date;
lastDate = firstDate.AddDays(41);
m_FirstDay = true;
}
Luego tuve el rango de fechas visibles del control de calendario asp.net. Gracias de nuevo.