teratail header banner
teratail header banner
質問するログイン新規登録
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

1661閲覧

DateTimePickerで年月日時分秒の更新を連動させたい

meguru0411

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/02/27 06:14

0

0

C#で年月日時分秒をDateTimePickerで入力するコードを書いているのですが、それぞれの更新を日時の変化として連動させる方法が分かりません。

(例1)
2022/01/01 23:59:59で「秒」を一つ進めると2022/01/02 00:00:00になる。
(例2)
2022/01/01 00:00:00で「分」を一つ戻すと2021/12/31 23:59:00になる。

ValueChangedイベントの処理に日時を更新するコードを書き、コントロールの表示イベントを独自に生成するしか方法がないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/02/27 06:27 編集

情報不足です。 何を作っているか(WinForms? WPF? ASP.NET? コンソールアプリ? その他?)と開発環境(OS, Visual Studio のバージョン、.NET Framework なのか Core のどっちかとそのバージョン)ぐらいは書きましょう。 あなたがどこまで実装できたのか、どこで躓いていて、何が分かれば解決するかを、あなたが書いたコードを提示して説明することはできませんか? 今の質問内容ではまるっきりの丸投げです。
Zuishin

2022/02/27 06:27

> ValueChangedイベントの処理に日時を更新するコードを書き、コントロールの表示イベントを独自に生成するしか方法がないでしょうか。 それしか方法がないことはありませんが、それでいいと思います。 普通はデータバインディングを使います。
guest

回答1

0

DTN_DATETIMECHANGE 通知メッセージをキャッチするといいかもしれません。

C#

1using System; 2using System.Windows.Forms; 3using System.Runtime.InteropServices; 4 5class TimePicker : DateTimePicker 6{ 7 public TimePicker() { 8 base.Format = DateTimePickerFormat.Custom; 9 base.CustomFormat = "yyyy/MM/dd hh:mm:ss"; 10 } 11 12 protected override void WndProc(ref Message m) { 13 switch (m.Msg) { 14 case WM_REFLECT + WM_NOTIFY: 15 WmReflectCommand(ref m); 16 break; 17 default: 18 base.WndProc(ref m); 19 break; 20 } 21 } 22 23 private void WmReflectCommand(ref Message m) { 24 if (m.HWnd == Handle) { 25 NMHDR nmhdr = (NMHDR)m.GetLParam(typeof(NMHDR)); 26 switch (nmhdr.code) { 27 case DTN_DATETIMECHANGE: 28 WmDateTimeChange(ref m); 29 break; 30 default: 31 base.WndProc(ref m); 32 break; 33 } 34 } else { 35 base.WndProc(ref m); 36 } 37 } 38 39 private void WmDateTimeChange(ref Message m) { 40 NMDATETIMECHANGE nmdtc = (NMDATETIMECHANGE)m.GetLParam(typeof(NMDATETIMECHANGE)); 41 if (nmdtc.dwFlags != GDT_NONE) { 42 DateTime oldValue = base.Value; 43 DateTime newValue = SysTimeToDateTime(nmdtc.st); 44 if (oldValue.Second == 59 && newValue.Second == 00) { 45 base.Value = newValue.AddMinutes(+1); 46 return; 47 } else if (oldValue.Second == 00 && newValue.Second == 59) { 48 base.Value = newValue.AddMinutes(-1); 49 return; 50 } 51 base.WndProc(ref m); 52 } else { 53 base.WndProc(ref m); 54 } 55 } 56 57 private static DateTime SysTimeToDateTime(SYSTEMTIME s) { 58 return new DateTime(s.wYear, s.wMonth, s.wDay, s.wHour, s.wMinute, s.wSecond, s.wMilliseconds); 59 } 60 61 private const int 62 WM_USER = 0x0400, 63 WM_REFLECT = WM_USER + 0x1C00, 64 WM_NOTIFY = 0x004E, 65 GDT_NONE = 1, 66 DTN_DATETIMECHANGE = ((0 - 760) + 1); 67 68 [StructLayout(LayoutKind.Sequential)] 69 private struct NMHDR 70 { 71 public IntPtr hwndFrom; 72 public IntPtr idFrom; 73 public int code; 74 } 75 76 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 77 private class NMDATETIMECHANGE 78 { 79 public NMHDR nmhdr; 80 public int dwFlags = 0; 81 public SYSTEMTIME st = null; 82 } 83 84 [StructLayout(LayoutKind.Sequential)] 85 private class SYSTEMTIME 86 { 87 public short wYear; 88 public short wMonth; 89 public short wDayOfWeek; 90 public short wDay; 91 public short wHour; 92 public short wMinute; 93 public short wSecond; 94 public short wMilliseconds; 95 } 96}

投稿2022/03/01 02:32

KOZ6.0

総合スコア2736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問