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

use*_*690 5 .net c# datetimepicker winforms

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

Lar*_*ech 10

您可以关闭事件上的事件处理程序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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

private void ProgramChangesDateTime(DateTime dt) {
  dateTimePicker1.ValueChanged -= dateTimePicker1_ValueChanged;
  dateTimePicker1.Value = dt;
  dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged;
}
Run Code Online (Sandbox Code Playgroud)


Jus*_*ony 5

是的,请查看MSDN文档.特别是这个OnValueChanged事件

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

在构造函数方法中:

dateTimePickerControl.ValueChanged += new EventHandler(picker_ValueChanged);
Run Code Online (Sandbox Code Playgroud)

这是方法签名:

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

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

更新到您的更新

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

在类中创建一个全局变量

    Boolean isProgrammaticEvent = false;

在您的程序化更改之前:

   

 isProgrammaticEvent = true;
    //Change picker value
Run Code Online (Sandbox Code Playgroud)

在您的活动布线中:

   

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