我是c#的新手,在我的程序中使用DateTimePicker Value更改了事件,但我发现当用户点击箭头时也会发生ValueChanged事件,或者如果以编程方式更改了值,我想只识别用户的交互DateTimePicker(不是以编程方式更改值时),有没有办法做到这一点?
答案 0 :(得分:9)
您可以关闭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;
}
答案 1 :(得分:5)
是的,请查看MSDN documentation。特别是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
}
答案 2 :(得分:1)
您可以从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;
}
}
}
在DateTimePickerUser
上使用Form
时,只需检查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的例子类似,但您不需要自己设置标志,只需依靠此控件即可。
答案 3 :(得分:0)
您可以检查DateTimePicker控件的焦点属性。如果为假,则可能意味着该值已以编程方式更改。此外,您可以检查日历弹出窗口当前是否打开。
唯一的例外是用户在日期时间选择器中输入的情况。
<input name="target_id[]" type="checkbox" value="548">