当用户与DateTimePicker控件交互时引发了什么事件?

我是c#的新手,在我的程序中使用DateTimePicker Value更改了事件,但我发现当用户点击箭头时也会发生ValueChanged事件,或者如果以编程方式更改了值,我只想识别DateTimePicker的用户交互(不是以编程方式更改值时,有没有办法做到这一点?

是的,请查看MSDN文档 。 特别是OnValueChanged事件

您将需要使用此事件连接您的控件:

在构造函数方法中:

 dateTimePickerControl.ValueChanged += new EventHandler(picker_ValueChanged); 

这是方法签名:

 void f_ValueChanged(object sender, EventArgs e) { //Do whatever you need when the value changes here } 

您也可以从设计师那里做到这一点。 如果转到“属性”,然后转到“事件”部分,则会列出所有事件。 只需双击,它就会为您创建方法签名和连线。

更新到您的更新

如果您特别想要检查这是否是程序化更改,那么您希望执行以下操作:

在类中创建一个全局变量

Boolean isProgrammaticEvent = false ;

在您的程序化更改之前:

  isProgrammaticEvent = true;  //Change picker value 

在您的活动布线中:

  void f_ValueChanged(object sender, EventArgs e)  {    Boolean isThisProgrammatic = isProgrammaticEvent;    isProgrammaticEvent = false;    if(isThisProgrammatic)      return;    //Do whatever you need when the value changes here  } 

您可以关闭DropDown事件上的事件处理程序,并在用户在CloseUp事件中关闭下拉日历时将其重新打开:

 private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { this.Text = dateTimePicker1.Value.ToString(); } private void dateTimePicker1_DropDown(object sender, EventArgs e) { dateTimePicker1.ValueChanged -= dateTimePicker1_ValueChanged; } private void dateTimePicker1_CloseUp(object sender, EventArgs e) { dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged; dateTimePicker1_ValueChanged(sender, e); } 

这可以防止在用户在下拉过程中滚动日历时触发ValueChanged事件。

要以编程方式更改日期而不触发事件,请使用相同的概念:

 private void ProgramChangesDateTime(DateTime dt) { dateTimePicker1.ValueChanged -= dateTimePicker1_ValueChanged; dateTimePicker1.Value = dt; dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged; } 

您可以从DateTimePicker派生以了解用户何时进行了更改:

 class DateTimePickerUser : DateTimePicker { private bool userSetValue; public bool UserSetValue { get { return userSetValue; } } public DateTimePickerUser() { userSetValue = true; } public new DateTime Value { get { return base.Value; } set { userSetValue = false; base.Value = value; userSetValue = true; } } } 

Form上使用DateTimePickerUser ,只需检查ValueChanged事件中的标志:

  private void dateTimePickerUser1_ValueChanged(object sender, EventArgs e) { if (dateTimePickerUser1.UserSetValue) this.Text = "User changed value."; else this.Text = "Code changed the value."; } 

这与Justin Pihony的例子类似,但你不需要自己设置标志,只需依靠这个控件即可。