2010-03-26 10 views
6

Beim Entwickeln einer WinForms-Anwendung bin ich auf einen Fehler in den Steuerelementen OpenFileDialog und SaveFileDialog gestoßen. Bei einer Google-Suche wurde eine einzige Person gefunden, die das gleiche Problem bemerkt hat, aber weder eine Lösung noch eine Problemumgehung wurde bereitgestellt. Sie können diesen Thread anzeigen unter: http://bytes.com/topic/visual-basic-net/answers/389470-open-file-dialog-picturebox-click-event.FileDialog DoubleClick Verhalten

Ich habe ein benutzerdefiniertes Steuerelement in meinem Formular, das das MouseDown-Ereignis behandelt. Wenn ich eine Datei in einem FileDialog-Steuerelement doppelklicke, während sich die Maus über diesem Steuerelement befindet (mit dem Dialog zwischen ihnen offensichtlich), wird das MouseDown-Ereignis ausgelöst. Ich glaube nicht, dass dies ein Problem mit meiner Kontrolle ist, da die Person, die ich bereits erwähnt habe, dies mit einem PictureBox-Steuerelement bemerkt hat. Es scheint, dass, obwohl die Maustaste gedrückt wurde (für den zweiten Klick, um die Datei zu öffnen) während des Dialogfelds, das Ereignis an das Formular und mein Steuerelement übergeben wurde, wenn der Dialog geschlossen wurde.

Ich habe versucht, meine Kontrolle zu deaktivieren, während das Dialogfeld aktiv ist, aber das hat es nicht davon abgehalten, das Ereignis zu erfassen. Ich gehe davon aus, dass das Ereignis nach dem Schließen des Dialogfelds übergeben wird, sodass meine Kontrolle wieder aktiviert wird. Kennt jemand einen Weg, um zu verhindern, dass der Click das Formular und damit auch meine Kontrolle erreicht? Kann jemand bestätigen, wenn das wirklich ein Fehler in den FileDialog-Steuerelementen ist, oder wenn ich nur einige Einstellungen falsch konfiguriert habe?

Antwort

1

Ich experimentierte mit den MouseDown- und MouseMove-Ereignissen, als ich erkannte, warum mein Problem auftrat. Wenn das FileDialog-Feld verschwand, wurde das MouseMove-Ereignis ausgelöst. In einem (zugegebenermaßen albernen) Versuch, den gleichen Codeblock zweimal zu vermeiden, habe ich meinen MouseDown-Handler innerhalb des MouseMove-Handlers aufgerufen, wobei ich dachte, dass bestimmte Bedingungen (nämlich keine der beiden Maustasten gedrückt werden) den MouseDown-Handler effektiv machen würde nichts. Das Problem war, dass die Maustaste gedrückt wurde, weil das FileDialog-Feld auf MouseDown (nicht MouseClick) verschwindet. Dies führte dazu, dass der MouseDown-Handler seinen bedingten Code ausführte, als ich ihn nicht erwartet hatte.

Lektion, um daraus zu lernen: Seien Sie vorsichtig beim Verketten von Event-Handlern. Oder besser, ziehe die allgemeine Funktionalität in eine Methode und klettere KEINE Event-Handler. :-)

Danke an Jelly Amma, dass sie mir die Idee gegeben hat, die tatsächlichen Ereignisse genauer zu betrachten.

3

Ich habe von diesem Problem schon einmal gehört, und soweit ich weiß, geht es darum sicherzustellen, dass Sie die Ereigniswarteschlange richtig behandeln. Wenn Sie Ihren Code nicht sehen, ist es sehr schwierig zu überprüfen, ob die Implementierung der Benutzersteuerung korrekt ist, aber das Überschreiben der Mausereignisse, ohne dass die Basisereignisse auftreten, kann zu einem solchen Verhalten führen.

+0

Ich rufe base.OnMouseDown (e) aus meinem überschriebenen OnMouseDown (MouseEventArgs e) -Handler auf. Ich habe versucht, es sowohl vor (an der Spitze) als auch nach (unten) meinem Handler zu nennen, aber keine der beiden Positionen scheint irgendeine Auswirkung auf das Problem zu haben. Ich muss genauer in die Ereigniswarteschlange schauen und schauen, ob ich dort etwas finden kann. –