从 Winforms 月历中获取选定的月份?

Posted

技术标签:

【中文标题】从 Winforms 月历中获取选定的月份?【英文标题】:Get selected month from Winforms month calendar? 【发布时间】:2015-12-01 03:20:27 【问题描述】:

我的表单上有一个 MonthCalendar 控件。我已将其设置为一次选择一整周(从周日到周六)。

在控件的顶部,用户可以选择月份。如何获取用户选择的月份?当一个星期包含两个不同月份的几天时,问题就会出现。

例如如果用户选择 2015 年 11 月 29 日至 2015 年 12 月 5 日这一周,并在控件中选择了 11 月。他们也可以选择 12 月,我不知道该怎么说。

选择星期的代码(它不选择从星期日到星期六,但这是以后的问题):

int i = (int)MonthView1.SelectionStart.DayOfWeek;
Date d = MonthView1.SelectionStart;
MonthView1.SelectionStart = d.AddDays(1 - i);
MonthView1.SelectionEnd = d.AddDays(7 - i);

谢谢!

【问题讨论】:

【参考方案1】:

这将使用选择开始的月份。这是你想要的吗?

    private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
    
        DateTime d = monthCalendar1.SelectionRange.Start;
        Console.WriteLine(d.Month.ToString());
    

如果使用 start 不是您想要的,您可以轻松地将其更改为 monthCalendar1.SelectionRange.End

编辑:

将您的选择代码放入 MouseDown 事件中,我注意到小选择(虚线)框将始终在星期一,这也是选择的开始。这意味着如果星期一在上个月,monthCalender 将滚动到上个月。因此,使用monthCalendar1.SelectionRange.Start 应该可以满足您的要求。

编辑2:

也许您试图将所有内容都放在 1 个回调中?这是我的完整代码。它不会出故障。

(尽管当您按下鼠标时,monthCalendar1_DateChanged 可能会被多次调用。最后一次调用它会为您提供正确的月份)

public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();
        this.monthCalendar1.DateChanged += new System.Windows.Forms.DateRangeEventHandler(this.monthCalendar1_DateChanged);
        this.monthCalendar1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.monthCalendar1_MouseDown);
    

    private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
    
        DateTime d = monthCalendar1.SelectionRange.Start;
        Console.WriteLine(d.Month.ToString()); //Get the month selected. 
    

    private void monthCalendar1_MouseDown(object sender, MouseEventArgs e)
    
        int i = (int)monthCalendar1.SelectionStart.DayOfWeek;
        DateTime d = monthCalendar1.SelectionStart;
        monthCalendar1.SelectionStart = d.AddDays(1 - i);
        monthCalendar1.SelectionEnd = d.AddDays(7 - i);
    

【讨论】:

这个问题是,如果 12 月是选定的月份,那么从太阳到星期六的 12 月的第一周在 11 月有几天。使用 Start 会说所选月份是 11 月。 End 也是如此。 我明白你的意思。我玩弄了 MonthCalendar 并注意到了一个模式。如果我通过从左到右拖动来选择,如果我选择当月的最后一周,日历将滚动到下个月...如果您提供一些如何选择的代码,也许我们可以从那里开始工作。 编辑了我的帖子以包含该代码 - 选择是通过用户单击任何一天完成的,它将选择从周日到周六的那一周。选择必须始终按周进行。 你是对的,但不幸的是,自动月份切换会随着每次选择的更改而一遍又一遍地调用,因此即使选择了整整一周以及另一个月份的几天,它也会出现故障并停留在当月。我尝试将我的代码添加到 DateChanged、DateSelected 和 MouseDown。总是同样的故障。 我已经在我的答案中添加了完整的代码。试一试:)

以上是关于从 Winforms 月历中获取选定的月份?的主要内容,如果未能解决你的问题,请参考以下文章

Excel从列表中的选定月份获取下个月?

在 C# 中计算两个月历之间的时间段

自动化 .net 月历窗口

如何突出显示月历控件中的日期?

已知1800年1月1日是星期三,打印指定的年份和月份月历

.NET WinForms 的月份选择器 [重复]