ValidateEx設定時でも矢印キーで無効な日付2007/02/29が表示される

文書番号 : 25510     文書種別 : 不具合     最終更新日 : 2008/03/13
文書を印刷する
対象製品
InputMan for .NET 4.0J Windows Forms Edition
発生環境
動作環境と同じ
状況
修正済み
詳細
この問題はDateコントロールで発生します。以下の手順でコントロールを操作すると、ValidateModeがValidateExに設定されている場合でも無効な日付「2007/02/29」が表示されます。
1. 入力書式を「yy/MM/dd」、表示書式を「yyyy/MM/dd」に設定する。
2. アプリケーションを実行し、コントロールに日付「2007/02/28」を入力する。
3. カレットを日付数値に移動し、上矢印キーを押す。
回避方法
この問題を修正した修正版(v4.0.2008.0415)をご利用ください。こちらからダウンロードできます。

またはDateコントロールのSpinUpイベントをハンドルし、ここで日付の有効性を検証します。日付が無効な場合にはコントロールの文字列から次の日付を算出して設定します。

[VB]
Private Sub Date1_SpinUp( ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Date1.SpinUp

  Dim d As DateTime

  ' 日付文字列の有効性を検証し、無効の場合について処理します。
  If Not DateTime.TryParse( Date1.Text, d )
  
    ' カレットの位置を保存します。
    Dim caretPos As Int32 = Date1.SelectionStart
    
    Dim prevDate, newDate As DateTime
    
    ' 日付文字列からスピンアップ操作前の日付を作成します。
    Dim strDate As String = Date1.Text
    ' 日付数値を抽出します
    Dim numDate As Int32 = Int32.Parse( strDate.Substring( strDate.Length - 2, 2 ) )
    ' 日付数値を1減じます
    numDate = numDate - 1
    ' 減じた日付数値を貼り合わせ、日付文字列を作成します。
    strDate = strDate.Substring( 0, strDate.Length - 2 ) + numDate.ToString( "00" )
    prevDate = DateTime.Parse( strDate )
    
    ' 次の日付を取得します。
    newDate = prevDate.AddDays( 1 )
    ' 次の日付を設定します。
    Date1.Value = newDate
    ' カレットの位置を復元します。
    Date1.SelectionStart = caretPos
    
  End If

End Sub

[C#]
private void date1_SpinUp( object sender, EventArgs e )
{
  DateTime d;
  
  // 日付文字列の有効性を検証し、無効の場合について処理します。
  if(! DateTime.TryParse( date1.Text, out d ) )
  {
    // カレットの位置を保存します。
    int caretPos = date1.SelectionStart;
    
    DateTime prevDate, newDate;
    
    // 日付文字列からスピンアップ操作前の日付を作成します。
    string strDate = date1.Text;
    // 日付数値を抽出します。
    int numDate = Int32.Parse( strDate.Substring( strDate.Length - 2, 2 ) );
    // 日付数値を1減じます。
    numDate--;
    // 減じた日付数値を貼り合わせ、日付文字列を作成します。
    strDate = strDate.Substring( 0, strDate.Length - 2 ) + numDate.ToString( "00" );
    prevDate = DateTime.Parse( strDate );
    
    // 次の日付を取得します。
    newDate = prevDate.AddDays( 1 );
    // 次の日付を設定します。
    date1.Value = newDate;
    // カレットの位置を復元します。
    date1.SelectionStart = caretPos;
  }
}
キーワード
INMN06697

この文書は、以前は次のバグレポートIDで公開されていました : 7394