【问题标题】:Get selected month from Winforms month calendar?从 Winforms 月历中获取选定的月份?
【发布时间】: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);

谢谢!

【问题讨论】:

    标签: c# winforms


    【解决方案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。总是同样的故障。
    • 我已经在我的答案中添加了完整的代码。试一试:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多