日付時刻/日付コントロールの入力可能な範囲が1年間の場合、年入力フィールドが非表示でも値のループを禁止したい

文書番号 : 40986     文書種別 : 使用方法     登録日 : 2017/08/25     最終更新日 : 2017/08/25
文書を印刷する
対象製品
InputMan for Windows Forms 10.0J
詳細
日付時刻および日付コントロールで、次の例のように入力可能な範囲を1年間に設定した場合、年入力フィールドを非表示にするとSpin.WrapプロパティがFalseであっても、スピン時に日付の値が12月と1月の間でループします。

[Visual Basic]
GcDateTime1.MaxDate = New DateTime(2015, 12, 31, 0, 0 ,0)
GcDateTime1.MinDate = New DateTime(2015, 1, 1, 0, 0, 0)
GcDateTime1.Fields.Clear()
GcDateTime1.Fields.AddRange("MM/dd")
GcDateTime1.Spin.Wrap = False
[C#]
gcDateTime1.MaxDate = new DateTime(2015, 12, 31, 0, 0, 0);
gcDateTime1.MinDate = new DateTime(2015, 1, 1, 0, 0, 0);
gcDateTime1.Fields.Clear();
gcDateTime1.Fields.AddRange("MM/dd");
gcDateTime1.Spin.Wrap = false;

この動作は、次のようなコントロールの仕様によります。
  • Spin.Wrapプロパティは、日付の値を入力可能な範囲内でループさせるかどうかを設定するもので、各入力フィールドの値のループを制御するためのプロパティではありません。
  • 非表示に設定された入力フィールドの値は、スピン動作によって変化しません。
上記の例では、年入力フィールドが非表示のため、スピン動作によって年の値が変わることはありません。そのため、コントロールの値は常に入力可能な範囲に収まります。
この仕様により、スピン機能を使用すると、Spin.WrapプロパティがFalseであっても日付の値がループします。

上記の例において、12月と1月の間で値のループを禁止したい場合は、TextChangingイベントに以下の処理を実装します。
なお、e.Result.Containsメソッドに指定している文字列は、コントロールの入力書式が「MM/dd」の場合の例です。この文字列は、入力書式に応じて適切に設定する必要があります。

[Visual Basic]
Private Sub GcDateTime1_TextChanging(sender As Object,e As TextChangingEventArgs) Handles GcDateTime1.TextChanging
    If GcDateTime1.Value.HasValue Then
        If GcDateTime1.Value.Value.Month = 1 And e.Result.Contains("12/") Then
            ' 1月から12月へのループを禁止します。
            e.Cancel = True
        ElseIf GcDateTime1.Value.Value.Month = 12 And e.Result.Contains("01/") Then
            ' 12月から1月へのループを禁止します。
            e.Cancel = True
        End If
    End If
End Sub
[C#]
private void gcDateTime1_TextChanging(object sender, TextChangingEventArgs e)
{
    if (gcDateTime1.Value.HasValue) {
        if (gcDateTime1.Value.Value.Month == 1 && e.Result.Contains("12/")) {
            // 1月から12月へのループを禁止します。
            e.Cancel = true;
        }
        else if (gcDateTime1.Value.Value.Month == 12 && e.Result.Contains("01/")) {
            // 12月から1月へのループを禁止します。
            e.Cancel = true;
        }
    }
}
関連情報