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

时间:2012-03-20 02:57:14

标签: c# .net winforms datetimepicker

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

4 个答案:

答案 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">