DateTimePickerからの値

解決


タメ子  2009-08-06 19:57:20  No: 142343  IP: 192.*.*.*

DateTimePickerを利用して年月日設定をするのですが、
空白を許可する為に、その上にTextBoxを貼って、
DateTimePickerで選択した年月日をTextBoxに表示するようにしています。
CloseUpイベントを利用して実現しているのですが、これだと、カレンダーを
表示し炊けど何も日を選択せずにDateTimePickerを閉じても、
DateTimePickerで選択されていた日付がTextBoxに書き込まれます。

意図して日付を選択した場合ではなくキャンセルした場合はTextに
書き込まないようにするのにはどうすれば良いでしょうか?

知恵をお貸し下さい。



■VB 2008 WindowsXP

編集 削除
魔界の仮面弁士  2009-08-06 20:48:06  No: 142344  IP: 192.*.*.*

Checked = False な状態を、空欄表記の代用にするというのは駄目でしょうか?


Partial Public Class Form1
    Private WithEvents TextBox1 As New TextBox() With {.Location = New Point(10, 10), .ReadOnly = True, .TabStop = False}
    Private WithEvents DateTimePicker1 As New DateTimePicker() With {.Location = New Point(10, 30), .ShowCheckBox = True}
    Sub Form1_Load() Handles MyBase.Load
        Controls.AddRange(New Control() {TextBox1, DateTimePicker1})
        DateTimePicker1.Checked = False
        DateTimePicker1.Tag = DateTimePicker1.Value
    End Sub
    'Sub Sample() Handles DateTimePicker1.ValueChanged
    '    Dim d As Date? = If(DateTimePicker1.Checked, DateTimePicker1.Value, Nothing)
    '    If Not Date?.Equals(d, DateTimePicker1.Tag) Then
    '        DateTimePicker1.Tag = d
    '        TextBox1.Text = If(DateTimePicker1.Checked, DateTimePicker1.Text, "")
    '    End If
    'End Sub
End Class

編集 削除
タメ子  2009-08-07 21:03:00  No: 142345  IP: 192.*.*.*

魔界の仮面弁士様
ご教授ありがとうございます。

わかっていませんでしたら、ごめんなさい。

これは日付を選択しなくても、ValueChangedイベントに入ってきた時点でChecked=Trueになります。
なので、判定ができないのです。

また、ValueChangedイベントだと同じ日付を選択した場合には発生しません。
例えば、テキストを空白に設定して、DateTimePickerで以前に選択していた日付をクリックしてもこのイベントには入ってきません。
ここが難点です・・・。

編集 削除
魔界の仮面弁士  2009-08-07 23:29:30  No: 142346  IP: 192.*.*.*

済みません、余計なコードを書いてしまったのがいけなかったようです。

TextBox 等で空日付を表現するのではなく、そのまま標準の動作である
Checked のみで空日付を表してはどうか、という程度の意図です。

ドロップダウン時に Checked = True にはなりますが、その変化は
ユーザーの目にも明らかなので、使い勝手は兎も角、混乱は無いと思います。

> ValueChangedイベントだと同じ日付を選択した場合には発生しません。
> テキストを空白に設定して
先のコードでは、意図的に ValueChanged イベントをコメントアウトし、
また、テキストボックスも編集不可にしています。
(TextBox での空日付表現を意図したコードでは無いため)


ただ、それでは望んでいる回答ではないと思いますので、さらに別案。


(案1) 日付表示用の TextBox が空日付状態であった場合には、
    (On)DropDown の時点で現在の Value を調べておき、その後の
    (On)CloseUp の段階で、Value が変化したかどうかを調べる。
    Value が変化していなければ、TextBox を空日付のままにしておき、
    Value が変化していれば、変化後の日付を TextBox に転記する。


(案2) ドロップダウン用のボタンを別途用意し、MonthCalendar の表示を
  切り替えるような実装にする。日付入力部は、ShowUpDown な DateTimePicker か、
  または MaskedTextBox や TextBox などで代用する。もしもドロップダウンを
  フォームの領域外にまで広げたいのであれば、MonthCalendar を
  別の枠無しフォームに載せることで代用する。

編集 削除
タメ子  2009-09-07 11:47:22  No: 142347  IP: 192.*.*.*

魔界の仮面弁士様

返信がたいへん遅くなり申し訳ありません。
ご提案下さった案で、今、2を試したところ、思うような実装が
できました。
特にMaskedTextBox を使用してユーザーの方に提案しましたところ、
非常に喜んで頂けましたので、只今からテストに入ることが出来ます。
(この部分の実装をずっと置きっ放しにしていました (汗 )

読ませて頂き、案2の方を採用しましたが、案1は試していないので、
こちらも試して勉強させて頂きます。

代用と言うと失礼かもしれませんが、広い目を持って色々な工夫が
できるようにならないと思いました。

ありがとうございました。

編集 削除
タメ子  2009-09-07 11:48:18  No: 142348  IP: 192.*.*.*

魔界の仮面弁士様の案2で対応の解決に至りました。
ありがとうございました。

編集 削除