ASP.netにおいて、TextBoxの中のDatePickerのtextchangedイベントが発生しない場合の対処法 

この記事を書いたチーム:frontier
ASP.netにおいて、TextBoxの中のDatePickerのtextchangedイベントが発生しない場合の対処法  株式会社Smallit 技術ブログ

TextBoxの中のコントコールはDatePickerの場合の現状 

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

ASP.netで開発する際、TextBoxの中にDatePickerを設定すると、通常のtextを入力する場合と違い、textchangedイベントが発生しないことを確認できました。 

 

イベントの発生順 

TextBoxをクリックする際、イベントの発生順は下記通りです。 

  1. focusoutTextBoxがフォーカスを失う直前) 
  2. focusinDatePickerコントロールがfocusを受け取る直前) 
  3. blur(TextBoxがフォーカスを失った直後) 
  4. focus(DatePickerがフォーカスを受け取った直後) 
  5. focusoutDatePcikerがフォーカスを失う直前) 
  6. focusinDatePcikerで日付をクリックした後に、選択された日付がTextBoxに反映した直後) 

実装したい仕様 

A.日付は直接TextBoxに入力可能、フォーカスアウト後はyyyy/MM/ddに編集する。 

B.日付を選び直す場合、画面の一部のコントロールをクリアする。 

C.日付が変わらない場合、画面の再表示をしない。 

D.日付の妥当性チェックを行う。実在しない日付が入力された場合、エラーメッセージを出す 

E.日付の妥当性チェックでエラーがない場合、検索を行う、検索結果を画面のコントロールに表示する。 

 

プロジェクトの共通ルールにより、DatePickerのフォーマット編集はフロント側で実装したい。 

仕様B、Dはバックエンド側で実装したい。 

課題 

イベントフローの中のfocusoutイベントとblurイベントを着目します。仕様Cの日付が変わらない場合、画面の再表示をしない要件があり、普通のTextBoxなら、TextBoxの入力内容が変わる場合、Textchangedイベントが発生するため、TextChangedハンドラーで実現したいことを書けばよいですが、今回のように、TextBoxの中にDatePickerが設定され、Textchangedイベントは発生しません。そのため、仕様Cの実現が難しくなります。 

解決方法 

日付のフォーマット編集後、TextBoxに反映後、その日付を一旦変数に格納する。 

フロント側でfocusoutイベントとblurイベントのハンドラーを別々に設定する。 

focusoutイベントはblurイベントより前に発生するため、まず、focusoutイベントでは、yyyy/MM/ddフォーマット編集を行う。 

blurイベントでは、TextBoxの中身と変数①と比較し、一致しない場合、バックエンド側にイベントハンドラーに渡す。 

フロント側のjsの関連ソースの抜粋: 

バックエンド側のソースの抜粋: 

上記のように、フロント側とバックエンド側のそれぞれの処理を連携することでtextchangedイベントハンドラー類似な機能を実現できました。 

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス