Как прослушать событие DateTimePicker ValueChanged только из пользовательского ввода - PullRequest
0 голосов
/ 25 июня 2019

Я использую событие ввода DateTimePicker для установки максимальной даты на вчерашнюю дату, так как я не контролирую, решит ли пользователь оставить приложение открытым на несколько дней.

Я также использую событие DateTimePicker ValueChanged для настройки моих диалогов на основе выбранных дат.

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я настраиваю Макс. Дату через событие ввода, также вызывается событие ValueChanged, а значение, полученное из 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 будет запускаться только пользователем, а не изменениями MaxDate объекта DateTimePicker.

1 Ответ

2 голосов
/ 25 июня 2019

Используйте логическое поле в качестве флага.

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, а не свойство Value DateTimePicker.
Вам нужно обернуть любую часть вашего кода, которая устанавливает свойство Value, с этим логическим флагом.
На самом деле, я бы, вероятно, сделал бы его методом, если у вас есть несколько мест в коде, которое изменяет значение - и используйте только этот метод вместо прямой установки свойства Value:

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