我如何只监听来自用户输入的 DateTimePicker ValueChanged 事件

How do I only listen for DateTimePicker ValueChanged Event from user input

我使用 DateTimePicker 输入事件将最大日期设置为昨天的日期,因为我无法控制用户是否决定让应用程序打开几天。

我还使用 DateTimePicker ValueChanged 事件根据所选日期调整我的对话。

我遇到的问题是,每次通过Enter Event调整Max Date时,ValueChanged Event也会被调用,从DateTimePicker中获取的值不是用户值。我可以做些什么来只监听用户的输入变化吗?

DateTimePicker CloseUp 似乎有帮助,但前提是用户使用日历选择日期而不是手动输入日期。

    private void dtpStartDate_Enter(object sender, EventArgs e)
    {
        // Reports cannot be generated later than today.
        dtpStartDate.MaxDate = DateTime.Now.Date.AddDays(-1.0);
    }

    private void dtpStartDate_ValueChanged(object sender, EventArgs e)
    {
        DateTime startDate = dtpStartDate.Value.Date;
        DateTime endDate = dtpEndDate.Value.Date;

        dtp_CustomExclusionFrom.MinDate = startDate;
        dtp_CustomExclusionFrom.MaxDate = endDate;

        dtp_CustomExclusionTo.MinDate = startDate;
        dtp_CustomExclusionTo.MaxDate = endDate;

        foreach (ListViewItem item in lv_CustomExclusionDates.Items)
        {
            String dateString = item.Text;
            DateTime exclusionDate = DateTime.Parse(dateString);

            if (exclusionDate < startDate ||
                exclusionDate > endDate)
            {
                lv_CustomExclusionDates.Items.Remove(item);
            }
        }
    }

我希望 ValueChanged 事件仅由用户触发,而不是由 DateTimePicker 的 MaxDate 更改触发。

使用布尔字段作为标志。

private bool isChangedFromCode = false;


private void dtpStartDate_Enter(object sender, EventArgs e)
{
    isChangedFromCode = true;
    // Reports cannot be generated later than today.
    dtpStartDate.MaxDate = DateTime.Now.Date.AddDays(-1.0);
    isChangedFromCode = false;
}

private void dtpStartDate_ValueChanged(object sender, EventArgs e)
{
    if(isChangedFromCode) { return; }
    // rest of the code here...
}

更新

根据我们在评论中的对话 - 您的 dtpStartDate_Enter 事件处理程序中的代码不是触发 ValueChanged 事件的代码,因为它仅更改 MaxDate 属性 而不是 DateTimePicker.
Value 属性 您需要用该布尔标志包装设置 Value 属性 的代码的任何部分。
事实上,如果您在代码中有多个位置更改值,我可能会将其作为一种方法 - 并且仅使用此方法而不是直接设置 Value 属性:

private void SetDateTimePickerValue(DateTime value)
{
    isChangedFromCode = true;
    dtpStartDate.Value = value;
    isChangedFromCode = false;
}