在WinForms(3.5)应用程序中,有一个带有monthCalendar控件的表单。
日历控件的calendarDimension为3列1行。这意味着它目前显示2010年6月,7月和8月。
是否可以将日历显示在2010年4月,5月和6月?我的数据集没有任何未来日期,因此日期选择将针对当前或更早的日期。
答案 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));
}