Как определить весь диапазон дат, отображенный календарем ASP.NET?

Я не знаю, является ли это оптимальным, но это работает

(df['Date Time'].dt.strftime('%Y-%m-%d') == '2019-01-02').idxmax()
5
задан Seth Petry-Johnson 4 November 2008 в 18:28
поделиться

4 ответа

Рассмотрение общедоступных участников, подвергнутых Календарем ASP.NET, управляет, я не полагаю, что эта информация - что-то, что можно просто получить от календарного управления.

У Вас есть несколько опций как "обходные решения" к этому, хотя, хотя не хороший...., но они работали бы.

  1. Вы могли вручную вычислить первые недельные значения
  2. Можно обработать "дневное событие" рендеринга для обработки привязки отдельных дней, и рекордной минуты / макс. значений.

Предоставленный ни один не изящен, но AFAIK, это - единственная реальная опция

Править

После обсуждения в комментариях другая опция является измененной версией моей второй опции выше. В основном в первый раз Дневной Рендеринг называют, получите блок данных в течение следующих 42 дней, затем можно просто искать список надлежащее дневное значение для отображения на будущих вызовах к DayRender, избегая хита DB в течение каждого дня. Выполнение этого является другим "неизящным" решением, но оно работает, и уменьшает немного нагрузки на DB, но представляет немного служебные на стороне приложения.

Будет важно здесь определить хорошо структурированные свойства уровня страницы для содержания объектов во время событий привязки, но гарантировать это если измененный месяц, и т.д. что это не было загружено неправильно и т.д.

5
ответ дан 18 December 2019 в 13:20
поделиться

Mitchel, Работавший отлично, спасибо. Запущенный с общедоступной переменной bool m_FirstDay = ложь

в функции day_render

if(m_FirstDay == false)
{
    DateTime firstDate;
    DateTime lastDate;

    firstDate = e.Day.Date;
    lastDate = firstDate.AddDays(41);

    m_FirstDay = true;
}

У меня затем был видимый диапазон дат календарного управления asp.net. Еще раз спасибо.

2
ответ дан 18 December 2019 в 13:20
поделиться

Я написал несколько методов, которые помогут с этим. Просто передайте 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;
}
5
ответ дан 18 December 2019 в 13:20
поделиться

I've just been looking into this myself, and got directed to here. I'm personally tempted to go with option two, because the alternative is messy. Ronnie's version is nice, but unfortunately doesn't take into account cultures with different FirstDayOfWeeks.

Using Reflector, we can see how it's done internally:


    ...
    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)));
}

Sadly, the functionality is already there, we just can't get at it!

2
ответ дан 18 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: