【问题标题】:How can i show month selection calendar in my app如何在我的应用程序中显示月份选择日历
【发布时间】:2011-07-13 07:24:22
【问题描述】:

我有兴趣以类似于 datepicker 的月份选择控件的方式显示 12 个月的列表。但我也不喜欢显示日期选择器来显示该月的日期......只有月份视图是可以的,这样我就可以从列表中选择月份。

我想要的输出:

【问题讨论】:

    标签: vb.net winforms controls datepicker monthcalendar


    【解决方案1】:

    这将需要一些 pinvoke 来发送消息以获取日历以切换视图。像这样实现 DateTimePicker 的 DropDown 事件处理程序:

        private void dateTimePicker1_DropDown(object sender, EventArgs e) {
            IntPtr cal = SendMessage(dateTimePicker1.Handle, DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero);
            SendMessage(cal, MCM_SETCURRENTVIEW, IntPtr.Zero, (IntPtr)1);
        }
    
        // pinvoke:
        private const int DTM_GETMONTHCAL = 0x1000 + 8;
        private const int MCM_SETCURRENTVIEW = 0x1000 + 32;
    
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
    

    视图切换是动画的,它将对用户可见。这不适用于 Vista 之前的 Windows 版本。如有必要,请使用在线翻译器将此 C# 代码翻译成 VB.NET

    【讨论】:

    • 有趣,我不知道视图可以这样设置。但我认为这也不会阻止用户在控件可见后自行更改视图。
    • @Cody,不,只需单击一个月即可切换视图。这样的点击是不可检测的,只有视图变化是可检测的。不太确定OP是否意识到这一点。哦,好吧,他没有要求。
    • @HansPassant 我在 Windows 窗体应用程序(C#、Windows 10)上尝试过,建议的代码不会将删除的日历视图限制为仅几个月。日期可见且可选择
    【解决方案2】:

    我不完全确定我是否理解您的要求。如果您想在没有附加选择器控件的情况下显示月历,可以使用MonthCalendar control

    看起来像这样(注意没有文本框和下拉箭头):

      


    如果您想知道是否有办法将控件上显示的内容限制为仅显示月份本身,而不是每月的个人日期,那么不,那是不可能的。该控件没有为此提供任何内置功能。

    但是,如果您确实想要使用选取器控件,则可以将其显示的值限制为仅显示月份的名称。通过指定自定义格式字符串来做到这一点:

    myDateTimePicker.Format = DateTimePickerFormat.Custom
    myDateTimePicker.CustomFormat = "MMMM"
    

    这会导致类似下面的内容(注意下拉内容没有改变,但是选择器控件本身记录的信息仅限于月份的名称):

      

    【讨论】:

    • 对不起,我的意思是我也需要选择器,但我只需要用户选择月份而不是日期......就像用户应该能够选择 jan、feb 而不是 jan 1、jan 15
    • @KoolKabin:确保您已刷新页面以查看我回答的第二部分。如果您只关心用户输入,我认为这对您有用。他们将能够查看单个日期,但无法选择这些日期(或者至少,您的应用会忽略他们的选择)。
    • 为了避免显示下拉菜单并只显示月份和/或年份,您可以将属性 ShowUpDown 设置为 True
    • 显示 MonthCalender 需要哪些属性值,就像您在第一张图片中看到的那样?我想显示一个仅显示月/年的日历,但我无法让它看起来像您的第一个示例图像。
    【解决方案3】:

    另一种方法是将日期时间选择器格式属性设置为自定义,并在自定义格式属性中输入 MMMM 以显示月份的名称。然后将 show up 设置为 true,这样它就会绕过下拉菜单,让用户在几个月内上下移动。

    【讨论】:

      【解决方案4】:

      将 MonthCalendar 控件放入 GroupBox。缩小 GroupBox 以便只有 MonthCalendar 控件的 Month 部分对窗体可见。这将隐藏日期。

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 1970-01-01
        • 2012-01-26
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        相关资源
        最近更新 更多