質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Q&A

解決済

1回答

10992閲覧

DateTimePickerのカレンダー表示状態で、欄外を選択した場合のイベントを拾いたい

cha-ra

総合スコア40

C#

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

0グッド

0クリップ

投稿2016/06/24 07:15

TextBoxとDateTimePicker、Buttonを利用して、
NULL値を設定出来る日付ユーザコントロールを作成しています。

Button押下時にDateTimePickerのカレンダを表示し、
選択日付をTextBoxに設定する所までは作成できました。

ただ、カレンダの表示外を選択した場合にはキャンセル扱いにしたいのですが、
カレンダ表示時に初期選択されている日付を設定してしまいます。

カレンダー内の日付選択された場合と、カレンダー外を選択された場合の判断は出来るのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

テキストボックスに反映するときは、何のイベントで行っているのでしょうか?
手元に環境がないので確認はできていないのですが、その処理をValueChangedイベントでやってみてはどうでしょうか。

投稿2016/06/24 07:40

ttyp03

総合スコア16998

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

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

cha-ra

2016/06/24 07:52

TextBoxへの反映はCloseUpイベントにて行っています。 また、TextBoxの値を変更した場合は、カレンダー表示にその日付を選択している状態にしたいこと、 TextBox空白設定時には当日日付を選択している状態にする為、 ValueChangedイベントを利用すると上記の動作を行えなくなってしまいます。 MonthCalendarも利用したのですが、欄外をクリックしてもLeaveイベントが発生しないため、 処理をユーザコントロール内で完結出来ない状態です。
ttyp03

2016/06/24 08:42

調べてみましたが難しそうですね。 やりたくはないですが、フラグ制御になってしまいますかねぇ。 GetFocusイベントあたりでAフラグをオン、Bフラグをオフ。 ValueChangedイベントでAフラグがオンならBフラグをオン。 CloseUpイベントでBフラグがオンならテキストボックスに反映。 みたいな。
cha-ra

2016/06/27 00:23

値設定時に、関連イベントを一旦全て無効にすることで、 ヒントとして頂いたValueChangedイベントを利用して実装できました。 ありがとうございました。 ```C# public partial class DateCustom : UserControl { public DateCustom() { InitializeComponent(); } /// <summary> /// ボタン背後に隠しているDateTimePickerを表示 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnShowDtp_Click(object sender, EventArgs e) { DtpInvisible.Select(); SendKeys.SendWait("%{DOWN}"); } /// <summary> /// DateTimePickerの値変更時には、日付テキストに選択日付を設定する /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DtpInvisible_ValueChanged(object sender, EventArgs e) { this.TxtDate.Text = DtpInvisible.Value.ToShortDateString(); } /// <summary> /// 日付テキストから離脱する場合は、その日付をDateTimePikcerに設定する /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtDate_Leave(object sender, EventArgs e) { if (string.IsNullOrEmpty(this.TxtDate.Text)) { setDate(DateTime.Now); } else { setDate(DateTime.Parse(this.TxtDate.Text)); } } /// <summary> /// DateTimePicker日付設定 /// 値変更イベントを動作させずに、日付情報を設定する /// </summary> /// <param name="date"></param> private void setDate(DateTime date) { DtpInvisible.ValueChanged -= new EventHandler(DtpInvisible_ValueChanged); this.DtpInvisible.Text = date.ToString("yyyy/MM/dd"); this.DtpInvisible.Value = date; DtpInvisible.ValueChanged += new EventHandler(DtpInvisible_ValueChanged); } } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問