2012-06-29 51 views
0

通常,我希望用戶選擇開始日期和結束日期。但僅僅選擇日期是不夠的,我們也必須改變數據。處理兩個DateTimePicker太容易出錯?

默認情況下,DateTimePicker.Value就像

Value 1: 2012-01-01 10:12:09 
Value 2: 2012-01-02 10:12:09 

當用戶選擇兩個日期,應該是顯而易見的,他的意思

Value 1: 2012-01-01 00:00:00 
Value 2: 2012-01-02 23:59:59 

我常常忘記做非直觀

DateTime start = dateTimePicker1.Value.Date; 
DateTime finish = dateTimePicker2.Value.Date.AddDays(1).AddSeconds(-1); 

你發現了什麼更有效的方法來處理這個問題?

+4

我認爲你的方式非常有效。在代碼中寫一個簡短的評論應該沒問題。 –

+0

我不一定同意的唯一的事情是「應該是顯而易見的」部分,並從完成日期減去一秒鐘。數據大於或等於開始的數據有什麼問題,並且少於結束?那麼你就不會失去那一秒鐘發生事情的情況。如果這不是你的用例,那麼很好 - 這只是我發現偶爾會導致一個難以發現的錯誤。 –

+1

@WonkotheSane我同意你的意見。兩種方式都是相同的,但保持一致是關鍵。這就是爲什麼我認爲DateTimePickers應該有一個可設置的屬性,說明你需要日期的開始或結束。這將創建一個標準,因此,提高一致性 – Mathieu

回答

1

如果您使用DateTimePicker對象很多,可以創建兩個小自定義類:a StartDateTimePickerEndDateTimePicker。每個類將從DateTimePicker派生,並且在OnValueChanged事件中僅具有布爾值和EventHandler。該事件將在設置後用於調整該值,並且該布爾值將用於實現Balking Pattern。下面是StartDateTimePicker的例子:

public class StartDateTimePicker : DateTimePicker 
{ 
    bool handling = false; 

    // Note: 
    public StartDateTimePicker() 
     : base() 
    { 
     // This could be simplified to a lambda expression 
     this.ValueChanged += new EventHandler(StartDateTimePicker_ValueChanged); 
    } 

    void StartDateTimePicker_ValueChanged(object sender, EventArgs e) 
    { 
     // If the value is being changed by this event, don't change it again 
     if (handling) 
     { 
      return; 
     } 
     try 
     { 
      handling = true; 
      // Add your DateTime adjustment logic here: 
      Value = Value.Date; 
     } 
     finally 
     { 
      handling = false; 
     } 
    } 
} 

你會然後簡單地取代一般DateTimePicker對象使用這些,你就不必擔心確保日期進行適當調整了。

您需要花費時間來編寫EndDateTimePicker類(上面已經是功能齊全的StartDateTimePicker),但隨着您在更多地方使用它們,它會讓事情更輕鬆。

+2

我建議將兩者結合到一個'DateRangePicker'中。 –