none
月の末日の自動取得について RRS feed

  • 質問

  • こんにちは。

    私、ド素人のつむらっちょと申します。

     

    WindowsFormでのことですが、データ処理を行う範囲選択をする為に、

    開始の

    西暦を入力するNumericUpDown→Y1

    月を入力するNumericUpDown→M1

    日を入力するNumericUpDown→D1

     

    終了の

    西暦を入力するNumericUpDown→Y2

    月を入力するNumericUpDown→M2

    日を入力するNumericUpDown→D2

     

    があります。

    現状、

    年を入力する箇所は1~9999

    月を入力する箇所は1~12

    日を入力する箇所は1~31

    が最大値最小値で入っています。

     

    デフォルト値は前回起動時の値を持ってくるのですが、M1が変更された際にそのタイミングで、

    D1を『1』

    Y2はY1と同一値

    M2はM1と同一値

    D3はY1とM1に入力されている年月の末日をセットしたいんですが、出来るんでしょうか?

     

    M1でのMouseUpやEnterキーが押されたことでイベント発生させられるのか、

    もしくは値が変更されたことでイベント発生させられるのか、色々見ているのですが、いまいち分かりません。

     

    どなたかお力を貸して頂けます様よろしくおねがいします。

     

     

     

     

     

     

     

     

     

     

     

     

    2008年7月18日 0:29

回答

  • ValueChangedやKeyUpなどのイベントが使えます。マウスでの貼り付けもありますので、MouseUpなども考慮する必要があります。

     

    NumericUpDown イベント
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.numericupdown_events(VS.80).aspx

     

    ただ、つむらっちょさんの仕様がわからないので何とも言えませんが、ユーザーの使い勝手を考えると、一般的には年、月、日に分けず、年月日で一度に入力する方が楽だと思います。

    2008年7月18日 0:56
    モデレータ
  • 末日を取得する簡単なアルゴリズムは、

     

    1. 年+月+1日でDateTime型を生成

    2. AddMonthメソッドで+1

    3. AddDayメソッドで-1

     

    だと思います。static methodで定義しておくと便利でしょう。

     

    もしくは、DateTime.DaysInMonthメソッドで求める、という方がより簡単かもしれません。

    2008年7月18日 9:24
  •  GX999 さんからの引用

    末日を取得する簡単なアルゴリズムは、

     

    1. 年+月+1日でDateTime型を生成

    2. AddMonthメソッドで+1

    3. AddDayメソッドで-1

     

    だと思います。static methodで定義しておくと便利でしょう。

     

    もしくは、DateTime.DaysInMonthメソッドで求める、という方がより簡単かもしれません。

     

     

    すみません。いまいちコードの書き方が理解できないのですが、

    ValueChangedイベントが発生したときに、Y1とM1の年月から対応する末日(日数)を取得し、

    D2にその末日(日数)をセットするという考え方でよろしいのでしょうか?

    2008年7月22日 7:00
  • つむらっちょさんの仕様が理解できないので、末日を求める一般的なアルゴリズムを提示させていただきました。

     

    それをつむらっちょさんのアプリケーションに組み込むのは、つむらっちょさんの仕様に応じて実装されるものだと思います。それはつむらっちょさんだけが知っていることです。

     

    trapemiyaさんがおっしゃるように、年月日がまとめて入力させるのが一般的だと思います。その場合、DateTimePickerコントロールを利用するでしょう。そのほうが記述するコードは圧倒的に少なくなると思います。

     

    2008年7月22日 8:56
  • つむらっちょさん、こんにちは。

     

     つむらっちょ さんからの引用

    ValueChangedイベントが発生したときに、Y1とM1の年月から対応する末日(日数)を取得し、

    D2にその末日(日数)をセットするという考え方でよろしいのでしょうか?

     

    Y1 年 M1 月 01 日の DateTime のインスタンスを生成。(01 日は固定値)
    AddMonth メソッドで 1 を足しこむ。
    AddDay メソッドで -1 を足しこむ。
    その結果得られた日付は 「翌月の 1 日前」 つまり当月の末日になるという理屈です。


    もしくは DaysInMonth メソッドを使って末日 ・・・ d を取り出し、
    Y1 年 M1 月 d 日の DateTime のインスタンスを生成すれば良いですね。

    2008年7月22日 9:47
  • こんにちは。

    Y1の値とM1の値からDaysInMonthメソッドを使ってM2の末日をもって来れました。

    みなさま有難うございました。

    2008年7月23日 1:53

すべての返信

  • ValueChangedやKeyUpなどのイベントが使えます。マウスでの貼り付けもありますので、MouseUpなども考慮する必要があります。

     

    NumericUpDown イベント
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.numericupdown_events(VS.80).aspx

     

    ただ、つむらっちょさんの仕様がわからないので何とも言えませんが、ユーザーの使い勝手を考えると、一般的には年、月、日に分けず、年月日で一度に入力する方が楽だと思います。

    2008年7月18日 0:56
    モデレータ
  • 末日を取得する簡単なアルゴリズムは、

     

    1. 年+月+1日でDateTime型を生成

    2. AddMonthメソッドで+1

    3. AddDayメソッドで-1

     

    だと思います。static methodで定義しておくと便利でしょう。

     

    もしくは、DateTime.DaysInMonthメソッドで求める、という方がより簡単かもしれません。

    2008年7月18日 9:24
  •  GX999 さんからの引用

    末日を取得する簡単なアルゴリズムは、

     

    1. 年+月+1日でDateTime型を生成

    2. AddMonthメソッドで+1

    3. AddDayメソッドで-1

     

    だと思います。static methodで定義しておくと便利でしょう。

     

    もしくは、DateTime.DaysInMonthメソッドで求める、という方がより簡単かもしれません。

     

     

    すみません。いまいちコードの書き方が理解できないのですが、

    ValueChangedイベントが発生したときに、Y1とM1の年月から対応する末日(日数)を取得し、

    D2にその末日(日数)をセットするという考え方でよろしいのでしょうか?

    2008年7月22日 7:00
  • つむらっちょさんの仕様が理解できないので、末日を求める一般的なアルゴリズムを提示させていただきました。

     

    それをつむらっちょさんのアプリケーションに組み込むのは、つむらっちょさんの仕様に応じて実装されるものだと思います。それはつむらっちょさんだけが知っていることです。

     

    trapemiyaさんがおっしゃるように、年月日がまとめて入力させるのが一般的だと思います。その場合、DateTimePickerコントロールを利用するでしょう。そのほうが記述するコードは圧倒的に少なくなると思います。

     

    2008年7月22日 8:56
  • つむらっちょさん、こんにちは。

     

     つむらっちょ さんからの引用

    ValueChangedイベントが発生したときに、Y1とM1の年月から対応する末日(日数)を取得し、

    D2にその末日(日数)をセットするという考え方でよろしいのでしょうか?

     

    Y1 年 M1 月 01 日の DateTime のインスタンスを生成。(01 日は固定値)
    AddMonth メソッドで 1 を足しこむ。
    AddDay メソッドで -1 を足しこむ。
    その結果得られた日付は 「翌月の 1 日前」 つまり当月の末日になるという理屈です。


    もしくは DaysInMonth メソッドを使って末日 ・・・ d を取り出し、
    Y1 年 M1 月 d 日の DateTime のインスタンスを生成すれば良いですね。

    2008年7月22日 9:47
  • こんにちは。

    Y1の値とM1の値からDaysInMonthメソッドを使ってM2の末日をもって来れました。

    みなさま有難うございました。

    2008年7月23日 1:53