0

助けてください?!問題は、datetimepicker コントロールを使用する古いユーザー コントロールがあるためです。datetimepicker のテキストボックスに表示する日付がない場合、.Value プロパティは DateTimePicker.MinimumDateTime に設定されます。.Value が DateTimePicker.MinimumDateTime の場合、OnValueChanged は CustomFormat を " " に更新します。それ以外の場合、CustomFormat は "yyy-MM-dd hh:mm:ss tt" です。

問題 ==> DropDown イベントで、最小日時を確認します。.Value がそれと等しい場合は、.Value を DateTime.Now に更新します。ドロップダウン カレンダーが表示されると、カレンダーは 1753-01-01 に設定され、テキスト ボックス (.Value) には DateTime.Now が表示されます。

DropDown イベントで更新された .Value プロパティに対応する日付をカレンダーに表示するにはどうすればよいですか? 値が DateTimePicker.MinimumDateTime から DateTime.Now に変更されたときに、DateTimePicker の最初の DropDown イベントを「キャンセル」する方法があったとしても、2 回目 (およびそれ以降) のドロップダウンカレンダーが表示される カレンダーは、テキスト ボックス (DateTimePicker.Value) に表示される日付と正しく一致します。

問題の DateTimePicker に接続したイベントのコードは次のとおりです。

    private void ValueDatetimePickerOnKeyUp(Object sender, KeyEventArgs e)
    {
        if (e.KeyCode != Keys.Delete && e.KeyCode != Keys.Back)
            return;
        var dp = (DateTimePicker)sender;
        if (dp == null)
            return;
        dp.Value = DateTimePicker.MinimumDateTime;
    }

    private void ValueDatetimePickerDropDown(Object sender, EventArgs e)
    {
        var dp = (DateTimePicker)sender;
        if (dp == null)
            return;
        if (dp.Value == DateTimePicker.MinimumDateTime)
            dp.Value = DateTime.Now;
    }

    private void ValueDatetimePickerValueChanged(Object sender, EventArgs e)
    {
        var dp = (DateTimePicker)sender;
        if (dp == null)
            return;
        dp.CustomFormat = dp.Value == DateTimePicker.MinimumDateTime ? " " : "yyyy-MM-dd hh:mm:ss tt";
    }
4

3 に答える 3

2

これを理解するのに時間がかかりました。少しハックですが、基本的には datetimepicker の DropDown イベント ハンドラーで ShowUpDown を true に設定し、Closeup イベント ハンドラーを呼び出して ShowUpDown を false に戻します。これにより、ドロップダウン カレンダーが閉じられ、ユーザーが再び開くように強制されます。これにより、1753 年 1 月 1 日ではなく正しい日付がカレンダーに表示されます。OnKeyUp イベント ハンドラーは、ユーザーが DEL または Backspace キーを押した場合に、datetimepicker のテキスト ボックスの値を空白にすることをユーザーに許可します。

    private void ValueDatetimePickerOnKeyUp(Object sender, KeyEventArgs e)
    {
        //if user presses backspace or delete key then clear the date/time
        if (e.KeyCode != Keys.Delete && e.KeyCode != Keys.Back)
            return;
        var dp = (DateTimePicker)sender;
        if (dp == null)
            return;
        dp.Value = DateTimePicker.MinimumDateTime;
    }

    private void ValueDatetimePickerCloseUp(Object sender, EventArgs e)
    {
        var dp = (DateTimePicker) sender;
        if(dp == null)
            return;
        dp.ShowUpDown = false;
    }

    private void ValueDatetimePickerDropDown(Object sender, EventArgs e)
    {
        var dp = (DateTimePicker)sender;
        if (dp == null)
            return;
        if (dp.Value == DateTimePicker.MinimumDateTime)
        {
            dp.Value = DateTime.Now;
            dp.ShowUpDown = true;
            Invoke((MethodInvoker) (() => ValueDatetimePickerCloseUp(dp, new EventArgs())));
        }
    }

    private void ValueDatetimePickerValueChanged(Object sender, EventArgs e)
    {
        var dp = (DateTimePicker)sender;
        if (dp == null)
            return;
        dp.CustomFormat = dp.Value == DateTimePicker.MinimumDateTime ? " " : "yyyy-MM-dd HH:mm:ss tt";
    }
于 2013-02-22T15:44:51.000 に答える