2010-12-30 2 views
1

Пробовал поиск в Интернете, но не может найти ответ.Проблема с событием DateChanged на MonthCalendar

Наличие формы Windows с элементом управления CalendarCalendar и обработкой события DateChanged. проблема связана с изменением месяца щелчком мыши.

Я пробовал иметь значение счетчика, указанное на этикетке, которое подсчитывается каждый раз, когда вызывается обработчик событий. Когда месяц изменяется, обработчик события вызывается 2 раза.

Когда MessageBox.Show («ничего») вызывается при обработке событий, обработчик события, кажется, напомняется несколько раз, и календарь начинает меняться на один месяц назад навсегда.

Знаете ли вы, почему?

После кода в результатах окна формы класса в описанном поведении:

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) 
{ 
    int i = int.Parse(labelDateChanged.Text); 
    labelDateChanged.Text = (i + 1).ToString(); 
    MessageBox.Show(i.ToString()); 
} 

private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e) 
{ 
    int i = int.Parse(labelDateSelected.Text); 
    labelDateSelected.Text = (i + 1).ToString(); 
} 

ответ

3

Не ловить ВСЕ DateChanged события, но решение для обработки DateChanged, KeyUp и MouseUp события.

Событие DateChanged содержит bool IsDateChanged до true. KeyUp и MouseUp проверка событий, если IsDateChanged и выполняет необходимый код + устанавливает IsDateChanged в false.

0

, не видя кода, это трудно точно сказать, в чем проблема, но вполне вероятно, что вы вызываете метод измените дату в ответ на щелчок мышью. Documentation for the DateChanged event говорит,

Событие DateChanged происходит во время любого выбора даты, будь то с помощью мыши, клавиатуры, или код.

Так что событие DateChanged произойдет, когда вы нажмете мышью, чтобы изменить дату. Если ваш код, который обрабатывает щелчок мыши, также изменяет дату, то снова произойдет DateChanged.

Внимательно изучите свой код, чтобы узнать, написано ли вы что-то, задающее дату в элементе управления всякий раз, когда вы нажимаете мышь. Если вы не можете найти его, отредактируйте свой вопрос и покажите нам свой код, чтобы мы могли вам помочь.

+0

Я добавил код из простой формы, которую я сделал, чтобы изолировать проблему. Дата не изменяется. – Mustafa

2

Никогда не используйте MessageBox в обработчике событий. Элементы управления часто получают очень путают, когда фокус дергается в одном из своих событий. Он продолжает прокручиваться так, потому что он использует таймер для непрерывной прокрутки, когда вы опираетесь на кнопку next/prev. Каждый таймер таймера прокручивает календарь снова. Этот таймер не отключается до тех пор, пока кнопка мыши не увеличится. Который он не может видеть, в окне сообщения появилось сообщение мыши, потому что оно захватило фокус. Это ошибка в встроенном контроле Windows, но это просто никогда не попадает в тест.

Использование Debug.WriteLine() или временного Console.WriteLine() полезно, вывод идет в окно вывода и не вмешивается в события управления.

Один из способов получить событие, выпущенное более одного раза, заключается в случайном подписании события более одного раза. В общем, вы не можете предположить, сколько событий вы получите, есть человек, щелкнув на нем. Убедитесь, что ваш код устойчив к этому.

Способ борьбы с этим поведением заключается в задержке обработки события до после, событие прекратилось. Элегантно сделано с Control.BeginInvoke(). Как это:

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) { 
     this.BeginInvoke(new DateRangeEventHandler(delayedChanged), sender, e); 
    } 
    private void delayedChanged(object sender, DateRangeEventArgs e) { 
     // etc.. 
    } 
+0

У меня есть тяжелый код, делающий много вещей в моем исходном коде. Я мог бы воссоздать проблему, просто вызвав MessageBox.Show(). Как я могу еще «сделать много вещей», вызванных в datechange на элементе управления MonthCalendar? – Mustafa

+0

@Mustafa - обходное решение. –

+0

С другой мыслью, не так уверен, что это исправит, оно все еще отталкивает фокус. Не уверен, эта ошибка была исправлена ​​в Vista, я не могу ее протестировать. –

Смежные вопросы