Изменение месяца в MonthCalendar дважды запускает событие DateChanged

Эй,

В моем приложении есть стандартный WinForms MonthCalendar с обработчиком, подключенным к событию DateChanged. Всякий раз, когда я меняю дату по дням, нажимая на определенную дату в маленьком календаре, событие срабатывает один раз. Однако всякий раз, когда я меняю дату по месяцам, нажимая ‹ и > в элементе управления, событие срабатывает дважды. Я хочу, чтобы событие запускалось один раз во всех ситуациях.

Любые идеи?

РЕДАКТИРОВАТЬ: я отладил и обнаружил, что SelectedItem или Range одинаковы при первом и втором вызове обработчика. Поэтому мне нужен способ различать первый и второй вызов, но при этом обеспечивать правильную обработку, когда событие срабатывает только один раз.

Был запрошен код обработчика, вот он, но он не имеет ничего общего с многократным срабатыванием события:

List<TimestampInfo> displayTimestamps = databaseManger.QueryForTimestamps(DayPicker.SelectionRange);
if (displayTimestamps == null) return;
TimestampsListBox.Items.Clear();
TimestampsListBox.Items.AddRange(displayTimestamps.ToArray());

person lettucemode    schedule 22.12.2011    source источник
comment
Пожалуйста, поделитесь кодом обработчика события SelectedDateChanged   -  person sll    schedule 22.12.2011
comment
Просто напишите свой обработчик событий, чтобы это не имело значения.   -  person Henk Holterman    schedule 22.12.2011
comment
Кто-то с той же проблемой, что и у вас социальный .msdn.microsoft.com/Forums/en/csharpgeneral/thread/ . Исправление похоже либо на флаг, либо на удаление и добавление события заново.   -  person Carl Winder    schedule 22.12.2011
comment
Карл: Это не та же проблема, я не меняю SelectedDate из кода. Хенк: Что это вообще значит?   -  person lettucemode    schedule 22.12.2011
comment
Событие будет срабатывать по мере изменения месячной части даты, вам нужно будет соответствующим образом обрабатывать то, что происходит в событии, и выводить только то, что вам нужно.   -  person Kev Ritchie    schedule 22.12.2011
comment
Кев: Верно, но почему элемент управления меняет дату дважды, когда пользователь меняет дату один раз, мне непонятно.   -  person lettucemode    schedule 22.12.2011
comment
Очень сложно понять этот вопрос, в Winforms нет события SelectedDateChanged. Вы действительно говорите о WPF?   -  person Hans Passant    schedule 22.12.2011
comment
Ганс: извините, я имею в виду событие DateChanged элемента управления System.Windows.Forms.MonthCalendar.   -  person lettucemode    schedule 22.12.2011
comment
Вам нужно немного обдумать это. Предположим, вы запустили событие только один раз (что и происходит в более поздних версиях Windows). Что, как вы надеетесь, произойдет, если пользователю потребуется прокрутить страницу на два месяца?   -  person Hans Passant    schedule 22.12.2011
comment
Ханс: Пожалуйста, обратитесь к этому изображению: zetcode.com/tutorials/winapi/images/monthcal. jpg С помощью этого элемента управления пользователь не может прокручивать на два месяца одновременно. Пользователь дважды щелкал ‹ или ›, запуская обработчик ровно дважды, по одному разу на каждый щелчок. Это требования.   -  person lettucemode    schedule 22.12.2011
comment
@Frimace - в хорошо написанной системе обработки событий повторяющееся событие Changed не должно вызывать проблем. Это не событие Click.   -  person Henk Holterman    schedule 23.12.2011


Ответы (3)


Несколько хак, но сравните строковое значение SelectionRange с последним событием DataChanged. Просто запустите свой код, если он отличается:

private string _LastRange = string.Empty;

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) {
  if (monthCalendar1.SelectionRange.ToString() != _LastRange) {
    _LastRange = monthCalendar1.SelectionRange.ToString();

    List<TimestampInfo> displayTimestamps = databaseManger.QueryForTimestamps(DayPicker.SelectionRange);
    if (displayTimestamps == null) return;
    TimestampsListBox.Items.Clear();
    TimestampsListBox.Items.AddRange(displayTimestamps.ToArray());
  }
}
person LarsTech    schedule 22.12.2011
comment
Спасибо, это исправляет обработчик, запускаемый дважды, хотя это не предотвращает двойное срабатывание события. Возможно, я подам отчет об ошибке. - person lettucemode; 22.12.2011
comment
@Grimace Как упомянул Ганс, двойное срабатывание события было исправлено в VS2010. MS, вероятно, не собирается исправлять эту проблему в более ранних версиях. - person LarsTech; 22.12.2011
comment
@Grimace Хммм, событие, запускающееся дважды, произошло только в моей версии vs2008, а не vs2010, когда я тестировал ее. Странный. - person LarsTech; 22.12.2011

Я не мог воспроизвести это, пока дважды не подключил обработчик событий.

monthCalendar1.DateChanged += new System.Windows.Forms.DateRangeEventHandler(this.monthCalendar1_DateChanged);
monthCalendar1.DateChanged += new System.Windows.Forms.DateRangeEventHandler(this.monthCalendar1_DateChanged);

Вы кодируете обработчики событий?

person Steve Wellens    schedule 22.12.2011
comment
Обработчик задается только один раз в автоматически сгенерированном файле MainForm.Designer.cs. Вы уверены, что воспроизвели его? Как говорит ОП, событие срабатывает только один раз, если пользователь нажимает дату в календаре, а не кнопки ‹ или ›. - person lettucemode; 22.12.2011
comment
Да, я поймал это. Мне было интересно, не болтался ли он во время клика по дате, что привело бы к странному поведению при клике по месяцу. - person Steve Wellens; 22.12.2011

Попробуй это:

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) {
      Calendar1.SelectedDate = Calendar1.VisibleDate;
      //  any additional code optional
}
person Mel Wolinsky    schedule 10.08.2014