2013-02-21 47 views
0

幫助,請?!這個問題是因爲我有一個使用datetimepicker控件的舊用戶控件。如果沒有日期顯示在datetimepicker的文本框中,那麼.Value屬性設置爲DateTimePicker.MinimumDateTime。如果.Value是DateTimePicker.MinimumDateTime,OnValueChanged會將CustomFormat更新爲「」。否則,CustomFormat是「yyy-MM-dd hh:mm:ss tt」。如何以編程方式關閉datetimepicker的下拉日曆或更新下拉日曆以反映.Value屬性?

問題==>在DropDown事件中,我檢查最小日期時間。如果.Value等於那個,那麼我將.Value更新爲DateTime.Now。顯示下拉日曆時,日曆設置爲1753-01-01,而文本框(.Value)顯示DateTime.Now。

如何讓日曆顯示與在DropDown事件中更新的.Value屬性相對應的日期?即使在DateTimePicker的值從DateTimePicker.MinimumDateTime更改爲DateTime時,有一種方法可以'取消'DateTimePicker上的第一個DropDown事件。現在我認爲可以工作,因爲第二次(以及後續時間)的下拉列表日曆顯示日曆正確匹配文本框(DateTimePicker.Value)中顯示的日期。

這裏是我已經有問題連入的DateTimePicker事件的代碼:

private void ValueDatetimePickerOnKeyUp(Object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode != Keys.Delete && e.KeyCode != Keys.Back) 
      return; 
     var dp = (DateTimePicker)sender; 
     if (dp == null) 
      return; 
     dp.Value = DateTimePicker.MinimumDateTime; 
    } 

    private void ValueDatetimePickerDropDown(Object sender, EventArgs e) 
    { 
     var dp = (DateTimePicker)sender; 
     if (dp == null) 
      return; 
     if (dp.Value == DateTimePicker.MinimumDateTime) 
      dp.Value = DateTime.Now; 
    } 

    private void ValueDatetimePickerValueChanged(Object sender, EventArgs e) 
    { 
     var dp = (DateTimePicker)sender; 
     if (dp == null) 
      return; 
     dp.CustomFormat = dp.Value == DateTimePicker.MinimumDateTime ? " " : "yyyy-MM-dd hh:mm:ss tt"; 
    } 
+0

當您更新.Value屬性時,是否可以更新.Text屬性?只是一個想法 – user959729 2013-02-21 23:40:07

+0

@ user959729 - 謝謝你的迴應。 .Text屬性不是問題。 .Value更新爲DateTime.Now時,它將在文本框中顯示當前日期/時間。問題是下降的日曆認爲它是1753年1月1日,因爲那是在我在DropDown事件中更新它之前的.Value屬性的值。我需要一種方法讓日曆與文本框(.Text和.Value)顯示相同的年份,月份,日期。我希望我很清楚。我覺得我在圈子裏說話。讓我知道你是否需要更多信息。再次感謝。 – 2013-02-21 23:48:07

+0

您是否嘗試過調用.Invalidate()?這將迫使控制器繪製並希望具有正確的值。你也可以嘗試一下beginUpdate()和endUpdate()。更多的想法。我還沒有測試任何這 – user959729 2013-02-21 23:56:32

回答

1

我已經有一段時間摸不着頭腦。這有點古怪,但基本上在datetimepicker的DropDown事件處理程序中將ShowUpDown設置爲true,然後調用特殊事件處理程序以將ShowUpDown設置爲false。這將關閉下拉日曆並強制用戶再次打開它,然後在日曆上顯示正確的日期而不是1/1/1753。 OnKeyUp事件處理程序只允許用戶在點擊DEL或Backspace鍵時清空datetimepicker的文本框值。

private void ValueDatetimePickerOnKeyUp(Object sender, KeyEventArgs e) 
    { 
     //if user presses backspace or delete key then clear the date/time 
     if (e.KeyCode != Keys.Delete && e.KeyCode != Keys.Back) 
      return; 
     var dp = (DateTimePicker)sender; 
     if (dp == null) 
      return; 
     dp.Value = DateTimePicker.MinimumDateTime; 
    } 

    private void ValueDatetimePickerCloseUp(Object sender, EventArgs e) 
    { 
     var dp = (DateTimePicker) sender; 
     if(dp == null) 
      return; 
     dp.ShowUpDown = false; 
    } 

    private void ValueDatetimePickerDropDown(Object sender, EventArgs e) 
    { 
     var dp = (DateTimePicker)sender; 
     if (dp == null) 
      return; 
     if (dp.Value == DateTimePicker.MinimumDateTime) 
     { 
      dp.Value = DateTime.Now; 
      dp.ShowUpDown = true; 
      Invoke((MethodInvoker) (() => ValueDatetimePickerCloseUp(dp, new EventArgs()))); 
     } 
    } 

    private void ValueDatetimePickerValueChanged(Object sender, EventArgs e) 
    { 
     var dp = (DateTimePicker)sender; 
     if (dp == null) 
      return; 
     dp.CustomFormat = dp.Value == DateTimePicker.MinimumDateTime ? " " : "yyyy-MM-dd HH:mm:ss tt"; 
    } 
0

創建自己的控制和補充一點:

#region IsInputKey(Keys keyData) 
     protected override bool IsInputKey(Keys keyData) 
     { 
      if (keyData == Keys.Tab 
       //|| keyData.Equals(Keys.Up) 
       //|| keyData.Equals(Keys.Down) 
       //|| keyData.Equals(Keys.Left) 
       //|| keyData.Equals(Keys.Right) 
       || keyData.Equals(Keys.Enter) 
       || keyData.Equals(Keys.Escape) 
       || keyData.Equals(Keys.Space) 
       ) 
       return true; 

      return base.IsInputKey(keyData); 
     } 
     #endregion 

這將允許要傳遞keydown事件的所有鍵。 ; D hf !!! 並使用其他控件太多,如TextBox,DataGridView等

相關問題