日付時刻コントロールでは入力可能な範囲を指定したり、値の扱いを制御することができます。ここでは日付時刻コントロールが提供する入力機能について解説します。
日付時刻コントロールでは書式設定により、日付や時刻の入力および表示書式を自由に設定することができます。入力書式は、コントロールが入力フォーカスを受け取ったときの書式で、表示書式は入力フォーカスのないときの書式です。書式には和暦を使用することも可能です。
入力書式の設定は、Fields プロパティによって行われ、フィールドとよばれる入力領域を構成する要素によって定義されます。また、表示書式は、DisplayFields プロパティによって行われ、Fields プロパティと同様フィールドによって定義します。 Fields プロパティおよび DisplayFields プロパティの詳細や書式の設定方法については、「書式の設定」で詳しく解説します。
日付時刻コントロールで入力可能な範囲の指定を指定するには、コントロールのプロパティを使用する方法と、日付時刻検証コンポーネントを使用する方法があります。
コントロールのMaxDate プロパティとMinDate プロパティを設定してコントロールに入力可能な日付範囲を指定することができます。
これらのプロパティを使用する場合、検証は入力中のリアルタイムに行われます。全てのフィールドの値が入力されると検証が行われ、範囲外の日付の場合にはMaxMinBehavior プロパティの設定によって、値が制御されます。 MaxMinBehavior プロパティに設定できる値は以下のとおりで、既定値はMaxMinBehavior.AdjustToMaxMin です。
MaxMinBehaviorの値 | 説明 |
---|---|
AdjustToMaxMin | 値を最小値か最大値の近い方に設定します。 |
Clear | 値を削除してnullにします。 |
Restore | 変更前の値に戻します。 |
CancelInput | 最後の入力をキャンセルしてフォーカスを保持します。 |
Keep | エラーとなったTextプロパティの値を保持します。 |
MaxMinBehavior プロパティをMaxMinBehavior.CancelInput に設定した場合、範囲外の日付の最後の入力を行った時点でInvalidInput イベントが発生します。 InvalidInputイベント側では入力された日付が範囲外であることを取得できるため、メッセージを出力するなどのカスタマイズが可能です。
以下のサンプルコードは、範囲外の日付が入力されたとき、メッセージボックスを表示する例です。
Imports GrapeCity.Win.Editors Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 最大日付と最小日付を設定します。 GcDateTime1.MaxDate = DateTime.Parse("2100/12/31 23:59:59") GcDateTime1.MinDate = DateTime.Parse("2000/1/1 0:00:00") ' 範囲外の場合に値をどのように制御するかを設定します。 GcDateTime1.MaxMinBehavior = MaxMinBehavior.CancelInput End Sub Private Sub GcDateTime1_InvalidInput(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GcDateTime1.InvalidInput Dim InvalidInputEventArgs As InvalidInputEventArgs = TryCast(e, InvalidInputEventArgs) If InvalidInputEventArgs Is Nothing Then Exit Sub End If ' 値が範囲外の場合には、メッセージを表示します。 If InvalidInputEventArgs.ValueOutOfRange Then MessageBox.Show("範囲外の値です。") End If End Sub
using GrapeCity.Win.Editors; private void Form1_Load(object sender, EventArgs e) { // 最大日付と最小日付を設定します。 gcDateTime1.MaxDate = DateTime.Parse("2100/12/31 23:59:59"); gcDateTime1.MinDate = DateTime.Parse("2000/1/1 0:00:00"); // 範囲外の場合に値をどのように制御するかを設定します。 gcDateTime1.MaxMinBehavior = MaxMinBehavior.CancelInput; } private void gcDateTime1_InvalidInput(object sender, EventArgs e) { InvalidInputEventArgs invalidInputEventArgs = e as InvalidInputEventArgs; if (invalidInputEventArgs == null) { return; } // 値が範囲外の場合には、メッセージを表示します。 if (invalidInputEventArgs.ValueOutOfRange) { MessageBox.Show("範囲外の値です。"); } }
日付時刻検証コンポーネントを使用して、日付時刻コントロールに入力可能な日付範囲を指定することができます。検証コンポーネントを利用した場合、範囲外の日付のときに値の制御を行うだけではなく、エラーアイコンを表示したり背景色を変更したりと柔軟なエラー通知機能を利用することが可能です。
検証コンポーネントを利用して入力範囲の検証を行う場合には、以下のいずれかの設定を行う必要があります。
この設定を行わない場合、日付時刻コントロールの入力中に行う検証機能が動作し、検証コンポーネントによる検証が行われません。
日付時刻検証コンポーネントを利用して入力可能な範囲を設定するには、GcDateTimeValidator.InvalidRange クラスを使用し、GcDateTimeValidator.InvalidRange クラスのMaxValue およびMinValue プロパティで、最大日付および最少日付を指定します。
日付時刻検証コンポーネントを使用した範囲設定やエラー通知の詳細については「検証コンポーネント」を参照してください。
Value プロパティを使えば、リテラル文字とプロンプト文字を除いたコントロールの基となる値をDateTime型で取得または設定できます。
リテラル文字とプロンプト文字については「書式の設定」で解説しています。
また、Number プロパティを使えば、リテラル文字列とプロンプト文字列を除いたコントロール内の日付を長整数型で取得または設定できます。たとえば、Text プロパティに「平成 27年10月1日」が設定されているときには、Number プロパティの値は「20151001000000」となります。Number プロパティが変更されると、その変更はDisplayText プロパティとText プロパティ、およびValue プロパティにも適用されます。
クリップボードにリテラル文字を含まない値を渡すには、ClipContent プロパティとSelectedText プロパティを使用します。ClipContent プロパティで制御できるのは、SelectedText プロパティの値のみなので、以下のプロパティの値をクリップボードに設定した場合は、ClipContent プロパティの設定は無効になります。なお、プロンプト文字は、ClipContent プロパティの設定に関わらず常にクリップボードに渡されます。
次のサンプルコードは、ClipContent プロパティを使って、リテラル文字を省いた文字列をクリップボードにコピーする方法を示します。
Imports GrapeCity.Win.Editors ' コントロールに値を設定して、クリップボードにコピーします。 GcDateTime1.Fields.Clear() GcDateTime1.Fields.AddRange("ggg ee年 MM月 dd日 hh時 mm分 ss秒") GcDateTime1.Number = 20131001000000 GcDateTime1.ClipContent = ClipContent.ExcludeLiterals GcDateTime1.SelectionStart = 0 GcDateTime1.SelectionLength = GcDateTime1.Text.Length Clipboard.SetDataObject(GcDateTime1.SelectedText) ' クリップボードのデータを取得して確認します。 Dim cbData As IDataObject = Clipboard.GetDataObject() Label1.Text = cbData.GetData(DataFormats.Text)
using GrapeCity.Win.Editors; // コントロールに値を設定して、クリップボードにコピーします。 gcDateTime1.Fields.Clear(); gcDateTime1.Fields.AddRange("ggg ee年 MM月 dd日 hh時 mm分 ss秒"); gcDateTime1.Number = 20131001000000; gcDateTime1.ClipContent = ClipContent.ExcludeLiterals; gcDateTime1.SelectionStart = 0; gcDateTime1.SelectionLength = GcDateTime1.Text.Length; Clipboard.SetDataObject(gcDateTime1.SelectedText); // クリップボードのデータを取得して確認します。 IDataObject cbData = Clipboard.GetDataObject(); label1.Text = cbData.GetData(DataFormats.Text).ToString();
年月だけ、あるいば時刻部分のみ入力を許可しているなど、非表示に設定されたフィールドが存在する場合、そのデフォルト値には、RecommendedValue プロパティの値が設定されます。非表示フィールドの値は通常、Value プロパティから取得しますが、Value プロパティがnull 参照 (Visual Basic では Nothing)の場合は、RecommendedValue プロパティに設定された値を非表示フィールドに設定します。
RecommendedValue プロパティの既定値はnull 参照 (Visual Basic では Nothing)です。この場合、デフォルト値にはアプリケーション実行後に値がクリアされた日付、時刻が設定されます。
以下のサンプルコードでは、年月だけの入力を許可してRecommendedValue プロパティにデフォルト値を設定しています。この場合、年月の入力が行われると、非表示になっている日と時分秒の部分には、RecommendedValue プロパティに設定された日と時分秒の値が設定されます。
' キーワードから書式を設定します。 GcDateTime1.Fields.Clear() GcDateTime1.Fields.AddRange("yyyy/MM") ' RecommendedValueプロパティに非表示フィールドのデフォルト値を設定します。 GcDateTime1.RecommendedValue = New DateTime(2100, 1, 1, 12, 0, 0) ' ValueプロパティにNothingを設定します。 GcDateTime1.Value = Nothing
// キーワードから書式を設定します。 gcDateTime1.Fields.Clear(); gcDateTime1.Fields.AddRange("yyyy/MM"); // RecommendedValueプロパティに非表示フィールドのデフォルト値を設定します。 gcDateTime1.RecommendedValue = new DateTime(2100, 1, 1, 12, 0, 0); // Valueプロパティにnullを設定します。 gcDateTime1.Value = null;
FieldsEditModeの値 | 説明 |
---|---|
LeftSide | フィールドで値は左から右に入力されます。 |
RightSide | フィールドで値は右から左に入力されます。 |
Unfixed | フィールドで値は左から右に入力されます。 日付や時刻が1桁の値の場合は先頭に0を付加する必要はありません。 (図) 月のフィールドに1を入力した場合、値は1月と認識されます。 |
AcceptsCrLf プロパティを使用してクリップボードへ改行を含む文字列をコピー、または貼り付けた場合の改行コードの扱いを設定できます。AcceptsCrLf プロパティは、CrLfMode 列挙体を使用して次の値を設定できます。
AcceptsCrLfの値 | 説明 |
---|---|
NoControl | 改行コードはそのままでコピー、貼り付けを行います。 |
Filter | 全ての改行コードを削除しコピー、貼り付けを行います。 |
Cut | 最初の改行コード以降の文字列を削除します。標準コントロールと同じ動作です。 |
コントロールに文字列を入力するとTextChanging イベントが、TextChanged イベントの前(入力された文字列がText プロパティに渡される前)に発生します。そのため、このイベント内で入力文字列をチェックすれば、Textプロパティの値に影響を与えることなく、入力を制御できます。