可以设置monthCalendar显示当前月份和前2个月吗?

时间:2010-06-09 16:25:02

标签: c# winforms .net-3.5 monthcalendar

在WinForms(3.5)应用程序中,有一个带有monthCalendar控件的表单。

日历控件的calendarDimension为3列1行。这意味着它目前显示2010年6月,7月和8月。

是否可以将日历显示在2010年4月,5月和6月?我的数据集没有任何未来日期,因此日期选择将针对当前或更早的日期。

4 个答案:

答案 0 :(得分:7)

您可以使用以下代码行在表单的加载事件中将MonthCalendar的{​​{1}}属性设置为当前日期。

MaxDate

答案 1 :(得分:2)

如果您将MonthCalendar的MaxDate设置为当前日期,则月份日历将仅显示 - 因此允许选择 - 当前日期或早于当前日期的日期。

答案 2 :(得分:2)

为了强制当前月份,我使用了Pavan的想法,但我添加了一个计时器 在日历控件上打开后重置MaxDate。现在我可以在加载控件后滚动到将来。

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

答案 3 :(得分:1)

我发现在MonthCalendar具有自我意识之后,需要进行操作以将MonthCalendar“滚动”到所需范围。

MonthCalendar具有自我意识之后(在程序完成初始化和显示之后,如果执行MyMonthCalendar.SetSelectionRange(startDate,endDate),则可以通过将startDate置于当前显示的月份之外来滚动日历。例如,如果我将8个月显示为2列乘4行,则MyMonthCalendar.SetSelectionRange(DateTime.Now.AddMonths(+6),DateTime.Now.AddMonths(+6));将滚动MonthCalendar以显示DateTime。现在在Month [col 1,row [0]]中(第一行,右列)。

要注意的是,在显示MonthCalendar之后,MonthCalendar.SetSelectionRange()不会生效,并且在退出初始化线程后可以“滚动”。这就是为什么其他人描述的Timer方法起作用的原因。

我不知道早期的.NET版本,但是在.NET 4.6中,您无需修改​​MinDate或MaxDate即可滚动MonthCalendar。

建议不要尝试使用Timer组件和事件,而建议尝试MonthCalendar.Layout事件。

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