Какое событие возникает, когда пользователь взаимодействует с элементом управления DateTimePicker? - PullRequest
5 голосов
/ 20 марта 2012

Я новичок в c #, в моей программе я использую DateTimePicker Событие изменения значения, но я обнаружил, что событие ValueChanged происходит, когда пользователь нажимает на стрелку или если значение также изменяется программно, я хочу идентифицировать только взаимодействия пользователя DateTimePicker (не когда значение изменяется программно), есть ли способ сделать это?

Ответы [ 3 ]

9 голосов
/ 20 марта 2012

Вы можете отключить обработчик событий для события 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;
}
5 голосов
/ 20 марта 2012

Да, посмотрите документацию MSDN . Особенно, событие 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
    }
1 голос
/ 20 марта 2012

Вы можете получить из 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.";
    }

Это похоже на пример Джастина Пихони, но вам не нужно устанавливать флаг самостоятельно, просто положитесь на этот элемент управления, чтобы сделать это.

...