Проблема с событием DateChanged на MonthCalendar - PullRequest
1 голос
/ 30 декабря 2010

Пробовал поискать в Google, но не может найти ответ.

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

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

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

Кто-нибудь знает почему?

Следующий код в классе формы Windows приводит к описанному поведению:

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 ]

3 голосов
/ 11 января 2011

Не перехватывает ВСЕ DateChanged события, но решение заключается в обработке событий DateChanged, KeyUp и MouseUp.

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

2 голосов
/ 30 декабря 2010

Никогда не используйте MessageBox в обработчике событий.Органы управления часто путаются очень , когда фокусировка смещается в одном из их событий.Он продолжает прокручивать, как это, потому что он использует таймер, чтобы позволить непрерывную прокрутку, когда вы опираетесь на кнопку «следующий / предыдущий».Каждый таймер снова прокручивает календарь.Этот таймер не отключается, пока кнопка мыши не поднимется.Что он не может видеть, окно сообщения получило сообщение мыши, потому что оно захватило фокус.Это ошибка в родном элементе управления 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 голосов
/ 30 декабря 2010

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

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

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

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

...