- PR -

DateTimePicker を当月内の年月日入力に使いたい。

1
投稿者投稿内容
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-10-03 10:34
WindowsXP、VB2005EE Access2003 でWindowsアプリケーションを開発中です。
ある年月日項目の設定を設定するのにDateTimePickerを使用しています。この
DateTimePickerの設定年月日の範囲をPC内部タイマーの当月範囲の年月日に制
限したく、次のようにDateTimePicker1_ValueChangedのハンドラーに記述しま
した。ところがメッセージが表示された後[OK]ボタンを押すと、再度連続し
てメッセージが表示され暴走してしまいます。
コード:
    If Now().Year <> DateTimePicker1.Value.Year Or _
       Now().Month <> DateTimePicker1.Value.Month Then
          MessageBox.Show("当月以外の年月日を設定することはできません。")
    End If


ValueChangedを使うことが間違いなのでしょうか。
別の方法がありましたらよろしくご教示下さい。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-10-03 10:40
DateTimePicker の MinDateプロパティと MaxDateプロパティを操作すれば幸せになれると思います。

-----
あ、画面操作中に月が変わったときのことも、一応考えておいたほうがいいかも。

[ メッセージ編集済み 編集者: rain 編集日時 2008-10-03 10:41 ]
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-10-03 10:49
rainさん、昨日は大変ありがとうございました。
おかげさまで、テーブルを新規に作成し、正常に動作させることが出来ました。
また、新たな質問に対して早速お答えいただき、感謝しています。
「DateTimePicker の MinDateプロパティと MaxDateプロパティを操作すれば」
とのご教示、早速設定してみます。

---------10:53-以下を追加しました-----------------------------------
MinDateプロパティに今月の1日と設定できるのでしょうか。設定方法を
ご教示いただければ幸いです。


_________________


[ メッセージ編集済み 編集者: One.net 編集日時 2008-10-03 10:55 ]
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-10-03 11:03
引用:

One.netさんの書き込み (2008-10-03 10:49) より:

MinDateプロパティに今月の1日と設定できるのでしょうか。設定方法を
ご教示いただければ幸いです。



例えばこんな感じ。
ソラで書いたので、文法が間違ってたらすみません。

コード:
DateTimePicker1.MinDate = New Date(Date.Now.Year, Date.Now.Month, 1)
DateTimePicker1.MaxDate = DateTimePicker1.MinDate.AddMonths(1).AddDays(-1)


MaxDateについては、DateTime.DaysInMonthプロパティを使う手もあるか。
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-10-03 11:12
rainさん、ありがとうございます。
私も今、この画面のLoad時に次にょうに書いてうまくいきました
Dim dt1 As DateTime = New DateTime(Year(Now()), Month(Now()), 1)
DateTimePicker1.MinDate = dt1
これからMaxDateを設定してみます。ありがとうございました。


------------1117-以下を追加しました------------------------
MaxDateも以下のように設定し、うまくいきました。助かりました。
Dim dt1 As DateTime = New DateTime(Year(Now()), Month(Now()), 1)
DateTimePicker1.MinDate = dt1
DateTimePicker1.MaxDate = dt1.AddMonths(1).AddDays(-1)


[ メッセージ編集済み 編集者: One.net 編集日時 2008-10-03 11:20 ]
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-10-03 11:50
奇跡的なタイミングでないと発生しないはずなので、
実際に問題になることはないと思いますが、
いちおう以下のようにした方がよいのではないでしょうか?

引用:

One.netさんの書き込み (2008-10-03 11:12) より:
Dim dt1 As DateTime = New DateTime(Year(Now()), Month(Now()), 1)



Dim nowDate As DateTime = Now()
Dim dt1 As DateTime = New DateTime(Year(nowDate), Month(nowDate), 1)

#年の境目の瞬間に実行された場合に
#年は2008/12/31から、月は2009/01/01から取得される事態を避けるため



[ メッセージ編集済み 編集者: よねKEN 編集日時 2008-10-03 11:51 ]
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-10-03 12:49
よねKENさん、ご指導ありがとうございます。
私もrainさんの言われた「画面操作中に月が変わった時の対応?」について月末操作が多く、
気にしていました。

なっるほど現時点の nowDate を取得して、このnowDateで新たな日付を作るのですか。
ありがとうございます。早速書き換えます。
--------13:35-追加記述しました-------------------------------------
投稿してから よねKENさんのご指摘は「画面操作中に月が変わった時の対応?」では
なく、Year(Now())の演算と Month(Now())の演算の間に年度が変わった場合のことでしょうか。
すごいことまで考えなければいけないのですね。確かに発生したら、2008/01/01 となって
しまい何が原因か調査しても解らなくなりますね。

[ メッセージ編集済み 編集者: One.net 編集日時 2008-10-03 13:36 ]
1

スキルアップ/キャリアアップ(JOB@IT)