2016-11-24 2 views
0

送信ボタンをクリックしたときに日付や時刻を入力しなかった場合、なぜこのエラーメッセージが表示されるのかを知る手助けは誰にもありますか?C#DateTime送信方法

「System.InvalidOperationException」種類の例外は がmscorlib.dllで発生したが、ユーザーコードの追加情報で処理されていなかった。 のNullableオブジェクトが値を持っている必要があります。

Error

int result1 = this.startDate.SelectedDate.Value.Date.CompareTo(DateTime.Now.Date); 
     int result2 = this.endDate.SelectedDate.Value.Date.CompareTo(this.startDate.SelectedDate.Value.Date); 

     if (result1 >= 0 && result2 > 0) 
     { 
      //To Do navigate to sprint dashboard 
      // var userProjects = new UserStory(); 
      //var sprintDashboardPage = new SprintDashboardPage(usersProjects); 
      //var mainWindow = this.GetWindow() as MainWindow; 
      //mainWindow.MainFrame.Navigate(sprintDashboardPage); 
      this.ErrorMessage = "Date is VALID"; 
      this.CloseWindow(); 
     } 
     else 
     { 
      this.ErrorMessage = "Choose Valid Date"; 
     } 
+0

詳細を知らないと難しいので、nullインスタンスを識別するためにアプリケーションをデバッグする価値があります。私はあなたが[DatePicker'](https://msdn.microsoft.com/en-us/library/system.windows.controls.datepicker.aspx)を使用していると思います。そうであれば、 SelectedDate'プロパティは 'null'であり、@AramKocharyanが指摘したように、それを使用する前にチェックする必要があります。 – rucamzu

答えて

1

あなたはまずそのHasValueプロパティが返すtrueをチェックせずにNullable<>Valueプロパティを呼んでいます。 DateTime戻すために必要とされるように

1

例外は、DateTime?(NULL可能日時)の.Valueプロパティにスローされますが、ありますので、それは何のDateTimeは返さないようにすることはできません。

Nullable型のプロパティ.Valueにチェックを付けずにアクセスすることは悪い考えです。ヌルチェックコードの追加を検討する必要があります。 (例えば、HasValueプロパティの場合)

+0

これを行うにはどうしますか? 'Nullable MyNullableDate; int result1 = this.startDate.SelectedDate.Value.Date.CompareTo(MyNullableDate.Now.Date); '' - これを試みましたが、' NOW'の下にエラーメッセージが表示されています。@Amer – xasmer

+0

@xasmer、 'これ。 startDate.SelectedDate'はすでに 'Nullable 'です。あなたはそれを使用する前に 'this.startDate.SelectedDate.HasValue'を呼び出す必要があります!上記のコメントでは、2番目の 'Nullable 'を導入しましたが、使用する前にnullをチェックしていませんでした! – Adrian

2

this.startDate.SelectedDateは、Nullable<DateTime>です。これは、あなたがthis.startDate.SelectedDateかどうかを確認しなければならないことを意味やってそれを使用する前に、割り当てられた値を持っています

if(this.startDate.SelectedDate.HasValue) { 
    this.startDate.SelectedDate.Value.Date.CompareTo(DateTime.Now.Date); 
} 

次のようにも動作します:this.endDate.SelectedDateにアクセスするとき

if(this.startDate.SelectedDate != null) { 
    this.startDate.SelectedDate.Value.Date.CompareTo(DateTime.Now.Date); 
} 

同じことが適用されます。

C#では、DateTimeは値の種類であり、常に値が割り当てられている必要があります。つまり、nullに設定することはできません。デフォルト値はDateTime.MinValueです。 Int32(またはint)は、値タイプの別の例であり、デフォルト値は0です。

値タイプをnullにするには、Nullable<>でラップすることができます。これは、値にアクセスする前に値が割り当てられているかどうかを明示的にチェックする必要があることを意味します。そうしないと、InvalidOperationExceptionがスローされます。

WPFのDateTimeピッカーコントロールはNullable<DateTime>オブジェクトを返します。これにより、ユーザーが実際にコントロール内の値を選択したかどうかを知ることができます.Null以外の値が設定されます。

+0

ビルトインは、何かがValueTypeであるかどうかとは関係ありません。それを提案すると、あなたが解散するよりも混乱が起こる可能性があります。 –

+0

@ジョンハンナ、ありがとう。私は舌の先端にある名前があることを知っていましたが、Googleがそれを検索しようとしても私は逃げ出していました。だから誰かが私を是正してくれることを期待していた。私は正しい記述を含めるように更新しました。 – Adrian

関連する問題