首页 > 编程笔记 > C#笔记 阅读:18

C# MonthCalendar月历控件用法详解(附带实例)

MonthCalendar 可以翻译为月历,图标如下:


我们可以利用这个控件选择日期区间,然后执行更多与日期区间有关的操作,例如使用这个功能设计旅馆或民宿的订阅网站。程序执行时,这个控件直接呈现月历,今天的日期会有外框,可以用鼠标拖曳选择日期区间,如下所示。

C# MonthCalendar的粗体属性设定日期

1) AnnuallyBoldedDates属性

MonthCalendar 在显示日期时,除了今天的日期有外框标记,其他日期没有特别标记,这个属性可以让我们特别标记每年的重要日期并用粗体显示。

例如,可以标记重要人物的生日、公司创立日期、国家庆典等。可以使用 DateTime 集合编辑器标记,也可以使用程序标记。属性窗口 AnnuallyBoldedDates 最右边有图标,单击其可以启动 DateTime 集合编辑器,如下所示。


上述选择后,可以看到未来每年的同一日期都用粗体显示。

如果要在程序设计时标记特别日期,可以使用 AddAnnuallyBoldedDate() 方法,完成标记后要使用 UpdateBoldedDates() 更新日历设定,下列是使用程序设定每年 1 月 1 日是粗体的语句:
monthCalendar1.AddAnnuallyBoldedDate(new DateTime(2023, 1, 1));
monthCalendar1.UpdateBoldedDates(n);   // 更新设定

2) MonthlyBoldedDates属性

这个属性和 AnnuallyBoldedDates 属性类似,不过其用于设定每个月重要日期并用粗体显示。读者可以使用属性窗口的 MonthlyBoldedDates 属性来设定,也可以用程序来设定,下列是使用程序设定每个月 10 日是粗体的语句:
monthCalendar1.AddMonthlyBoldedDate(new DateTime(2023, 1, 10));
monthCalendar1.UpdateBoldedDates(n);   // 更新设定

3) BoldedDates属性

这个属性和 AnnuallyBoldedDates 属性类似,不过这是应用在设定重要日期以粗体显示。读者可以使用属性窗口的 BoldedDates 属性设定,也可以用程序设定,下列是使用程序设定 2023 年 1 月 15 日用粗体显示的语句:
monthCalendar1.AddBoldedDate(new DateTime(2023, 1, 15));
monthCalendar1.UpdateBoldedDates();   // 更新设定

【实例 1】设定每年 1 月 1 日、每个月 10 日、1 月 15 日用粗体显示日期。
namespace ch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            monthCalendar1.AddAnnuallyBoldedDate(new DateTime(2023, 1, 1));
            monthCalendar1.AddMonthlyBoldedDate(new DateTime(2023, 1, 10));
            monthCalendar1.AddBoldedDate(new DateTime(2023, 1, 15));
            monthCalendar1.UpdateBoldedDates();
        }
    }
}
下面是两个不同年份的显示结果:

C# MaxDate和MinDate属性

这两个属性可以选取日期区间,例如,设计民宿网站,可以要求消费者订购入住日期必须在从今天算起的 3 天(MinDate)到 90 天(MaxDate)之间,详情可以参考下列程序代码:
monthCalendar1.MaxDate = DateTime.Today.AddDays(90);   // 最晚日期
monthCalendar1.MinDate = DateTime.Today.AddDays(3);    // 最早日期
当设定好可以选取日期区间后,日历将只显示这些可以选取的日期。

【实例 2】设定日历可以选取的日期在今天过后第 3~第 10 天的区间中。
namespace ch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            monthCalendar1.MaxDate = DateTime.Today.AddDays(10);
            monthCalendar1.MinDate = DateTime.Today.AddDays(3);
        }
    }
}
执行结果为:


从上述执行结果中,读者可以观察到日历只显示可以选取的区间,框起来的是可以选取的第 1 天。

C# ShowToday和ShowTodayCircle属性

从实例 2 的执行结果可以看到日历下方显示今天的日期,这可以用 ShowToday 属性设定。这个属性可以设定是否显示今天日期,默认是 true。

ShowTodayCircle 属性可以设定今天的日期是否加框,默认是 true。

C#选取日期相关属性

1) MaxSelectionCount属性

可以设定最多可以选取的天数,默认是 7 天。

2) SelectionRange属性

可以设定所选取日期的区间,例如,可以使用下列方式设定选取的区间是 2023 年 1 月 15 日至 2023 年 1 月 31 日:
DateTime dateStart = new DateTime(2023, 1, 15);
DateTime dateEnd = new DateTime(2023, 1, 31);
monthCalendar1.SelectionRange = new SelectionRange(dateStart, dateEnd);

不过这个属性主要用来读取所选的日期区间,具体可以使用下列程序代码:
DateTime dateStart = monthCalendar1.SelectionRange.Start;  // 开始日期
DateTime dateEnd = monthCalendar1.SelectionRange.Start;    // 结束日期

3) SelectionStart属性

可以设定或读取选取日期区间的起始日期,下列语句设定选取区间的起始日期为今天:
monthCalendar1.SelectionStart = DateTime.Today;

下列语句读取选取区间的起始日期:
DateTime dateStart = monthCalendar1.SelectionStart;

4) SelectionEnd属性

可以设定或读取选取日期区间的结束日期,下列语句设定选取区间的结束日期为 10 天后:
monthCalendar1.SelectionEnd = DateTime.Today.AddTodays(10);

下列语句读取选取区间的结束日期:
DateTime dateEnd = monthCalendar1.SelectionEnd;

C#日历常用事件

如果日历控件所选日期改变会产生 DateChanged 事件。

【实例 3】设计订房系统,默认今天的日期是入住日期,第2天是退房日期,住房天数是 1 天,当勾选日历日期区间改变时,可以重新显示这 3 个字段。
namespace ch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            monthCalendar1.MaxDate = DateTime.Today.AddDays(90);  // 最晚可选取时间
            monthCalendar1.MinDate = DateTime.Today;             // 最早可选取时间
            ShowReservedDate();
        }

        private void ShowReservedDate()
        {
            DateTime checkIn = monthCalendar1.SelectionStart;           // 住房日期
            DateTime checkOut = monthCalendar1.SelectionEnd.AddDays(1); // 退房日期
            textCheckIn.Text = checkIn.ToString("yyyy/MM/dd");          // 输出住房日期
            textCheckOut.Text = checkOut.ToString("yyyy/MM/dd");        // 输出退房日期
            TimeSpan timeSpan = checkOut - checkIn;                     // 计算天数
            textDays.Text = timeSpan.Days.ToString();                   // 输出天数
        }

        private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
        {
            ShowReservedDate();
        }
    }
}
下列是选取 6 月 23 日~6 月 26 日为住房时间的结果:

相关文章