今迄、 MonthCalendar と言うコントロールは使いませんでした。
でも、ネット上の QA サイトを覗くと、 カレンダーの使用で、 この MonthCalendar の出番が多いみたいですね。
似たものに、DateTimePicker がありますが ... 。
私は、今迄、DateTimePicker は使った事がありましたが、 MonthCalendar は弄りませんでした。
必要に応じてカレンダーがポップアップする DateTimePicker に対して、
最初から、カレンダー表示になる MonthCalendar は便利に見えるのでしょうね。
でも、待って下さい。
元々、用意された背景が異なります。
DateTimePicker は 日付と時刻を、 MonthCalendar は 期間 を、 扱うコントロールです。
その挙動を確かめる為に、 以下のソースを書いて見ました。
実際に、書いて見るのが一番!。 勿論、動かして見て、その動作を自分の目で確かめましょう。.
使うのは、 Visual Basic 2008 SP1 Express Edition です。 Windows 7 SP1 での表示を例示します。.
基本的には、最新版でも変わらないと思いますが、 実行時のカレンダー部分の表示は OS 任せで異なると思います。.
では、コード部分です。
Form デザイナーで、以下の Control を貼り付けます。
MonthCalendar 1、 Label 6 ( 取得用 4 / 画面用 2)、 NumericUpDown 2、 Button 2 です。
NumericUpDown と Button とは、表示サイズを小さく(狭く)しています。.
コードはこれです。 右枠外に飛び出していますので、スクロールして下さい。.
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Period Default
Me.NumericUpDown1.Minimum = 1D
Me.NumericUpDown1.Maximum = 31D
Me.NumericUpDown1.Value = 7D
' Months Default
Me.NumericUpDown2.Minimum = 1D
Me.NumericUpDown2.Maximum = 3D
Me.NumericUpDown2.Value = 1D
' Set Controls
Me.Label1.Text = "SelectionRange.Start"
Me.Label2.Text = "SelectionRange.End"
Me.Label3.Text = "SelectionRange"
Me.Label4.Text = "(Days Incl.Terminals)"
Me.Label91.Text = "Period " & Me.MonthCalendar1.MaxSelectionCount.ToString
Me.Button1.Text = "Set"
Me.Button1.Width = 40
Me.Label92.Text = "Months " & Me.MonthCalendar1.CalendarDimensions.ToString
Me.Button2.Text = "Set"
Me.Button2.Width = 40
End Sub
Private Sub MonthCalendar1_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged
Me.Label1.Text = "SelectionRange.Start : " & Me.MonthCalendar1.SelectionRange.Start.ToString()
Me.Label2.Text = "SelectionRange.End : " & Me.MonthCalendar1.SelectionRange.End.ToString
Me.Label3.Text = "SelectionRange. : " & vbCrLf & _
Me.MonthCalendar1.SelectionRange.ToString
Me.Label4.Text = "(Days Incl.Terminals) : " & _
(DateDiff(DateInterval.Day, Me.MonthCalendar1.SelectionRange.Start, Me.MonthCalendar1.SelectionRange.End) + 1).ToString
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.MonthCalendar1.MaxSelectionCount = CInt(Me.NumericUpDown1.Value)
Me.Label91.Text = "Period " & Me.MonthCalendar1.MaxSelectionCount.ToString
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.MonthCalendar1.CalendarDimensions = New Size(CInt(Me.NumericUpDown2.Value), 1)
Me.Label92.Text = "Months " & Me.MonthCalendar1.CalendarDimensions.ToString
End Sub
End Class
さて、これを実行すると。
こんな感じの画面が出て来ます。
Piriod が 指定可能な最大日数です。
Months が 画面一斉表示可能な月数です。
各々、MonthCalendar の標準設定の初期値ですね。
piriod に 1 を設定する事で、 期間ではなく1日の選択になります。
あっ、 忘れていました。
Piriod は Me.MonthCalendar1.MaxSelectionCount 。
Months は Me.MonthCalendar1.CalendarDimensions 。
この ふたつに 値を指定する事で、 動作が変わります。
Button Handler で最初に指定している部分ですね。
このコード例では、横1列で3ヶ月までにしましたが、
実際には、縦横で指定が可能です。 詳しくは、Help 等を。.
では、横に3ヶ月にして見ましょう。 Months 右横の NumericUpDown を操作して 3 に変え、Set ボタンを押します。.
カレンダー部分が横長に延びて、Form を飛び出してしまうので、 ここでは、実行時に手動でフレームを 拡げています。
更に、期間を31日に増やしましたので、7/4 からドラッグして 8/15 まで伸ばすと、ちゃんと、31 日分が選択されます。
但し、この MonthCalendar の 悩ましい 処は、
月の左右の矢印 でカレンダーをスライドさせると、選択した日付が変わってしまう事です。
これは、Control の Property を操作しても、 如何様にも対処が出来ません!。
仕様! の ひと言 で、片付けられてしまう みたいですね。 トホホ。
面白いと言うか、変わった 挙動 を示すので、 是非、興味のある方は、このコードで動かして見て下さい。
0 件のコメント:
コメントを投稿