2013-04-03 97 views
0

對DateTimePickers有很多挫折......首先,讓我解釋我的設置。我有2對DateTimePickers。 1是From Date(格式化MM/dd/yyyy),它的對來自Hour(格式化HH和ShowUpDown = true)。除了To Date和To Hour之外,另一對是相同的。他們需要遵守一些規則。管理2對DateTimePicker(From和To)的最佳方法?

  1. 的從拾取器MaxDates永遠不能超過要採摘MaxDates
  2. 如果要一天拾取器選擇(ToDatePicker)是當前的日子,那麼這兩個其MaxDates需要是DateTime.Now.AddHours(1 )。這樣用戶將能夠搜索「當前」小時......例如:如果其當前時間爲4/2/13 10:18 PM,則對於該選擇器對的MaxDate需要是4/2/13 11:00 PM ,因此用戶可以將Value from From選擇器對設置爲4/2/13 10 PM,並將選擇器對設置爲4/2/13 11 PM,從而允許他們搜索晚上10點鐘的18分鐘。

我確定更多,但我筋疲力盡......我想你們會明白。我試着用一些棘手的數據綁定像來實現:

在構造函數:

FromDatePicker.DataBindings.Add(new Binding("MaxDate", ToHourPicker, "MaxDate")); 
ToDatePicker.DataBindings.Add(new Binding("MaxDate", ToHourPicker, "MaxDate")); 
FromHourPicker.DataBindings.Add(new Binding("Value", FromDatePicker, "Value")); 
ToHourPicker.DataBindings.Add(new Binding("Value", ToDatePicker, "Value")); 

DateTime dt = DateTime.Now.Subtract(new Timespan(0, 0, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond)); 
DateTime plusOne = dt.AddHours(1); 

FromDatePicker.MaxDate = dt; 
FromHourPicker.MaxDate = dt; 
ToDatePicker.MaxDate = plusOne; 
ToHourPicker.MaxDate = plusOne; 

在MainForm的Load事件

FromDatePicker.Value = FromDatePicker.MaxDate; 
FromHourPicker.Value = FromDatePicker.MaxDate; 
ToDatePicker.Value = ToDatePicker.MaxDate; 
ToHourPicker.Value = ToHourPicker.MaxDate; 

使用這個配置,它實際上在失敗FromDatePicker.Value = FromDatePicker.MaxDate;與錯誤消息Value of <current day & hour> is not valid. Value should be between MinDate and MaxDate一致,除非我將鼠標移過FromDatePicker那一行上它說MaxDate是相同的<current day & hour> ....

我非常困惑和開放,以改善我得到的,或者如果你們可以想到一個更簡單的方法來實現相同的效果我顯然也喜歡聽到這些建議:P。讓我知道如果你需要更多的

+0

您是否嘗試過類似'DateTime date = FromDatePicker.Value.Date + TimePicker.Value.TimeOfDay;'例如..您需要在查看後實際訪問'FromDatePicker.Date'它你需要看看'FromDatePicker.CustomFormat'屬性.. http://msdn.microsoft.com/en-us/library/system.windows.forms.datetimepicker.aspx – MethodMan

+0

嗯不,我會給那個射擊。另外,爲什麼downvotes?提供了大量的細節,並問了1個確切的問題(爲什麼是例外)和1種模糊的問題,但仍然有效(有沒有更好的方法) – Hershizer33

+0

不知道DownVote我沒有downvote .. – MethodMan

回答

0

所以我實現了我通過極端數據綁定想哈哈......它看起來毛利率,但作品!

首先,我在表單中創建了一個名爲MasterMaxDate的屬性,它將始終爲現在+ 1小時,如問題說明中所述。

public DateTime MasterMaxDate { get; set; } 

然後,我結合的TODATE拾取器對的maxDate屬性到MasterMaxDate:

ToDatePicker.DataBindings.Add(new Binding("MaxDate", this, "MasterMaxDate")); 
ToHourPicker.DataBindings.Add(new Binding("MaxDate", this, "MasterMaxDate")); 

接着,我結合沒有fromdate拾取器對到ToHour拾取器的Value屬性的MaxDate屬性(視Tohour picker是最準確的)。這確保了FromDate從不> ToDate。

FromDatePicker.DataBindings.Add(new Binding("MaxDate", ToHourPicker, "Value")); 
FromHourPicker.DataBindings.Add(new Binding("MaxDate", ToHourPicker, "Value")); 

接下來,(現在的怪一部分),我不得不在一對的價值,是其他每個挑選結合,以確保他們總是同步增長:

FromDatePicker.DataBindings.Add(new Binding("Value", FromHourPicker, "Value")); 
FromHourPicker.DataBindings.Add(new Binding("Value", FromDatePicker, "Value")); 

ToDatePicker.DataBindings.Add(new Binding("Value", ToHourPicker, "Value")); 
ToHourPicker.DataBindings.Add(new Binding("Value", ToDatePicker, "Value")); 

最後,建立MasterMaxDate :

DateTime now = DateTime.Now; 
DateTime dt = DateTime.Now.Subtract(new TimeSpan(0, 0, now.Minute, now.Second, now.Millisecond)); 

MasterMaxDate = dt.AddHours(1); 

它的工作原理!它全部更新並保持同步! (例如:如果我將ToDate選取器更改爲FromDate選取器之前的某個日期,那麼FromDate選取器也會自動更改,以使其停留在ToDate選取器之後。)

現在回想起來,它可能會更容易擁有該對中的每個選擇器都「共享」一個ValueChanged事件並以這種方式處理它,但我很高興我能夠實現這一點。

UPDATE 我必須實現INotifyPropertyChanged爲MasterMaxDate所以它會報告其新值DateTimePickers。例如this中使用的已接受答案示例

0

的DateTime DT = DateTime.Now.Subtract(新的入庫時間(0,0,DateTime.Now.Minute,DateTime.Now.Second,DateTime.Now.Millisecond));

DateTime.Now的每個回調可能是不同的值。時間流逝。你需要這樣做:

 
    DateTime now = DateTime.Now; 
    DateTime dt = now.Subtract(new Timespan(0, 0, now.Minute, now.Second, now.Millisecond)); 

接下來,忘記所有的廢話並使用Date屬性。

DateTime dt = now.Date; // time component is set to 00:00:00 
DateTime plusOne = now.AddHours(1); 

使用這個配置,它實際上對失敗FromDatePicker.Value = FromDatePicker.MaxDate;與Value的錯誤消息一致無效。值應爲MinDate和MAXDATE之間,

This may resolve the problem