2017-01-20 8 views
0

データベースからテキストボックスとdatetimepickerにデータを表示しています。しかし、レコードのいくつかは空であり、datetimepickerには表示できませんでした。私はdatetimepickerでnullを設定するために空の日付をすべてトラップしたい。これまでのところ、私はこのコードを持っている:C#でdatetimepickerの無効な値をトラップ

if ((myReader["Born"].ToString()) == "" &&  (myReader["Died"].ToString()) != "" && (myReader["Interment"].ToString()) != "") 
       { 
        textBox1.Text = (myReader["Surname"].ToString()); 
        textBox2.Text = (myReader["FirstName"].ToString()); 
        textBox3.Text = (myReader["MI"].ToString()); 
        textBox4.Text = (myReader["Sex"].ToString()); 
        dateTimePicker1.Format = DateTimePickerFormat.Custom; 
        dateTimePicker1.CustomFormat = " "; 
        dateTimePicker2.Value = Convert.ToDateTime(myReader["Died"].ToString()); 
        textBox7.Text = (myReader["Age"].ToString()); 
        dateTimePicker3.Value = Convert.ToDateTime(myReader["Interment"].ToString()); 
        textBox9.Text = (myReader["Area"].ToString()); 
       } 
       else if ((myReader["Died"].ToString()) == "" && (myReader["Born"].ToString()) != "" && (myReader["Interment"].ToString()) != "") 
       { 
        textBox1.Text = (myReader["Surname"].ToString()); 
        textBox2.Text = (myReader["FirstName"].ToString()); 
        textBox3.Text = (myReader["MI"].ToString()); 
        textBox4.Text = (myReader["Sex"].ToString()); 
        dateTimePicker1.Value = Convert.ToDateTime(myReader["Born"].ToString()); 
        dateTimePicker2.Format = DateTimePickerFormat.Custom; 
        dateTimePicker2.CustomFormat = " "; 
        textBox7.Text = (myReader["Age"].ToString()); 
        dateTimePicker3.Value = Convert.ToDateTime(myReader["Interment"].ToString()); 
        textBox9.Text = (myReader["Area"].ToString()); 
       } 
       else if ((myReader["Interment"].ToString()) == "" && (myReader["Born"].ToString()) != "" && (myReader["Died"].ToString()) == "") 
       { 
        textBox1.Text = (myReader["Surname"].ToString()); 
        textBox2.Text = (myReader["FirstName"].ToString()); 
        textBox3.Text = (myReader["MI"].ToString()); 
        textBox4.Text = (myReader["Sex"].ToString()); 
        dateTimePicker1.Value = Convert.ToDateTime(myReader["Born"].ToString()); 
        dateTimePicker2.Value = Convert.ToDateTime(myReader["Died"].ToString()); 
        textBox7.Text = (myReader["Age"].ToString()); 
        dateTimePicker3.Format = DateTimePickerFormat.Custom; 
        dateTimePicker3.CustomFormat = " "; 
        textBox9.Text = (myReader["Area"].ToString()); 
       } 
+2

DTPはヌル/空の日付を受け入れません – Plutonix

+0

データベースに日付または文字列として格納されていますか? – Peter4499

+0

strings @ Peter4499 –

答えて

-1

が強くコードをリファクタリング勧め、あなたは3回繰り返し、コードのほとんど同一のブロックを持って読み、コードはまさにこだわり困難にしています。同じ部分を分割し、異なる部分のみをif節に入れます。

実際の問題を解決するように、このような作業をする必要があります:

setDateTimerPickerValueIfExists(dateTimePicker1, myReader["Born"]); 
setDateTimerPickerValueIfExists(dateTimePicker2, myReader["Died"]); 

//.. 

private void setDateTimerPickerValueIfExists(DateTimePicker dateTimePicker, xxxxxxxReader reader) { 
    if (reader != null) { 
     dateTimePicker.Value = Convert.ToDateTime(reader.ToString()); 
    } 
} 
+0

私はここに新しいですが、なぜdownvoteですか? o_O答えが悪いまたは間違っている場合は、理由を知ることがうれしいです。 – JanErikGunnar

+0

私はあなたにdownvoteをしませんでしたが、これがどこにDateTimePickerをnullに設定するかわかりません。私はまだそれが可能ではないはずなので、OPがおそらくそれをヌルに設定している方法を理解しようとしていますが、わかります。 – KSib

+0

質問とディスカッションを20回以上読んだあと、問題はもっと多くのケースを捕まえたいと思っています。私は "null"に設定すると、元のコードのようにデフォルト値(カスタムフォーマットとして ""設定)を保持して隠すことを意味すると思います。私はこれに基づいて新しい答えを提出しました。 – JanErikGunnar

0

は、「私はこれまでのところ、私はこのコードを持っているトラップのDateTimePickerにnullを設定するには、すべての空の日付にしたい。」 - 以下のコードを元のコードと同じことを行いますが、無効な日付の追加のケースを処理する必要があります。

"このコードは動作しますが、datetimepickerをnullに設定することはできますが、完全ではなく、長すぎます。最小化して完全に無効にしたいです。 元のコードではnullに設定されていません。以下のコードは同じことを行います。

"私はそれを最小限に抑え、完全に無効なトラップをしたい" - これは以下のコードが何であるかである。

textBox1.Text = myReader["Surname"].ToString(); 
textBox2.Text = myReader["FirstName"].ToString(); 
textBox3.Text = myReader["MI"].ToString(); 
textBox4.Text = myReader["Sex"].ToString(); 
textBox7.Text = myReader["Age"].ToString(); 
textBox9.Text = myReader["Area"].ToString(); 
trySetDateTimePickerValue(myReader["Born"], dateTimePicker1); 
trySetDateTimePickerValue(myReader["Died"], dateTimePicker2); 
trySetDateTimePickerValue(myReader["Interment"], dateTimePicker3); 

// ... 

public void trySetDateTimePickerValue(DateTimePicker dateTimePicker, SomeTypeOfReader reader) 
{ 
    if (reader != null) 
    { 
     string cleanDate = reader.ToString().Trim(); 
     if (cleanDate.Length > 0) // maybe this trim/test is overkill, maybe the TryParse below is sufficient 
     { 
      DateTime parsedDate = DateTime.MinValue; 
      if (DateTime.TryParse(cleanDate, out parsedDate) 
      { 
       dateTimePicker.Value = parsedDate; 
       return; // success - exit method 
      } 
     } 
    } 

    // no valid date in string: 

    // this is the default value if no value is set according to MSDN 
    dateTimePicker.Value = DateTime.Now; 

    // show nothing in the picker (not sure if this is good solution, this is what the original code does) 
    dateTimePicker.Format = DateTimePickerFormat.Custom; 
    dateTimePicker.CustomFormat = " "; 

} 

コードは、元の、悪いオブジェクト名

はまた、コードは、日付時刻の解析だけで(異なるロケールでは異なる動作をする可能性があり、文化的に敏感であることに注意してください(textBox1テキストボックス、TextBox2を、...)を維持します元のコードのように)。必要に応じて、日付の解析メソッドに追加の引数を渡して、カルチャを指定します。

関連する問題