DateTimePickerでユーザーに月までしか選択させない


ご質問させていただきます｡

DateTimePickerでユーザーに年月までしか選択させたくないです｡  
以下の画像のように月をクリックすると､その月のカレンダーが表示されてしまいますが､  
そうではなく､datetimepickerのvalueを2016/02/01で入れて､入力を終了させたいのです｡

[![画像の説明をここに入力](https://i.stack.imgur.com/oe0CP.jpg)](https://i.stack.imgur.com/oe0CP.jpg)

ちなみにDateTimePickerのテキストはFormatでyyyy/mmとする事で年月までしか表示させないようにする事はできました｡  
DateTimePickerで上記のような制御は可能でしょうか｡

もしくは､他の良い方法がございましたら､ご教授ください｡  
よろしくお願いします｡




DropDownイベントに以下を実装します。

[code]

    // 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);
    
    private void dateTimePicker1_DropDown(object sender, EventArgs e)
    {
        DateTimePicker myDt = (DateTimePicker)sender;
    
        IntPtr cal = SendMessage(dateTimePicker1.Handle, DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero);
        SendMessage(cal, MCM_SETCURRENTVIEW, IntPtr.Zero, (IntPtr)1);
    
    }
    
[/code]




表示に関しては`Format`プロパティを`Custom`にし、`CustomFormat`プロパティに`yyyy年
MM月`などの書式を設定すればよいと思います。

この状態でも`Value`には年月以外の値も含まれている場合がありますが、これに関してはイベントか派生クラスで値を丸めるしかないです。基本的には`new
DateTime(year, month, 1)`のような処理を変更時や値の取得時に行えばよいです。

[code]

    private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
    {
        var v = dateTimePicker1.Value;
        dateTimePicker1.Value = new DateTime(v.Year, v.Month, 1);
    }
    
[/code]

なお上の方法ではすべてのコントロールにイベントを設定する必要がありますが、もっと本質的に対処したい場合は`DateTimePicker`の派生型を実装してください。

