Можно установить monthCalendar для отображения текущего месяца и предыдущих 2 месяцев?

в приложении WinForms (3.5) есть форма с monthCalendar управление.

элемент управления calendar имеет calendarDimension из 3 столбцов по 1 строке. Это означает, что в настоящее время он показывает июнь, июль, август 2010 года.

можно ли иметь календарь, чтобы показать апрель, май, июнь 2010 года вместо этого? В моем наборе данных нет будущих дат, поэтому выбор даты будет для текущих или более старых дат.

4 ответов


вы можете использовать следующую строку кода, чтобы установить MonthCalendar ' s MaxDate свойство до текущей даты в событии загрузки формы.

monthCalendar1.MaxDate = DateTime.Now;

Если вы установите MaxDate MonthCalendar в текущую дату, календарь месяца будет показывать только - и, таким образом, разрешить выбор-даты На или ранее текущей даты.


чтобы заставить текущий месяц вправо, я использовал идею Павана, но я добавил таймер сброс MaxDate после открытия элемента управления calendar. Теперь я могу прокрутить в будущее после загрузки элемента управления.

public partial class Form1 : Form
{
   private DateTime _initialDateTime = DateTime.Now;

   public Form1()
   {
     InitializeComponent();
     // remember the default MAX date
     _initialDateTime = monthCalendar1.MaxDate;
     // set max date to NOW to force current month to right side
     monthCalendar1.MaxDate = DateTime.Now;
     // enable a timer to restore initial default date to enable scrolling into the future
     timer1.Start();
   }

   private void timer1_Tick(object sender, EventArgs e)
   {
     Timer timer = sender as Timer;
     if (timer != null)
     {
        // enable scrolling to the future
        monthCalendar1.MaxDate = _initialDateTime;
        // stop the timer...
        timer.Stop();
     }
   }
}

я обнаружил, что манипулирование MonthCalendar для "прокрутки" до нужного диапазона должно происходить после того, как MonthCalendar осознает себя.

после того, как MonthCalendar осознает себя (после того, как ваша программа инициализирует и отображает ее, если вы выполняете MyMonthCalendar.SetSelectionRange(startDate,endDate) вы можете прокрутить календарь, сделав startDate за пределами отображаемых месяцев. Например, если я показываю 8 месяцев как 2 столбца по 4 строки, то MyMonthCalendar.SetSelectionRange(DateTime.Now.AddMonths(+6),DateTime.Now.AddMonths(+6)); будет прокручивать MonthCalendar, чтобы показать значение datetime.Теперь в месяц[col1, строка[0]] (верхняя строка, правый столбец).

подвох в том, что MonthCalendar.SetSelectionRange () не влияет до тех пор, пока не отобразится MonthCalendar и не сможет "прокручивать" после выхода из потока инициализации. Вот почему метод Timer, описанный другими, работает.

Я не знаю о более ранних версиях .NET, но в .NET 4.6 вам не нужно изменять MinDate или MaxDate для прокрутки MonthCalendar.

вместо использования компонента таймера и события я предлагаю попробовать MonthCalendar.Событие макета.

public MyForm()
{
  // Standard design time component initialization
  InitializeComponent();

  // enable the MonthCalendar's Layout event handler
  this.MyMonthCalendar.Layout += MyMonthCalendar_Layout;
}

/// MonthCalendar Layout Event Handler
private void MyMonthCalendar_Layout;(object sender, LayoutEventArgs e)
{
  // disable this event handler because we only need to do it one time
  this.MyMonthCalendar.Layout -= MyMonthCalendar_Layout;

  // initialize the MonthCalendar so its months are aligned like we want them to be
  // To show a calendar with only April, May, and June 2010 do this
  this.MyMonthCalendar.SetSelectionRange(new DateTime(2010, 4, 1), new DateTime(2010, 6, 30));

  // MyMonthCalendar.TodayDate can be any date you want
  // However, MyMonthCalendar.SetDate should be within the SelectionRange or you might scroll the calendar
  this.MyMonthCalendar.SetDate(new DateTime(2010, 6, 30));      
}

enter image description here