web-dev-qa-db-ja.com

datetimepickerドロップダウンを設定して月のみを表示する方法

そのため、これの代わりに、ドロップダウンメニューをクリックすると表示されます。

enter image description here

クリックしたときにドロップダウンがこのようになることを望みます。

enter image description here

助けてくれてありがとう。 :)

13
Bigboss

なぜこれを行う必要があるのですか?月のみを表示する場合は、Comboxに月のリストを表示するのが簡単な方法です。

しかし、私はmsdnであなたのために何かを見つけました。こちらをご覧ください https://social.msdn.Microsoft.com/Forums/en-US/7bdca56f-719e-44bf-be6d-a9600dfa8f78/wpf-datepicker-for-months-only?forum=wpf

2
Dk358

次のコードを試してください:

DateTime newDateValue = new DateTime(dateTimePicker_month.Value.Year, 1, 1);
dateTimePicker_month.Value = newDateValue;
dateTimePicker_month.Format = DateTimePickerFormat.Custom;
dateTimePicker_month.CustomFormat = "MMM-yyyy";
dateTimePicker_month.ShowUpDown = true;

すべての月の値を確認するには、28/29日を持つ2月の月に(1,1)を追加する必要があります。クエリで月を選択する場合は、次の例を参照してください。

string month = dateTimePicker_month.Value.Month.ToString();
string year = dateTimePicker_month.Value.Year.ToString();

次のクエリを使用して月を選択します。

select CAST(date AS DATE) from table where DATEPART(month, date)  = '" + month + "' and DATEPART(year,date) = '" + year + "' 
1
manraj

Windowsメッセージアプローチ を使用すると、月間カレンダーコントロールの表示を検出して月ビューを強制し、ビューの変更を検出して、月間ビューの変更(月の選択後)時に月間カレンダーコントロールを閉じることができます。

これを実装する最も簡単な方法は、DateTimePickerをオーバーライドすることです。

public class MonthPicker : DateTimePicker
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_NOFITY)
        {
            var nmhdr = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR));
            switch (nmhdr.code)
            {
                case -950:
                {
                    var cal = SendMessage(Handle, DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero);
                    SendMessage(cal, MCM_SETCURRENTVIEW, IntPtr.Zero, (IntPtr)1);
                    break;
                }
                case MCN_VIEWCHANGE:
                {
                    var nmviewchange = (NMVIEWCHANGE)Marshal.PtrToStructure(m.LParam, typeof(NMVIEWCHANGE));
                    if (nmviewchange.dwOldView == 1 && nmviewchange.dwNewView == 0)
                    {
                        SendMessage(Handle, DTM_CLOSEMONTHCAL, IntPtr.Zero, IntPtr.Zero);
                    }

                    break;
                }
            }
        }
        base.WndProc(ref m);
    }

    private const int WM_NOFITY = 0x004e;
    private const int DTM_CLOSEMONTHCAL = 0x1000 + 13;
    private const int DTM_GETMONTHCAL = 0x1000 + 8;
    private const int MCM_SETCURRENTVIEW = 0x1000 + 32;
    private const int MCN_VIEWCHANGE = -750;

    [DllImport("user32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

    [StructLayout(LayoutKind.Sequential)]
    private struct NMHDR
    {
        public IntPtr hwndFrom;
        public IntPtr idFrom;
        public int code;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct NMVIEWCHANGE
    {
        public NMHDR nmhdr;
        public uint dwOldView;
        public uint dwNewView;
    }
}
0
Orace

Formatプロパティを使用してみてください。

 dateTimePicker.Format = DateTimePickerFormat.Custom;
 dateTimePicker.CustomFormat = "MM";
0
FrozenFire