如何以编程方式关闭datetimepicker的下拉日历或更新下拉日历以反映.Value属性?

请帮忙?! 问题是因为我有一个旧的usercontrol,它使用了datetimepicker控件。 如果datetimepicker的文本框中没有显示日期,则.Value属性设置为DateTimePicker.MinimumDateTime。 如果.Value是DateTimePicker.MinimumDateTime,OnValueChanged会将CustomFormat更新为“”。 否则,CustomFormat是“yyy-MM-dd hh:mm:ss tt”。

问题==>在DropDown事件中,我检查最小日期时间。 如果.Value等于那个,那么我将.Value更新为DateTime.Now。 显示下拉日历时,日历设置为1753-01-01,而文本框(.Value)显示DateTime.Now。

如何让日历显示与DropDown事件中更新的.Value属性相对应的日期? 当值从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"; } 

我有时间想出这个。 它有点hacky,但基本上在datetimepicker的DropDown事件处理程序中将ShowUpDown设置为true,然后调用Closeup事件处理程序将ShowUpDown设置为false。 这将关闭下拉日历并强制用户再次打开它,然后将在日历上显示正确的日期,而不是1/1/1753。 OnKeyUp事件处理程序只允许用户删除datetimepicker的文本框值,如果他们点击DEL或Backspace键。

  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"; } 

创建自己的控件并添加:

 #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等。