ValidateEx設定時でも矢印キーで無効な日付2007/02/29が表示される
対象製品
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. カレットを日付数値に移動し、上矢印キーを押す。
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;
}
}
または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