MonthCalendar的mousedown方法选择日期

转载:http://www.cnblogs.com/TrueElement/archive/2012/01/11/2319991.html 感谢原作者。


写个小应用,主要是方便选中日期到datagridview,就想到利用MonthCalendar显示一个月历,然后利用鼠标点击选择。实现的方法主要是利用了mousedown事件以及MonthCalendar的HitTest()方法。

说说HitTest() 方法先,这个方法返回MonthCalendar ..::. HitTestInfo 类型,这种类型里面包含3种属性:HitAreaPointTime。其中HitArea是一个枚举,包含

成员名称说明
Nowhere指定点或者不在月历控件上,或者在控件的非活动部分。
TitleBackground指定点在月标题的背景上。
TitleMonth指定点在月标题栏中的月名称上。
TitleYear指定点在年值上月的标题栏中。
NextMonthButton指定点在控件右上角的按钮上。如果用户单击此处,则月历将其显示滚动到下一个月或下一组月。
PrevMonthButton指定点在控件左上角的按钮上。如果用户单击此处,则月历将其显示滚动到上一个月或上一组月。
CalendarBackground指定点是日历的背景的组成部分。
Date指定点在日历中的某一日期上。MonthCalendar ..::. HitTestInfo Time 属性设置为指定点处的日期。
NextMonthDate指定点在下一个月(部分显示在当前所显示月份的顶部)的某个日期上。如果用户单击此处,则月历将其显示滚动到下一个月或下一组月。
PrevMonthDate指定点在前一个月(部分显示在当前所显示月份的顶部)中的某个日期上。如果用户单击此处,则月历将其显示滚动到上一个月或上一组月。
DayOfWeek指定点在日期缩写(例如,“Fri”)上。MonthCalendar ..::. HitTestInfo Time 属性设置为 0001 年 1 月 1 日。
WeekNumbers指定点在周数上。只有在启用了 MonthCalendar ShowWeekNumbers 属性时,这才会发生。 MonthCalendar ..::. HitTestInfo Time 属性设置为最左侧的列中对应的日期。
TodayLink指定点在月历控件底端的今日链接上。

例如:

tmp.HitTest(e.Location)
{System.Windows.Forms.MonthCalendar.HitTestInfo}
    HitArea: Date
    Point: {X = 136 Y = 97}
    Time: {2012/7/1 0:00:00}

而当连续点击到TitleBackground(上面的 “2012年1月”那个区域)时,月历会变成如下:

0次1次2次3次

所以,根据这些情况,写了以下一个mousedown事件处理方法:

复制代码
        private byte haveHitTitleCnt = 0;//标题栏点击计数
        private void monthCalendar1_MouseDown(object sender, MouseEventArgs e)
        {
            
            MonthCalendar tmp = (MonthCalendar)sender;
            MonthCalendar.HitTestInfo hitInfo = tmp.HitTest(e.Location);

            if (hitInfo.HitArea == MonthCalendar.HitArea.Date)
            {
                if (haveHitTitleCnt == 0)
                {
                    this.dataGridView1.Rows.Add(this.monthCalendar1.SelectionStart.Date.ToShortDateString(), true, false);
                }
                else
                {
                    haveHitTitleCnt--;
                }
                
            }
            if (hitInfo.HitArea == MonthCalendar.HitArea.TitleBackground)
            {
                if (haveHitTitleCnt < 3)//最大到3
                {
                    haveHitTitleCnt++;
                }
                
            }
            

            
        }
复制代码

还有,为了完整一些,将

        this.monthCalendar1.MaxSelectionCount = 1;

点击其他部分,像TodayLink,不会引起date部分haveHitTitleCnt变化(即date显示层次(年、月、日)变化),所以就不用处理这些地方了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值