我发现在 MonthCalendar 具有自我意识之后,需要操作 MonthCalendar 以“滚动”到所需范围。
MonthCalendar 自我感知之后(在您的程序完成初始化和显示之后,如果您执行MyMonthCalendar.SetSelectionRange(startDate,endDate),您可以通过在当前显示的月份之外设置startDate 来滚动日历。例如,如果我我将 8 个月显示为 2 列乘 4 行,然后MyMonthCalendar.SetSelectionRange(DateTime.Now.AddMonths(+6),DateTime.Now.AddMonths(+6)); 将滚动 MonthCalendar 以在 Month[col1,row[0]] 中显示 DateTime.Now(顶行,右列)。
要注意的是,MonthCalendar.SetSelectionRange() 直到在 MonthCalendar 显示之后才会生效,并且在它退出其初始化线程之后可以“滚动”。这就是其他人描述的Timer方法有效的原因。
我不知道早期的 .NET 版本,但在 .NET 4.6 中,您无需修改 MinDate 或 MaxDate 即可滚动 MonthCalendar。
我建议尝试 MonthCalendar.Layout 事件,而不是使用 Timer 组件和事件。
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));
}