DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DateTimePickerに付いて

  • 題名: DateTimePickerに付いて
  • 著者: うげぱぱ
  • 日時: 2004/09/03 23:49:45
  • ID: 5982
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[Windows VB.NET ]
分類:[.NET]

度々参考にさせていただいています。
このたびは、DateTimePickerについてお尋ねします。
入力された日付が、ある条件に当てはまるかどうかのチェック
をかけたいのですが、どのイベントでチェックかけるのがいいか分かりません。
Validatingでチェックできるのではと思い、テストしてみたのですが
変更前の値しか参照できません。方法は下記の通りです。

Private Sub DateTimePicker1_Validating() のイベントで
dim strDate as string = DateTimePicker1.Value.ToString("yyyy/MM/dd")

でstrDateを確認してみたのですが、変更前の値しか確認できませんでした。

どのイベントでチェックするのが良いか、また、参照しているプロパテイが
まずいのか、ご存知の方アドバイスよろしくお願いします。
こんにちは、うげばばさん。

■No5982に返信(うげぱぱさんの記事)
> 度々参考にさせていただいています。
> このたびは、DateTimePickerについてお尋ねします。
> 入力された日付が、ある条件に当てはまるかどうかのチェック
> をかけたいのですが、どのイベントでチェックかけるのがいいか分かりません。
> Validatingでチェックできるのではと思い、テストしてみたのですが
> 変更前の値しか参照できません。方法は下記の通りです。
>
> Private Sub DateTimePicker1_Validating() のイベントで
> dim strDate as string = DateTimePicker1.Value.ToString("yyyy/MM/dd")
>
> でstrDateを確認してみたのですが、変更前の値しか確認できませんでした。
>
> どのイベントでチェックするのが良いか、また、参照しているプロパテイが
> まずいのか、ご存知の方アドバイスよろしくお願いします。

全く同じやり方をしてみたのですが、変更後の値で比較できるようですが?

  Private Sub DateTimePicker1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles DateTimePicker1.Validating
    Dim nDatePick As String
    Dim nDateToday As String

    nDatePick = DateTimePicker1.Value.ToString("yyyy/MM/dd")
    nDateToday = DateTime.Today.ToString("yyyy/MM/dd")

    If nDatePick < nDateToday
      MessageBox.Show("過去日は入力できません。")
      e.Cancel = True
    End If
  End Sub
■No6004に返信(java.lang.Nullpoさんの記事)
>
ご返事ありがとうございます。
> 全く同じやり方をしてみたのですが、変更後の値で比較できるようですが?
とのことで、早速私再度、プロジェクトを再度1から作成し、テストしてみました。
 
 すると、Returnキーでフォーカスを次の入力に飛ばすように、フォームの
 プロパテイでKeyPreView=Trueにし、
 フォームのKeyDownのイベントに次のようなコードを追加し、リターンキー
 で入力決定したのですが、すると修正前の状態しかチェックされなくなりました。
 
  Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
Dim KeyCode As System.Windows.Forms.Keys = e.KeyCode
Dim Shift As Integer = e.KeyData \ &H10000
If KeyCode = System.Windows.Forms.Keys.Return Or KeyCode = System.Windows.Forms.Keys.Down Then
System.Windows.Forms.SendKeys.SendWait("{TAB}")
ElseIf KeyCode = System.Windows.Forms.Keys.Up Then
System.Windows.Forms.SendKeys.SendWait("+{TAB}")
End If

End Sub

  再度カーソルをマウスで戻し、リターンキーを操作すると、変更した値でチェック
  されます。
  DateTimePickerでなく、KeyDownの処理が原因だったようです。
  細かく調査せず、単に状況から質問してしまい、申し訳ありませんでした。
  改めてご質問させていただきます。
  
  KeyPreviewでSendKeyを実行すると、イベントの順番が変わってしまうのでしょうか。
  個々のオブジェクトのKeyDown処理で、Returnキー入力の判断をするのが本当
  なのでしょうか?
  
■No6008に返信(うげぱぱさんの記事)
> ご返事ありがとうございます。

> > 全く同じやり方をしてみたのですが、変更後の値で比較できるようですが?

> とのことで、早速私再度、プロジェクトを再度1から作成し、テストしてみました。
>  
> すると、Returnキーでフォーカスを次の入力に飛ばすように、フォームの
> プロパテイでKeyPreView=Trueにし、
> フォームのKeyDownのイベントに次のようなコードを追加し、リターンキー
> で入力決定したのですが、すると修正前の状態しかチェックされなくなりました。

> KeyPreviewでSendKeyを実行すると、イベントの順番が変わってしまうのでしょうか。
> 個々のオブジェクトのKeyDown処理で、Returnキー入力の判断をするのが本当
> なのでしょうか?

というより、SendKeyは使わないようにしましょう。
直接の原因かどうかは知りませんが、VB6以前からVBプログラムの癌となってますです。
嗚呼、こういうときのために私が書いた記事がありました↓

http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=red&namber=5902&no=0
■No6009に返信(java.lang.Nullpoさんの記事)
> というより、SendKeyは使わないようにしましょう。
> 直接の原因かどうかは知りませんが、VB6以前からVBプログラムの癌となってますです。
> 嗚呼、こういうときのために私が書いた記事がありました↓
>
> http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=red&namber=5902&no=0
>

 早速のご返事ありがとうございました。
 即試して見ましたが、状況は変わりませんでした。
 何はともあれ、情報ありがとうございました。SendKeyを使うことにそんな不具合が
 あるとは知りませんでした。以後参考にさせていただきます。
 今後ともよろしくお願いします。
2004/09/06(Mon) 14:39:22 編集(投稿者)

■No6011に返信(うげぱぱさんの記事)
> 早速のご返事ありがとうございました。
> 即試して見ましたが、状況は変わりませんでした。
> 何はともあれ、情報ありがとうございました。SendKeyを使うことにそんな不具合が
> あるとは知りませんでした。以後参考にさせていただきます。
> 今後ともよろしくお願いします。

実際やってみたところ、SendKeys()でもバッチリチェックされますね。
私のソースで試している場合は、ローカル日付より過去の日付を入れないと、
エラーメッセージはでませんよ?(わかっているかもしれませんが)

# イベント順序がヘンな挙動をしている場合は、他に原因があると思いますが...
■No6012に返信(java.lang.Nullpoさんの記事)
>
> 実際やってみたところ、SendKeys()でもバッチリチェックされますね。
> 私のソースで試している場合は、ローカル日付より過去の日付を入れないと、
> エラーメッセージはでませんよ?(わかっているかもしれませんが)
>
> # イベント順序がヘンな挙動をしている場合は、他に原因があると思いますが...

何でかな〜。
実際に私もプロジェクトを1から作成し、次のコードだけ追加しました。
画面もDateTimePicker1つと、ボタン1つだけです。ボタンはまだ使用してませんが。

Private Sub DateTimePicker1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles DateTimePicker1.Validating
Dim nDatePick As String
Dim nDateToday As String

nDatePick = DateTimePicker1.Value.ToString("yyyy/MM/dd")
nDateToday = DateTime.Today.ToString("yyyy/MM/dd")

If nDatePick < nDateToday Then
MessageBox.Show("過去日は入力できません。")
e.Cancel = True
End If
End Sub

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
If e.KeyCode = System.Windows.Forms.Keys.Return Or e.KeyCode = System.Windows.Forms.Keys.Down Then
Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, True)
End If
End Sub

今日は2004/09/06なのですが、
@日付に2004/09/06を入力しReturnを入力するとメッセージは出ません。
A次に日付に2004/08/06としReturnを入力するとメッセージは出ません。
B次に日付に2004/10/06としReturnを入力すると”過去日は入力できません”が表示。
C次に日付に2004/08/06としReturnを入力するとメッセージは出ません。

入力値を取り込む前にチェックイベント(Validating)が発生しているように思えるのですが、何か考えられますでしょうか?
■No6013に返信(うげぱぱさんの記事)
> 何でかな〜。
> 実際に私もプロジェクトを1から作成し、次のコードだけ追加しました。
> 画面もDateTimePicker1つと、ボタン1つだけです。ボタンはまだ使用してませんが。

> Private Sub DateTimePicker1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles DateTimePicker1.Validating
> Dim nDatePick As String
> Dim nDateToday As String
>
> nDatePick = DateTimePicker1.Value.ToString("yyyy/MM/dd")
> nDateToday = DateTime.Today.ToString("yyyy/MM/dd")
>
> If nDatePick < nDateToday Then
> MessageBox.Show("過去日は入力できません。")
> e.Cancel = True
> End If
> End Sub
>
> Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
> If e.KeyCode = System.Windows.Forms.Keys.Return Or e.KeyCode = System.Windows.Forms.Keys.Down Then
> Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, True)
> End If
> End Sub
>
> 今日は2004/09/06なのですが、
> @日付に2004/09/06を入力しReturnを入力するとメッセージは出ません。
> A次に日付に2004/08/06としReturnを入力するとメッセージは出ません。
> B次に日付に2004/10/06としReturnを入力すると”過去日は入力できません”が表示。
> C次に日付に2004/08/06としReturnを入力するとメッセージは出ません。
>
> 入力値を取り込む前にチェックイベント(Validating)が発生しているように思えるのですが、何か考えられますでしょうか?

私の方でも確認しました。(おっしゃる通り)
どうやら、年・月・日どれでも良いので、1桁だけ入力してすぐEnterを押下すると、
バグなのか仕様なのかわかりませんが、入力が確定しないようですね。

# 一応、Validating()イベントは発生している模様ですが...

で、さらに調べると、1文字だけ入力した時は、
ValueChanged()または、TextChanged()イベントが起きていませんね。(初めて知った)
なので、ValueプロパティおよびTextプロパティ内が反映されていません。
チェックのタイミングを変える必要があるようですが、もうちょっと調べてみます。

関係ない話ですが、Keys.Downによるフォーカス遷移は止めた方がいいと思います。
理由は、モロにDateTimePickerコントロールの仕様と競合しているからです。

# 外してみればどんな機能と競合しているか、わかります。
  • 題名: Re[8]: DateTimePickerに付いて
  • 著者: うげぱぱ
  • 日時: 2004/09/06 15:54:39
  • ID: 6016
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No6015に返信(java.lang.Nullpoさんの記事)>

> 私の方でも確認しました。(おっしゃる通り)
> どうやら、年・月・日どれでも良いので、1桁だけ入力してすぐEnterを押下すると、
> バグなのか仕様なのかわかりませんが、入力が確定しないようですね。
>
> # 一応、Validating()イベントは発生している模様ですが...
>
> で、さらに調べると、1文字だけ入力した時は、
> ValueChanged()または、TextChanged()イベントが起きていませんね。(初めて知った)
> なので、ValueプロパティおよびTextプロパティ内が反映されていません。
> チェックのタイミングを変える必要があるようですが、もうちょっと調べてみます。
>
> 関係ない話ですが、Keys.Downによるフォーカス遷移は止めた方がいいと思います。
> 理由は、モロにDateTimePickerコントロールの仕様と競合しているからです。
>

いろいろとご協力いただきましてありがとうございます。
度重なる助言本当に感謝いたしております。
でですが、Keys.Downによるフォーカス遷移をやめるということは、
ProcessDialogKey()をオーバライドする手法で行なうほうがよい
ということですね。早速置き換えるようにします。
今後ともよろしくお願いします。

DOBON.NET | プログラミング道 | プログラミング掲示板