Изменение месяца в MonthCalendar запускает событие DateChanged дважды - PullRequest
1 голос
/ 22 декабря 2011

Хейо,

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

Есть идеи?

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

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

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

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

Что-то вроде хака, но сравните строковое значение 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());
  }
}
0 голосов
/ 10 августа 2014

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

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) {
      Calendar1.SelectedDate = Calendar1.VisibleDate;
      //  any additional code optional
}
0 голосов
/ 22 декабря 2011

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

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

Вы копируете код с помощью обработчиков событий?

...