2010-12-30 12 views
1

Erlerntes googeln, kann aber nicht wirklich eine Antwort finden.Problem mit DateChanged-Ereignis auf MonthCalendar

Ein Windows-Formular mit einem MonthCalendar-Steuerelement und die Behandlung des DateChanged-Ereignisses. Das Problem hängt mit der Änderung des Monats per Mausklick zusammen.

Ich habe versucht, einen Zählerwert in einem Etikett angezeigt, die jedes Mal hoch gezählt wird, wenn der Event-Handler aufgerufen wird. Wenn der Monat geändert wird, wird der Event-Handler 2 Mal aufgerufen.

Wenn MessageBox.Show ("irgendetwas") bei der Ereignisbehandlung aufgerufen wird, scheint der Ereignishandler mehrmals abgerufen zu werden und der Kalender beginnt, sich für immer um einen Monat rückwärts zu ändern.

Weiß jemand warum?

folgender Code in dem Fenster Formularklasse Ergebnisse in dem beschriebenen Verhalten:

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(); 
} 

Antwort

3

nicht fangen alle DateChanged Ereignisse, aber eine Lösung ist DateChanged, KeyUp und MouseUp Ereignisse zu behandeln.

Das Ereignis DateChanged legt einen Bool IsDateChanged auf true fest. KeyUp und MouseUp Ereignisbehandlung überprüft, ob IsDateChanged und führt den erforderlichen Code + setzt IsDateChanged zu false.

0

ohne den Code zu sehen, ist es schwer, genau zu sagen, was das Problem ist, aber es ist wahrscheinlich, dass Sie eine Methode sind Aufruf zu Ändern Sie das Datum als Reaktion auf den Mausklick. Documentation for the DateChanged event sagt

Die DateChanged Ereignis während jedes Datum Auswahl, ob per Maus, Tastatur oder Code auftritt.

So das DateChanged Ereignis wird auftreten, wenn Sie mit der Maus klicken, um das Datum zu ändern. Wenn Ihr Code, der den Mausklick verarbeitet, auch das Datum ändert, wird DateChanged erneut auftreten.

Untersuchen Sie Ihren Code genau, um festzustellen, ob Sie etwas geschrieben haben, das das Datum im Steuerelement festlegt, wenn Sie mit der Maus klicken. Wenn Sie es nicht finden können, bearbeiten Sie Ihre Frage und zeigen Sie uns Ihren Code, damit wir Ihnen weiterhelfen können.

+0

Ich habe Code von einem einfachen Formular hinzugefügt, das ich gemacht habe, um das Problem zu isolieren. Das Datum wird nicht geändert. – Mustafa

2

Verwenden Sie nie MessageBox in einem Event-Handler. Kontrollen erhalten oft sehr verwirrt, wenn der Fokus in einem ihrer Ereignisse weggerissen wird. Es scrollt so weiter, weil es einen Timer verwendet, um kontinuierliches Scrollen zu ermöglichen, wenn Sie sich auf die nächste/vorherige Schaltfläche lehnen. Jeder Timer Tick scrollt den Kalender erneut. Dieser Timer wird erst deaktiviert, wenn die Maustaste losgelassen wird. Was er nicht sehen kann, hat die Message-Box die Mouse-Up-Nachricht bekommen, weil sie den Fokus packte. Es ist ein Fehler in der nativen Windows-Steuerung, aber das wird nie auf die Probe gestellt.

Die Verwendung von Debug.WriteLine() oder einer temporären Console.WriteLine() ist hilfreich, die Ausgabe geht in das Ausgabefenster und führt nicht zu Fehlern bei den Steuerungsereignissen.

Eine Möglichkeit, das Ereignis mehr als einmal ausgelöst zu bekommen, besteht darin, das Ereignis versehentlich mehrmals zu abonnieren. Im Allgemeinen kannst du nicht annehmen, wie viele Ereignisse du bekommst, da ist ein Mensch, der daran klickt. Stellen Sie sicher, dass Ihr Code dafür geeignet ist.

Eine Möglichkeit, um dieses Verhalten zu umgehen, ist es, die Behandlung des Ereignisses zu verzögern, bis nach das Ereignis nicht mehr ausgeführt wurde. Elegant gemacht mit Control.BeginInvoke(). Wie folgt aus:

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

Ich habe etwas schweren Code, der eine Menge Sachen in meinem ursprünglichen Code tut. Ich könnte das Problem neu erstellen, indem ich MessageBox.Show() aufruft. Wie kann ich sonst "viele Dinge" bei der Datumsänderung eines Monatskalender-Steuerelements auslösen? – Mustafa

+0

@Mustafa - Workaround veröffentlicht. –

+0

Auf den zweiten Gedanken, nicht so sicher, das wird es beheben, es immer noch den Fokus weg. Nicht sicher, dieser Fehler wurde in Vista behoben, ich kann es nicht testen. –