winfrom MonthCalendar的mousedown方法 获得 选择日期
资料来源 http://www.cnblogs.com/TrueElement/archive/2012/01/11/2319991.html
private void monthCalendar_MouseDown(object sender, MouseEventArgs e) { MonthCalendar.HitTestInfo hitInfo = monthCalendar.HitTest(e.Location); if (hitInfo.HitArea == MonthCalendar.HitArea.Date)//当选择了日期后 { txtCalendar.Text = monthCalendar.SelectionStart.ToString("yyyy-MM-dd"); } }
详细说明
实现的方法主要是利用了mousedown事件以及MonthCalendar的HitTest()方法。
说说HitTest() 方法先,这个方法返回MonthCalendar . HitTestInfo 类型,这种类型里面包含3种属性:HitArea、Point、Time。其中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显示层次(年、月、日)变化),所以就不用处理这些地方了。
资料来源 http://www.cnblogs.com/TrueElement/archive/2012/01/11/2319991.html
作者:唐小熊
出处:http://www.cnblogs.com/IT-Bear/
关于作者:一头写代码的熊
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接
如有问题,可以通过kumat@foxmail.com 联系我,非常感谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构