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)
是的,请查看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)